2016-06-07 3 views
0

У меня есть этот запрос:IBM DB2 SQL оптимизации запросов

select DBSAITE.MITEM, DBSAITE.MPDSC, DBSAITE.MUTMS, MVSACPE.COSTUN, PCSACST.CSTTYAPP, 
SUM(PCSACST.CSTBURD1 + PCSACST.CSTBURD2 + PCSACST.CSTLABOR + 
PCSACST.CSTMAT + PCSACST.CSTSETUP + PCSACST.CSTEXTRN) as COSTO_STD 
from MVSACPE, PCSACST, DBSAITE 
WHERE PCSACST.CSTCOSC = MVSACPE.CODSOC 
AND PCSACST.CSTITEM = MVSACPE.CODITM 
AND MVSACPE.CODITM = DBSAITE.MITEM 
AND DBSAITE.MCOSC = 'GRS' 
AND MVSACPE.CODSOC = 'GRS23' 
AND MVSACPE.DTPERI = '201512' 
AND MVSACPE.CODMAG = 'ALL' 
AND MVSACPE.CODCOS = 'MPR' 
AND PCSACST.CSTDATE = '20150630' 
AND PCSACST.CSTTYPE = 'SG' 
GROUP BY DBSAITE.MITEM, DBSAITE.MPDSC, DBSAITE.MUTMS, MVSACPE.COSTUN,PCSACST.CSTTYAPP 

я хотел бы, чтобы оптимизировать запрос некоторым образом, так как присоединиться работы с сотнями тысяч записей, и очень медленно (3 минуты).

Любые советы?

+0

Вы выбираете данные из объединенных таблиц в своем операторе 'SELECT' и группируете их также. Вы не можете использовать 'EXISTS', если вы собираетесь извлекать данные из этих таблиц. 'EXISTS' проверяет только, существуют ли они ... ну ... существуют. Он ничего не возвращает. – Siyual

+0

Возможно, вам захочется посмотреть, как индексируются эти таблицы. – Siyual

+0

Существует что? Пожалуйста, опишите –

ответ

1

Сначала перепишите запрос, используя явный синтаксис JOIN. Если ничего другого, то это облегчает просмотр, что делать:

select DBSAITE.MITEM, DBSAITE.MPDSC, DBSAITE.MUTMS, MVSACPE.COSTUN, PCSACST.CSTTYAPP, 
SUM(PCSACST.CSTBURD1 + PCSACST.CSTBURD2 + PCSACST.CSTLABOR + 
PCSACST.CSTMAT + PCSACST.CSTSETUP + PCSACST.CSTEXTRN) as COSTO_STD 
from MVSACPE JOIN 
    PCSACST 
    ON PCSACST.CSTCOSC = MVSACPE.CODSOC AND 
     PCSACST.CSTITEM = MVSACPE.CODITM JOIN 
    DBSAITE 
    ON MVSACPE.CODITM = DBSAITE.MITEM 
WHERE DBSAITE.MCOSC = 'GRS' AND 
     MVSACPE.CODSOC = 'GRS23' AND 
     MVSACPE.DTPERI = '201512' AND 
     MVSACPE.CODMAG = 'ALL' AND 
     MVSACPE.CODCOS = 'MPR' AND 
     PCSACST.CSTDATE = '20150630' AND 
     PCSACST.CSTTYPE = 'SG' 
GROUP BY DBSAITE.MITEM, DBSAITE.MPDSC, DBSAITE.MUTMS, MVSACPE.COSTUN,PCSACST.CSTTYAPP; 

Индексы, вероятно, помогут выполнить запрос. Неясно, какое из условий является наиболее избирательным. Отсутствие другой информации, хорошее место для начала:

- `MVSACPE(CODSOC, DTPERI, CODMAG, CODCOS, CODITM)` 
- `PCSACST(CSTCOSC, CSTITEM, CSTDATE, CSTTYPE)` 
- `DBSAITE(MITEM, MCOSC)` 
Смежные вопросы