最佳优势SQL子查询

时间:2019-03-05 21:28:24

标签: 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   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。

我非常感谢有关如何改善此查询性能的任何建议!

1 个答案:

答案 0 :(得分:0)

查询执行缓慢的常见问题之一是缺乏优化索引。惰性解决方案是确保连接中使用的每个列都被索引覆盖。另外,也可以使用Advantage Data Architect中的执行计划查看问题的潜在原因和建议的解决方案。