Подзапрос «Оптимальное преимущество SQL» - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь оптимизировать SQL-запрос для базы данных Advantage 11.Короче говоря, я пытаюсь построить запрос, чтобы вычислить общее количество шагов в производственной последовательности и количество выполненных шагов.Система поддерживает несколько «выпусков» для каждого задания и несколько сборочных узлов для каждого выпуска.Есть несколько таблиц, которые содержат различные значения, необходимые для запроса.У меня есть запрос, который работает, но это медленный путь для программного использования.Используемые таблицы базы данных:

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 (для основных выпусков) или pnlrel.P-RELEASED-FLAG = Y (для подузлов).Я объединил два запроса вместе, чтобы охватить оба эти критерия, поскольку выпуск будет либо в таблице выпуска ИЛИ 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   

Обратите внимание, чтоABC-0100-002 и ABC-0100-001P1 исключены, потому что их GATE ID = "SK".

Буду очень признателен за советы о том, как повысить производительность этого запроса!

1 Ответ

0 голосов
/ 07 марта 2019

Одной из распространенных проблем с медленно выполняющимися запросами является отсутствие индекса для оптимизации. Ленивое решение состоит в том, чтобы убедиться, что каждый столбец, используемый в объединениях, покрыт индексом. В качестве альтернативы, используйте план выполнения в Advantage Data Architect, чтобы увидеть потенциальную причину проблемы и предлагаемые решения.

...