请教一个无从下手的问题,我是菜鸟

[复制链接]
查看11 | 回复6 | 2006-9-1 20:36:36 | 显示全部楼层 |阅读模式
今天有人说MS SQL慢,但是我都不知道应该怎么下手,ORACLE中可以看TOP,但是SQLSERVER中应该看什么呢?
回复

使用道具 举报

千问 | 2006-9-1 20:36:36 | 显示全部楼层
可以从SQL服务器上的---管理---当前活动 看相关的连接、进程信息。也可以通过事件探察器可以查相关的表更新情况。还可以借助第3方软件来查看相关的SQL服务器连接、进程信息。
回复

使用道具 举报

千问 | 2006-9-1 20:36:36 | 显示全部楼层
解决问题先得有思路,最后才是技术。
回复

使用道具 举报

千问 | 2006-9-1 20:36:36 | 显示全部楼层
怎么个慢法,运行什么慢了?
回复

使用道具 举报

千问 | 2006-9-1 20:36:36 | 显示全部楼层
最初由 foreverleee 发布
[B]今天有人说MS SQL慢,但是我都不知道应该怎么下手,ORACLE中可以看TOP,但是SQLSERVER中应该看什么呢? [/B]


SQL慢是有很多原因造成的:
第一:有可能是某张重要表的索引问题引起的,这时需要重建索引!
第二:由于硬盘空间不足(这种情况一般会出现网络写入超时的提示)
第三:由于新加入的程序设计上的缺陷导致查询进入死循环
第四:网络上出现严重掉包情况
第五:由于阻塞,给你个语句查询阻塞
--判断阻挡进程
drop table #yeqx
drop table #yeqx1
selectspid,

ecid,

status,
loginame=rtrim(loginame),

hostname,

blk=convert(char(5),blocked),

dbname = case

when dbid = 0 then null

when dbid0 then db_name(dbid)

end

,cmd
into #yeqx frommaster.dbo.sysprocesses
where blocked0
order by blocked
selectspid,

ecid,

status,
loginame=rtrim(loginame),

hostname,

blk=convert(char(5),blocked),

dbname = case

when dbid = 0 then null

when dbid0 then db_name(dbid)

end

,cmd
into #yeqx1 frommaster.dbo.sysprocesses
order by blocked

--SELECTA.SPID FROM
--(SELECTSPID,BLK FROM #YEQX) A,
--(SELECTBLK AS SPID,SPID AS BLK FROM #YEQX) B
--WHERE A.SPID=B.SPID AND A.BLK=B.BLK
select * from #yeqx1 where blk 0
select A.SPID as 被阻塞进程,a.CMD AS 正在执行的操作,A.BLK AS 阻塞进程号,b.cmd AS 阻塞进程正在执行的操作
from #yeqx a,#yeqx1 b
where a.blk NOT in(select spidfrom #yeqx) and a.blk *= b.spid
回复

使用道具 举报

千问 | 2006-9-1 20:36:36 | 显示全部楼层
在ORACLE中如果慢的话,我可以看TOP,通过TOP来查询到底是哪个语句消耗的资源最多,但是在MSSQL中我应该怎么办呢?
回复

使用道具 举报

千问 | 2006-9-1 20:36:36 | 显示全部楼层
最初由 foreverleee 发布
[B]  在ORACLE中如果慢的话,我可以看TOP,通过TOP来查询到底是哪个语句消耗的资源最多,但是在MSSQL中我应该怎么办呢? [/B]


SQL中也很简单:
exec sp_who2 --就这样就行了!
如果要看全面点,我给你翻译成了中文标题,你看看(我晕,怎么搞的,老是有\\东东产生?我没输\\符号)
use master
go
declare @spid int,@bl int
DECLARE s_cur CURSOR FOR
select0 ,blocked
from (select * from sysprocesses whereblocked>0 ) a
where not exists(select * from (select * from sysprocesses whereblocked>0 ) b
where a.blocked=spid)
union select spid,blocked from sysprocesses whereblocked>0
OPEN s_cur
FETCH NEXT FROM s_cur INTO @spid,@bl
WHILE @@FETCH_STATUS = 0
begin
if @spid =0

select \\\' 引起数据库死锁的是 : \\\'+ CAST(@bl AS VARCHAR(10)) + \\\' 进程号 , 其执行的 SQL 语法如下 \\\'
else

select \\\' 进程号 SPID : \\\'+ CAST(@spid AS VARCHAR(10))+ \\\' 被 \\\' + \\\' 进程号 SPID : \\\'+ CAST(@bl AS VARCHAR(10)) +\\\' 阻塞 , 其当前进程执行的 SQL 语法如下 \\\'
DBCC INPUTBUFFER (@bl )
FETCH NEXT FROM s_cur INTO @spid,@bl
end
CLOSE s_cur
DEALLOCATE s_cur
exec sp_who2
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行