【发布时间】:2011-12-10 18:59:38
【问题描述】:
我不能在这里发布实际的查询,所以我发布查询的基本大纲就足够了。该查询用于分页并返回一组根据函数的输出排序的用户,例如 F。F 从用户表和其他连接的表中获取参数。查询如下所示
Select TOP (20)
from (select row_number OVER (Order By F desc) as rownum,
user.*, ..
from user
inner join X on user.blah = X.blah
left outer join Y on user.foo = Y.foo
where DATEDIFF(dd, LastLogin, GetDate()) > 200 and Y.bar > FUBAR) as temp
where rownum > 0
根据执行计划,91% 的成本在排序中。由于排序基于 F,我无法添加索引来加速排序。内部查询查询所有记录,过滤然后排序。现在大多数时候用户只查看 1 - 5 页中的结果(1 页有 20 条记录,因此是 Top(20))所以我在想是否有任何方法可以限制正在处理和排序的行并制作大多数时候,查询速度更快,CPU 密集度更低。
编辑:当我说计算 F 表已连接时,我的意思是这个。 F 接受 X.blah 和 Y.foo 和 Y.bar 等参数。就是这样。所有这些参数也需要作为结果集的一部分返回。例如用户最后位置的经纬度存储在X中。
【问题讨论】:
-
谢谢!我进行了编辑以澄清我的意思。
标签: sql sql-server sql-server-2005 tsql