SQL子查询的最佳优势
我正在尝试优化Advantage 11数据库的SQL查询。简而言之,我试图构建一个查询来计算制造序列中的步骤总数和已完成的步骤数。系统支持每个作业的多个“版本”,以及每个版本的多个子部件。有几个表包含查询所需的各种值。我有一个可以工作的查询,但它是一个缓慢的方式,以编程使用。涉及的数据库表包括:SQL子查询的最佳优势,sql,optimization,subquery,advantage-database-server,Sql,Optimization,Subquery,Advantage Database Server,我正在尝试优化Advantage 11数据库的SQL查询。简而言之,我试图构建一个查询来计算制造序列中的步骤总数和已完成的步骤数。系统支持每个作业的多个“版本”,以及每个版本的多个子部件。有几个表包含查询所需的各种值。我有一个可以工作的查询,但它是一个缓慢的方式,以编程使用。涉及的数据库表包括: inproces (releases that are in process) H-JOB# HPROC-SEQ ABC-0100-001 101 ABC-0100-002 10
inproces (releases that are in process)
H-JOB# HPROC-SEQ
ABC-0100-001 101
ABC-0100-002 101
DEF-0100-001 205
ABC-0100-001P1 302
release (main release information, including release status)
R-JOB# R-TRACKING-NBR R-RELEASE-STATUS
ABC-0100 ABC-0100-001 Y
ABC-0100 ABC-0100-002 Y
DEF-0100 DEF-0100-001 Y
GHI-0100 GHI-0100-002 N
pnlrel (sub-assembly release information, including release status)
P-JOB-NBR P-TRACKING-NBR P-RELEASED-FLAG
ABC-0100 ABC-0100-001P01 Y
DEF-0100 DEF-0100-001P01 Y
GHI-0100 GHI-0100-002P01 N
travdet (process steps per job, per sequence)
Job-# Process-Sequence Gate ID
ABC-0100-001 101 IS
ABC-0100-001 101 DR
ABC-0100-001 101 PL
ABC-0100-001 101 SM
ABC-0100-001 101 GN
ABC-0100-001 103 IS
ABC-0100-001 103 DR
ABC-0100-001 103 PL
ABC-0100-001 103 SM
ABC-0100-002 101 IS
ABC-0100-002 101 DR
ABC-0100-002 101 PL
ABC-0100-002 101 SK
DEF-0100-001 205 AB
DEF-0100-001 205 CD
DEF-0100-001 205 EF
DEF-0100-001 205 GH
DEF-0100-001 205 IJ
DEF-0100-001 212 AB
DEF-0100-001 212 CD
DEF-0100-001 212 EF
DEF-0100-001 212 GH
DEF-0100-001 212 IJ
ABC-0100-001P1 302 QR
ABC-0100-001P1 302 ST
ABC-0100-001P1 302 UV
ABC-0100-001P1 302 WX
ABC-0100-001P1 302 YZ
ABC-0100-001P1 309 QR
ABC-0100-001P1 309 ST
ABC-0100-001P1 309 UV
ABC-0100-001P1 309 WX
ABC-0100-001P1 309 YZ
detail (process steps completed per release)
D-JOB# D-DEST
ABC-0100-001 IS
ABC-0100-001 DR
ABC-0100-001 PL
DEF-0100-001 AB
DEF-0100-001 CD
DEF-0100-001 EF
DEF-0100-001 GH
ABC-0100-001P1 QR
ABC-0100-001P1 ST
ABC-0100-001P1 UV
ABC-0100-001P1 WX
ABC-0100-001P1 SK
history (current process step)
S-JOB# S-GATE
ABC-0100-001 IJ
ABC-0100-002 SK
DEF-0100-001 GH
ABC-0100-001P1 SK
因此,对于“inproces”中的每个记录:
- 通过验证release.R-release-STATUS=Y(对于主版本)或pnlrelease.p-release-FLAG=Y(对于子组件),确定该版本是否已实际发布(且未取消)。我将两个查询合并在一起,以涵盖这两个标准,因为发布将在release或pnlrel表中,但不能同时在这两个表中
- 验证过程步骤“SK”,这将表明它已移至库存
- 最终,如果满足这些条件,我需要从travdet计算匹配过程序列中的过程步骤数,并从detail计算完成的过程步骤数
select inproces."H-JOB#" as job, count(distinct travdet."GATE ID") as ttl , count(distinct detail."D-DEST") as comp
from inproces
left join release on inproces."H-JOB#" = release."R-TRACKING-NBR"
left join travdet on release."R-JOB#" = travdet."JOB-#" and inproces."H-PROC-SEQ" = travdet."Process-Sequence"
left join detail on detail."D-JOB#" = inproces."H-JOB#" and detail."D-DEST" <> ''
left join history on inproces."H-JOB#" = history."S-JOB#" and history."S-GATE" <> 'SK'
where release."R-RELEASE-STATUS" = 'Y'
group by job
union
select inproces."H-JOB#" as job, count(distinct travdet."GATE ID")as ttl, count(distinct detail."D-DEST") as comp
from inproces
left join pnlrel on inproces."H-JOB#" = pnlrel."P-TRACKING-NBR"
left join travdet on pnlrel."P-JOB-NBR" = travdet."JOB-#" and inproces."H-PROC-SEQ" = travdet."Process-Sequence"
left join detail on detail."D-JOB#" = inproces."H-JOB#" and detail."D-DEST" <> ''
left join history on inproces."H-JOB#" = history."S-JOB#" and history."S-GATE" <> 'SK'
where pnlrel."P-RELEASED-FLAG" = 'Y'
group by job
注意,ABC-0100-002和ABC-0100-001P1被排除在外,因为它们的闸门ID=“SK”
如果您能就如何改进此查询的性能提供任何建议,我将不胜感激 执行缓慢的查询的常见问题之一是缺少用于优化的索引。惰性解决方案是确保联接中使用的每一列都由索引覆盖。或者,使用Advantage Data Architect中的执行计划查看问题的潜在原因和建议的解决方案。谢谢Alex W。我将检查索引并调查您提到的执行计划。
job ttl comp
ABC-0100-001 5 3
DEF-0100-001 10 4