performance - 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 很陌生。非常感谢任何有助于提高表现和养成良好习惯的帮助。问候。
解决方案
你是对的,“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
推荐阅读
- sql - 将一列分成几列
- ruby-on-rails - 什么文件在 ruby 服务器上运行所有内容?
- .net - 'ImageConverter' 无法将位图转换为字节数组。得到错误
- java - 如何检查一个单词是否以通用符号结尾和开头并将其替换为 1
- r - 将 3d 矩阵转换为数据框
- android - Android Studio 无法启动守护进程
- bash - bash shell reworking 变量用下划线替换点
- wordpress - 在 wordpress 上定义视口时,页脚搞砸了
- api - Dialogflow Fulfillment 中的 API 请求(Javascript)
- php - 如何在不同的行中插入来自 for / foreach 的数据?