为什么我的SELECT使用CTE突然非常慢,而CTE查询本身表现良好?

时间:2015-05-07 15:53:37

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

使用SQL Server 2008:我有def is_a_prime(n) for 2.upto(n) do |x| return false if n % x == 0 return true end end puts is_a_prime(4) 使用SELECT来获取数据页面。 CTE中的查询非常复杂 - 许多连接,联合,子查询 - 但它的使用方式非常简单:它只是使用CTE一次获取一页数据。 / p>

ROW_NUMBER()要求排序的列是可变的。

直到大约24小时前,这个查询工作正常。一夜之间,发生了一些事情,使查询花了50倍的时间。但是,只有当ROW_NUMBER()列不是其中一个连接表的主键时(可能是红色鲱鱼?)。

真正奇怪的是,ROW_NUMBER() ORDER BY本身的查询效果很好。只有当执行使用CTE的外部SELECT执行减速时才会这样做。

此查询非常慢(根据SSMS,2:30):

CTE

此查询速度很快(SSMS中的0:02以下。WITH items AS ( SELECT ROW_NUMBER() OVER (ORDER BY InventoryItems.mfg) as rownumber, [more columns...] FROM [tables, joins, subqueries] ) SELECT * FROM items WHERE rownumber BETWEEN 1 AND 100 ORDER BY rownumber 是该表的主键):

InventoryItems.item

而且,即使此查询返回更多行,它也很快(SSMS中为0:04):

WITH items AS 
( 
    SELECT 
       ROW_NUMBER() OVER (ORDER BY InventoryItems.item) AS rownumber,
       [more columns...] 
    FROM 
       [tables, joins, subqueries] 
) 
SELECT * 
FROM items 
WHERE rownumber BETWEEN 1 AND 100 
ORDER BY rownumber

为什么CTE本身会很快,而读取它的SELECT ROW_NUMBER() OVER (ORDER BY InventoryItems.mfg) as rownumber, [more columns...] FROM [tables, joins, subqueries] 是狗慢?

0 个答案:

没有答案