gpt4 book ai didi

sql-server - CTE中子查询的行为

转载 作者:行者123 更新时间:2023-12-03 13:02:44 25 4
gpt4 key购买 nike

平台 - SQL Server 2008 R2这是复杂存储过程的一部分,执行时间超过 5 分钟,我被要求帮助解决问题

;WITH FilteredOrders AS 
(
--CTE definition
),
PagedOrders AS
(
SELECT * FROM
(
SELECT ROW_NUMBER() OVER ( order by OrderNumber asc ) AS Row,
--Column List from FilteredOrders
FROM FilteredOrders
) AS NumberedOrders
WHERE NumberedOrders.Row BETWEEN 1 AND 500
)
SELECT * FROM PagedOrders

我在第二个CTE里去掉了子查询,推荐这个

;WITH FilteredOrders AS 
(
--CTE definition
)
SELECT ROW_NUMBER() OVER ( order by OrderNumber asc ) AS Row,
--Column List from FilteredOrders
INTO #PagedOrders
FROM FilteredOrders

SELECT *
FROM #PagedOrders
WHERE #PagedOrders.Row BETWEEN 1 AND 500

现在查询在 2 秒内执行。虽然我不愿意承认,但事实是我并不完全理解第二个查询带来的巨大性能提升。为什么我看到如此大的不同?

最佳答案

我相信 CTE 的查询在每次调用时都会被评估。这类似于 View 。但是,当您将数据插入哈希表时,它是一次性过程,避免了多次执行。

这与建议使用索引 View 的原因相同,因为数据实际上是物理存储的,而不是在运行时评估的。 CTE 和哈希表也会出现同样的情况。

出于同样的原因,在连接中也避免了 CTE,直到您确定 CTE 查询足够快不会影响性能。

关于sql-server - CTE中子查询的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21898341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com