MSSQL 中的慢速 CTE 子查询

Slow CTE Subquery in MSSQL

我有一个查询需要 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,它会在运行时不断增加。

怎么会这样?

我试图做的是比较执行计划,但它们是一样的(只看 "Cost: n%")

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

我还尝试了以下方法:

where RowNum > highNumber

很快!而

where RowNum > highNumber and RowNum < highNumber + 10

很慢。最后:

where RowNum < highNumber

非常慢(6 秒)。

更新

我最终将结果放在一个临时 table 中。然后进行过滤。好像这样很快。

为什么不使用 FETCH/OFFSET

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

您需要调整参数 XY