我正在处理一个需要根据用户输入进行过滤、排序和分页的查询。现在我正在测试一个非常慢的案例,在检查查询计划后,“排序”需要 96% 的时间。
数据模型实际上并没有那么复杂,以下查询应该足够清楚以了解正在发生的事情:
WITH OrderedRecords AS (
SELECT
A.Id
, A.col2
, ...
, B.Id
, B.col1
, ROW_NUMBER() OVER (ORDER BY B.col1 ASC) AS RowNumber
FROM A
LEFT JOIN B ON (B.SomeThing IS NULL) AND (A.BId = B.Id)
WHERE (A.col2 IN (...)) AND (B.Id IN (...))
)
SELECT
*
FROM OrderedRecords WHERE RowNumber Between x AND y
A 是一个包含大约 100k 条记录的表,但该字段将增长到数千万条,而 B 是具有 5 个项目的类别类型表(并且它永远不会增长到可能更多)。A.Id 和 B.Id 上有聚集索引。
性能真的很糟糕,我想知道是否有可能以某种方式解决这个问题。例如,如果排序在 A.Id 而不是 B.col1 上,那么一切都非常快。也许我可以优化 B.col1 是某种索引。
我已经尝试在字段本身上放置一个索引,但这没有帮助。可能是因为表 B 中不同项目的数量非常少(本身并与 A 相比)。
有任何想法吗?