【发布时间】:2019-05-19 08:37:18
【问题描述】:
这篇文章的目的是提高以下查询的性能。
该查询实质上编译了一个包含多个数据源中出现的所有唯一 [Asset] 的列表,并将其附加到另一个表中。
请参阅下面的示例表
[Import - Assets] Asset Description Type Unit
P1 Water Pump U1
P2 Oil Mix U2
[Import - BOM] Asset Comp Description Qty
P1 10 X 1
P1 11 Y 1
M1 20 Z 1
[Import - WO] WO Asset Description Cost
1 P2 x 10
2 P2 y 20
3 M2 z 22
[Desired Output] Asset Description Type Unit
P1 Water Pump U1
P2 Oil Mix U2
M1
M2
此查询和其他具有类似功能的查询运行速度极慢。我相信性能问题是在 WHERE 部分进行大量检查的结果(每个表可以有超过 10k 条记录)。
可能是“导入”表具有未通过 UNION 函数删除的重复 [Asset] 记录,因为它们在其他字段中并不相同。由于我的怀疑,我想先删除每个表中重复的 [Asset],然后再将其与其他表进行检查。例如,只检查 BOM 的记录 1 和 3 与 WO 的记录 1 和 3,而不是 all to all。
INSERT INTO [Data - Assets]
SELECT *
FROM (
SELECT "Assets" AS [Source], *
FROM [Import - Assets]
UNION
SELECT "BOM", [Asset], NULL, NULL, NULL, NULL, NULL, NULL
FROM [Import - BOM]
WHERE [Asset] NOT IN (SELECT DISTINCT [Asset] FROM [Import - Assets])
UNION SELECT "WO", [Asset], NULL, NULL, NULL, NULL, NULL, NULL
FROM [Import - WO]
WHERE [Asset] NOT IN (SELECT DISTINCT [Asset] FROM [Import - Assets])
AND [Asset] NOT IN (SELECT DISTINCT [Asset] FROM [Import - BOM])
ORDER BY [Source], [Asset]
) ;
需要注意的是,除了最初的 [Import - Assets] 表之外,附加记录的来源并不特别重要。
我对 SQL 很陌生。非常感谢任何有助于提高表现和养成良好习惯的帮助。问候。
【问题讨论】:
-
尝试以下更改 1) 更改为 union all 2) 将 where 子句更改为 left join b on .. where b is null 3) 删除顺序 4) 删除选择 * 你包装查询与
-
你能详细说明2吗?
标签: performance tsql ms-access