【发布时间】:2021-03-05 15:21:40
【问题描述】:
我们有三个环境,当我在其中两个环境中运行我的 SQL 查询时,只需要 30 或 38 秒即可运行,但在另一个环境中运行未完成,我应该取消它。查询基于两部分,一个 CTE 和一个非常简单的从表中选择,在 CTE 和选择中我都使用同一个表。
你能告诉我为什么需要这么长时间吗?如何改进查询?
ALTER VIEW [fact].[vPurchase]
AS
WITH VKPL AS
(
SELECT *
FROM
(SELECT
iv.[Delivery_FK],
1 AS column2,
ROW_NUMBER() OVER(PARTITION BY [Delivery_FK] ORDER BY iv.UpdateDate) AS rk
FROM
[fact].[KRMFact] iv
LEFT JOIN
[dimension].[Product] pr ON iv.Product_FK =pr.Product_SK
LEFT JOIN
[dimension].[Delivery] le ON le.Delivery_FK = iv.Delivery_FK
WHERE
pr.Product_Key = '740') X
WHERE
rk = 1
)
SELECT
-- .... here are some columns
Delivery_FK,
Product_FK,
CAST(column2 AS VARCHAR) AS column2,
f.[UpdateDate] AS [Update date]
FROM
[fact].[KRMFact] f
LEFT JOIN
VKPL v ON f.Delivery_FK = v.Delivery_FK
【问题讨论】:
-
检查您的执行计划和索引。此外,不同的环境具有不同的数据量,这会影响性能。
-
您对“pr”的外部连接被您在 where 子句中对 pr.Product_Key 的引用所破坏。外部连接到交付(“le”)但不引用任何列是奇怪的。在 cte 中使用整数常量 (1) 但强制转换为字符串也很奇怪 - 为什么不在 cte 中使用字符串常量(适当大小)?
-
“这里有一些列”告诉我这绝不是整个查询。而且您出于完全未知的原因进行了自我加入
标签: sql sql-server query-optimization common-table-expression