Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

​Оптимизировать запрос?

503  
Murr патриот18.12.19 12:19
Murr
NEW 18.12.19 12:19 

Оптимизировать запрос?


Оракловский запрос требуется перекинуть на постгреескл...

В прямую - валится с ошибкой ERROR: 21000: more than one row returned by a subquery used as an expression

Исходный запрос:


SELECT

ap.AUF_NR orderNo,
ap.AUF_POS itemNo,
ast.ANZ qtyItem,
(SELECT
SUM(ast.LIEFER_OFFEN)
FROM liorder.AUF_STAT WHERE
AUF_NR=ast.AUF_NR AND
AUF_POS=ast.AUF_POS AND
VARIANTE=ast.VARIANTE) as "qtyNotDelivered",
CASE
(SELECT COUNT(apk.AUF_NR)
FROM liorder.AUF_KOMP apk WHERE
apk.AUF_NR=ast.AUF_NR AND
apk.AUF_POS=ast.AUF_POS AND
apk.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 END
ELSE (SELECT COUNT(apk.AUF_NR)
FROM liorder.AUF_KOMP apk WHERE
apk.AUF_NR=ast.AUF_NR AND
apk.AUF_POS=ast.AUF_POS AND
apk.KOMP_ART_TYP=0)
END AS countComp
FROM liorder.AUF_POS ap, liorder.AUF_STAT ast WHERE
ap.AUF_NR=ast.AUF_NR AND
ap.AUF_POS=ast.AUF_POS AND
ap.VARIANTE=ast.VARIANTE AND
ast.HISTORY=0 AND
ap.AUF_NR= 1453195
GROUP 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_STAT
WHERE history = 0 AND auf_nr = 1453195
GROUP BY AUF_NR, AUF_POS, variante
)
,ComponentsCount AS (

SELECT
AUF_NR,
AUF_POS,
COUNT(AUF_NR) AS "ComponentsQty"
FROM liorder.auf_komp
WHERE komp_art_typ = 0 AND auf_nr = 1453195
GROUP BY AUF_NR, AUF_POS


)
SELECT QtyNotDelivered.*,
CASE "ComponentsQty"
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
END
ELSE "ComponentsQty"
END AS countComp
FROM QtyNotDelivered
INNER JOIN ComponentsCount
ON QtyNotDelivered.auf_nr = ComponentsCount.auf_nr
AND QtyNotDelivered.auf_pos = ComponentsCount.auf_pos
INNER JOIN liorder.AUF_POS ap
ON QtyNotDelivered.auf_nr = ap.auf_nr
AND QtyNotDelivered.auf_pos = ap.auf_pos



WHERE "qtyNotDelivered" <> 0
AND ap.auf_nr = 1453195

без фильтрации по auf_nr внутри

выделенных подзапросов дает два убийственных полных скана с агрегацией по большим >8.000.0000 строк таблицам. более 20 секунд.

Джойн - есть, фильтер - тоже, но - не понимает...


Есть какие хинты, чтобы не писать фильтрацию в каждом подзапросе?

#1 
Murr патриот19.12.19 12:34
Murr
19.12.19 12:34 
в ответ Murr 18.12.19 12:19

Закрыто .

Хинт - lateral.

#2