首页 > 解决方案 > 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 条记录)。

可能是“导入”表具有未通过 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 很陌生。非常感谢任何有助于提高表现和养成良好习惯的帮助。问候。

标签: performancetsqlms-access

解决方案


你是对的,“NOT IN”正在扼杀你的查询。只需做一个完整的联合,然后将其设为子查询,以仅包含资产表中的额外值。

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

推荐阅读