Access/SQL查询性能-基于多个数据源创建唯一列表



这篇文章的目的是提高以下查询的性能。

查询本质上编译了出现在多个数据源中的所有唯一[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条记录(。

可能的情况是,"Import"表有重复的[Asset]记录,这些记录不会通过UNION函数删除,因为它们在其他字段中不相同。由于我的怀疑,我想先删除每个表中重复的[资产],然后再将其与其他表进行核对。例如,只检查记录1&3对照记录1&3,而不是全部对全部。

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的新手。任何有助于提高表现和养成良好习惯的人都将不胜感激。当做

您是对的,"NOT IN"正在扼杀您的查询。只需执行一个完整的并集,然后使其成为一个子查询,只包含Asset表中的额外值。

SELECT x.Asset, MAX(x.Description) Description, MAX(x.Type) Type, MAX(x.Unit) Unit
FROM
(SELECT Asset, Description, Type, Unit FROM [Import - Assets]
UNION SELECT Asset, NULL Description, NULL Type, NULL Unit FROM [Import - BOM]
UNION SELECT Asset, NULL Description, NULL Type, NULL Unit FROM [Import - WO]) x
GROUP BY x.Asset

最新更新