Вход на сайт
Оптимизировать запрос?
503
NEW 18.12.19 12:19
Оптимизировать запрос?
Оракловский запрос требуется перекинуть на постгреескл...
В прямую - валится с ошибкой ERROR: 21000: more than one row returned by a subquery used as an expression
Исходный запрос:
SELECTap.AUF_NR orderNo,ap.AUF_POS itemNo,ast.ANZ qtyItem,(SELECTSUM(ast.LIEFER_OFFEN)FROM liorder.AUF_STAT WHEREAUF_NR=ast.AUF_NR ANDAUF_POS=ast.AUF_POS ANDVARIANTE=ast.VARIANTE) as "qtyNotDelivered",CASE(SELECT COUNT(apk.AUF_NR)FROM liorder.AUF_KOMP apk WHEREapk.AUF_NR=ast.AUF_NR ANDapk.AUF_POS=ast.AUF_POS ANDapk.KOMP_ART_TYP=0)WHEN 0 THEN CASE CASE ap.GLAS3 WHEN 0 THEN 2 ELSE 3 END WHEN 2 THEN CASE ap.GLAS2 WHEN 0 THEN 1 ELSE 2 END ELSE 3 ENDELSE (SELECT COUNT(apk.AUF_NR)FROM liorder.AUF_KOMP apk WHEREapk.AUF_NR=ast.AUF_NR ANDapk.AUF_POS=ast.AUF_POS ANDapk.KOMP_ART_TYP=0)END AS countCompFROM liorder.AUF_POS ap, liorder.AUF_STAT ast WHEREap.AUF_NR=ast.AUF_NR ANDap.AUF_POS=ast.AUF_POS ANDap.VARIANTE=ast.VARIANTE ANDast.HISTORY=0 ANDap.AUF_NR= 1453195GROUP BY (ap.AUF_NR, ap.AUF_POS, ast.ANZ, ast.AUF_NR, ast.AUF_POS, ast.VARIANTE, ap.GLAS3, ap.GLAS2)
Переработанный под постргрее запрос:
WITH QtyNotDelivered AS (SELECT AUF_NR, AUF_POS, variante, SUM(LIEFER_OFFEN) AS "qtyNotDelivered"FROM liorder.AUF_STATWHERE history = 0 AND auf_nr = 1453195GROUP BY AUF_NR, AUF_POS, variante),ComponentsCount AS (SELECTAUF_NR,AUF_POS,COUNT(AUF_NR) AS "ComponentsQty"FROM liorder.auf_kompWHERE komp_art_typ = 0 AND auf_nr = 1453195GROUP BY AUF_NR, AUF_POS)SELECT QtyNotDelivered.*,CASE "ComponentsQty"WHEN 0 THENCASECASE ap.GLAS3WHEN 0 THEN 2ELSE 3ENDWHEN 2 THENCASE ap.GLAS2WHEN 0 THEN 1ELSE 2ENDELSE 3ENDELSE "ComponentsQty"END AS countCompFROM QtyNotDeliveredINNER JOIN ComponentsCountON QtyNotDelivered.auf_nr = ComponentsCount.auf_nrAND QtyNotDelivered.auf_pos = ComponentsCount.auf_posINNER JOIN liorder.AUF_POS apON QtyNotDelivered.auf_nr = ap.auf_nrAND QtyNotDelivered.auf_pos = ap.auf_posWHERE "qtyNotDelivered" <> 0AND ap.auf_nr = 1453195
без фильтрации по auf_nr внутри
выделенных подзапросов дает два убийственных полных скана с агрегацией по большим >8.000.0000 строк таблицам. более 20 секунд.
Джойн - есть, фильтер - тоже, но - не понимает...
Есть какие хинты, чтобы не писать фильтрацию в каждом подзапросе?