Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL子查询的最佳优势_Sql_Optimization_Subquery_Advantage Database Server - Fatal编程技术网

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

我正在尝试优化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
因此,对于“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