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;
您需要调整参数 X
和 Y
。
我有一个查询需要 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;
您需要调整参数 X
和 Y
。