MSSQL中缓慢的CTE子查询

时间:2017-08-23 11:17:13

标签: sql sql-server performance common-table-expression database-performance

我有一个查询,它占用我的SQL 2008 DB 1.4秒。然后我尝试使用这个模板做一个子查询:

;with __myResults as (
    ... my initial query ... already has a column:
    row_number() over (ORDER BY ...) as RowNum
)
select * from __myResults where RowNum between X and Y

如果我将X和Y设置为较低的数字,则表现良好。大约需要0.3秒。 如果我将X和Y设置为高数字,它的性能甚至比初始查询更差。如果我增加X和Y,它会在运行时不断增加。

这怎么可能?

我尝试做的是比较执行计划,但它们是相同的(只需查看"成本:n%")

我该如何调试?我在哪里可以看到问题所在?

我也尝试了以下内容:

where RowNum > highNumber

很快!而

where RowNum > highNumber and RowNum < highNumber + 10

很慢。最后:

where RowNum < highNumber

很慢(6秒)。

更新

我最终将结果放在临时表中。然后进行过滤。这似乎很快。

1 个答案:

答案 0 :(得分:0)

为什么不使用FETCH / OFFSET

select *
from __myResults 
order by ??
offset X - 1
fetch next (X - Y) rows only;

您需要调整参数XY