我正在尝试优化Advantage 11数据库的SQL查询。简而言之,我正在尝试建立一个查询来计算制造顺序中步骤的总数以及已完成的步骤数。系统支持每个作业多个“版本”和每个发行版多个子程序集。有几个表包含查询所需的各种值。我有一个有效的查询,但这是减慢编程用途的方法。涉及的数据库表是:
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
因此,对于“进行中”中的每个记录:
通过验证发布来确定发布是实际发布(而不是取消发布)。R-RELEASE-STATUS = Y(对于主发布)或pnlrel.P-RELEASED-FLAG = Y(对于子组件) 。我将两个查询合并在一起以涵盖这两个条件,因为发布将在发布OR pnlrel表中,但不在两个表中。
验证流程步骤“ SK”,这表明它已移至库存。
最终,如果满足这些资格条件,我需要从travdet计算匹配的过程序列中的过程步骤数,并从详细信息中计算完成的过程步骤数。
我正在使用的查询:
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
输出(用于示例表中的数据):
job ttl comp
ABC-0100-001 5 3
DEF-0100-001 10 4
请注意,由于GATE ID =“ SK”,因此排除了ABC-0100-002和ABC-0100-001P1。
我非常感谢有关如何改善此查询性能的任何建议!
答案 0 :(得分:0)
查询执行缓慢的常见问题之一是缺乏优化索引。惰性解决方案是确保连接中使用的每个列都被索引覆盖。另外,也可以使用Advantage Data Architect中的执行计划查看问题的潜在原因和建议的解决方案。