【发布时间】:2012-11-29 15:19:36
【问题描述】:
我有一张包含接近 3000 万 条记录的表格。只有几列。 'Born' 列之一的值不超过 30 个,并且上面定义了一个索引。我需要能够过滤该列并有效地翻阅结果。
现在我有(例如,如果我正在搜索的年份是“1970” - 它是我的存储过程中的一个参数):
WITH PersonSubset as
(
SELECT *, ROW_NUMBER() OVER (ORDER BY Born asc) AS Row
FROM Person WITH (INDEX(IX_Person_Born))
WHERE Born = '1970'
)
SELECT *, (SELECT count(*) FROM PersonSubset) AS TotalPeople
FROM PersonSubset
WHERE Row BETWEEN 0 AND 30
这种类型的每个查询(仅使用Born 参数)都会返回超过 100 万个结果。
我注意到最大的开销是用于返回总结果的计数。如果我从 select 子句中删除 (SELECT count(*) FROM PersonSubset) AS TotalPeople,整个过程会加快很多。
有没有办法加快该查询中的计数。我关心的是返回分页结果和总数。
【问题讨论】:
-
尝试在 CTE 中使用
COUNT(*) OVER(),而不是尝试在输出的每一行上运行子查询。 -
@AaronBertrand 我在我的系统上设置了 OP 的查询,它首先运行子查询(产生单行结果),然后嵌套循环连接(1 次执行)查询的其余部分。结果显示为具有“表‘人’。扫描计数 2”。我可以肯定地说,子查询没有在“每一行”上运行。
-
@DavidB 我没有说 会 是结果 - 我只是评论了他似乎在 试图 做的事情。
-
这种情况可能值得考虑索引视图,例如
SELECT Born, COUNT_BIG(*) FROM Person -
感谢您的建议。尝试了下面@t-clausen.dk 建议的COUNT OVER,但没有运气。还有什么我可以尝试的吗?
标签: sql sql-server performance