使用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]
是狗慢?