日期:2014-05-18  浏览次数:20525 次

请教关于set rowcount性能的问题
最近发现我们的系统在做一个查询时很慢,

后来通过SQLSERVER的事件跟踪发现这一语句要7-8分钟才返回结果,但把这语句拿到查询分析器里执行10秒内就能返回结果

最后发现是程序在这语句前执行了 set rowcount 100的操作

把这句加到查询分析器里一同运行,发现返回这100条数据也要7-8分钟了(结果应是8000多条记录,在一个3000多万条记录和另一个几千条记录的表中关联查询)


并发现一个问题就是如果查询条件(SQL语句不变,只是变量变一下)让返回结果只有很少的话,加不加set rowcount 都能很快返回结果


请问这个问题大家有没有见过,如何解决?

另:应系统程序是不能变的,所以只能从数据库上着手了

看到网上说SET ROWCOUNT和TOP N是有性能差别,但我这种从几秒到几分钟的别就太大了吧,通否通过INDEX优化来解决?(我对3000万记录的表做了查询时用到几个字段的INDEX,但没有效果,是否是我INDEX建得不对)

------解决方案--------------------
这个..不知道..ms好像推荐使用top N
------解决方案--------------------
用TOP N好些.
------解决方案--------------------
用top 100试过没有?


------解决方案--------------------
因为不加set rowcount 100可以很快返回,说明索引应该没问题
------解决方案--------------------
SET ROWCOUNT
使 Microsoft® SQL Server? 在返回指定的行数之后停止处理查询。 

设置 SET ROWCOUNT 选项将使大多数 Transact-SQL 语句在已受指定数目的行影响后停止处理。这包括触发器和 INSERT、UPDATE 及 DELETE 等数据修改语句。ROWCOUNT 选项对动态游标无效,但限制键集的行集和不感知游标。使用该选项时应谨慎,它主要与 SELECT 语句一起使用。


如果行数的值较小,则 SET ROWCOUNT 替代 SELECT 语句 TOP 关键字。

SET ROWCOUNT 的设置是在执行或运行时设置,而不是在分析时设置。


------解决方案--------------------
你不能改代码,索引看上去又没什么问题

这个问题怎么解决,你问我,我问谁去……

------解决方案--------------------
分页用ROWCOUNT。