【问题标题】:Access/SQL Query Performance - Creating a unique list based on multiple data sourcesAccess/SQL 查询性能 - 基于多个数据源创建唯一列表
【发布时间】: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


【解决方案1】:

你是对的,“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

【讨论】:

  • 每个字段名前应该有AS吗?
  • 作为可选关键字
猜你喜欢
  • 2016-09-15
  • 1970-01-01
  • 2011-03-10
  • 2019-05-15
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多