比如在 PUTDT,AUTHORNAME列上建立了复合的索引,其中PUTDT为前导列
对于如下的三条语句:
SELECT PUTDT, AGE FROM USER_NEWS WHERE PUTDT > '2007-1-16'
SELECT PUTDT, AGE FROM USER_NEWS WHERE PUTDT>'2007-1-16'and AUTHORNAME='DAVID'
SELECT PUTDT, AGE FROM USER_NEWS WHERE AUTHORNAME='DAVID'
说明:
第一条语句速度最快,其次为第二条,第三条最慢。
第三条中索引是无效的。所以建立复合索引,要注意细节。
第二条中条件语句的顺序不影响性能,"查询优化器"来做优化工作
7)、如果COUTN(*)只用于获取行数,可以使用ROWSET COUNT 。
8)、检查SQL 语句性能的方法
A、打开"查询分析器",打开"查询"菜单,点击"显示查询计划",执行下面的语句
select title,price from titles where title_id in
(select title_id from sales where qty>30)
select title,price from titles where exists
(select * from sales where sales.title_id=titles.title_id and qty>30)
查看查询计划:
从套红的部分看,这两条语句性能是一样的,也验证了IN 和 EXISTS是等效的。
B、在各个select语句前加:declare @d datetime set @d=getdate() 并在select语句后加:select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())
可以知道SQL语句执行需要的毫秒数。
B、采用了以上的优化以后,发现数据库的进程占用的cup有所下降,但还是偏高。
请使用MS SQL事件探查器,跟踪MS SQL的请求
打开“事件探查器”,新建“跟踪"
1)、如果“事件探查器”中,有很多的RPC事件,并且执行sp_cursoropen sp_cursorfetch
Sp_cursorclose ,说明在使用ASP数据集对象时,使用的游标服务不合适。
请使用“客户端游标”,代码:RS.CursorLocation=3 其中RS为数据集对象,3表示客户端游标,不要使用adUseClient,有时会有问题。
2)、数据集对象的操作要注意的地方
RS.Open一般建议:
rs.open sql,conn,0,1 顺序遍历,不需要定位跳转,不需要添加删除更新操作,速度最快
rs.open sql,conn,1,3 遍历,可以进行更新操作,但不能进行定位跳转
rs.open sql,conn,2,3 可以进行所有操作,可以跳转
说明:第三个参数表示游标的类型,第四个参数表示锁类型
可以参考:http://www.cnblogs.com/David-weihw/archive/2007/01/10/616936.html
经过以上的优化,一般应该可以解决MS SQL进程占用cup过高的情况。如果还不行的话,就严重了,请重新设计数据库存储结构去吧。