buffers áá»á¬áž áááºáá±á¬ááºáá¬ááá·áº áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáááááŒá¯áá«...
á¥ááá¬áá
áºáá¯á¡áá±ááŒáá·áº áá±ážáááºáá±á¬ query ááá¯á¡áá¯á¶ážááŒá¯á PostgreSQL ááŸá queries áá»á¬ážááᯠá¡áá±á¬ááºážáá¯á¶ážááŒá
áºá¡á±á¬ááºááŒá¯áá¯ááºááẠuniversal approach á¡áá»áá¯á·ááᯠááŒáá·áºááŒáá«á
áá¯á·á áááºážááá¯á·ááᯠáááºáá¯á¶ážáááºááŒá
áºá
á± ááá¯á¶ážá
áœá²áááºááŒá
áºá
á± ááá·áºá¡áá±á«áºááœáẠáá°áááºáá±á¬áºáááºáž áááºážááá¯á·á¡ááŒá±á¬ááºážááᯠáááá¬ážááá·áºáááºá
PG ááá±á¬ááºáááºááœá²áá¬ážááŸááºážá¡áá»áá¯á·ááœáẠá¡áá»áááºááá¬ážááœá²áá°ááẠááá¯ááá¯á
áááºáá»áá¬áááºááŸáá·áºá¡áá»áŸ á¡ááŒá±á¡áá±ááŒá±á¬ááºážáá²ááá¯ááºáá±á¬áºáááºáž 9.4/9.6 á¡ááœáẠáááºážááẠá€ááá°áá¬áá»á¬ážááŸáááá²á·ááá¯á· ááá·áºááŸááºážááŒá±á¡á¬ážááŒáá·áº áá°áá®áá«áááºá
á¡ááœááºááŸááºáááºáá±á¬ áá±á¬ááºážááá¯áá»ááºááᯠááá°ááŒáá«á áá¯á·á
SELECT
TRUE
FROM
"ÐПкÑЌеМÑ" d
INNER JOIN
"ÐПкÑЌеМÑРаÑÑОÑеМОе" doc_ex
USING("@ÐПкÑЌеМÑ")
INNER JOIN
"ТОпÐПкÑЌеМÑа" t_doc ON
t_doc."@ТОпÐПкÑЌеМÑа" = d."ТОпÐПкÑЌеМÑа"
WHERE
(d."ÐОÑП3" = 19091 or d."СПÑÑÑЎМОк" = 19091) AND
d."$ЧеÑМПвОк" IS NULL AND
d."УЎалеМ" IS NOT TRUE AND
doc_ex."СПÑÑПÑМОе"[1] IS TRUE AND
t_doc."ТОпÐПкÑЌеМÑа" = 'ÐлаМРабПÑ'
LIMIT 1;
ááá¬ážááŸáá·áº á¡ááœááºá¡áááºáá»á¬ážá¡ááŒá±á¬ááºážáááºáááºáá»á¬ážááŸáá·áº ááá¬ážáá»á¬ážá "áá¯ááŸá¬áž" á¡áááºáá»á¬ážááᯠááœá²ááŒá¬ážá
áœá¬ áááºáá¶ááá¯ááºáá±á¬áºáááºáž áááºážááẠá¡ááá¬ááá
á¹á
ááŒá
áºáááºá á¡ááŒá±á¬ááºážááŸá¬á
ááááºá¡á
á®á¡á
ááºááá¯ááŒáá·áºááŒáá«á
áá¯á·á
144ms ááŸáá·áº 53K ááŒá¬ážáá¶áá»á¬ážáá®ážáá«áž áá±áᬠ400MB áááºááá¯áá«áááºá áá»áœááºá¯ááºááá¯á·áá±á¬ááºážááá¯ááá·áºá¡áá»áááºá áááºážááá¯á·á¡á¬ážáá¯á¶ážááẠáááºááŸáºááœááºááŸááá±áá«áá ááá¯á·ááá¯ááºáá«á áá áºááºááŸáááºááá·áºá¡áá« á¡ááá»á¬ážá áœá¬ááŒá¬áááºááŒá áºáááºá
algorithm ááẠá¡áá±ážááŒá®ážáá¯á¶ážááŒá áºáááºá
áá±á¬ááºážááá¯ááŸá¯ááá¯ááºážááᯠáá
áºáááºážáááºážáá²á· á¡áá±á¬ááºážáá¯á¶ážááŒá
áºá¡á±á¬ááºáá¯ááºááá¯á·á á¡á²áá«á áá¬áá¯ááºááá·áºáááºááá¯áᬠá¡áááºáá¬ážáááºáá¬ážááááºá
ááá¯á¡áá»áááºááœááºá á€áá±á¬ááºážáá«ážááá±á¬ááºá¡ááŒááºáááºááœáẠáá±áá¬áá±á·á
áºáááºáá±á¬ááºáá¯á¶áááºáá±á¬ááºáá¯á¶ááᯠáá»ááºáá¬ážáá²á·áᬠáá»áœááºá¯ááºááá¯á·ááẠá¡áá±á¬áºáá±áž âá
á»á±ážáá±á«áááºâ ááᯠááá±á¬áá°ááá¯ááºááŒáá«á
áá¯á·á áá±á¬ááºážááá¯áá»ááºááᯠááŒááºáá±ážáá«á ááŸáá·áº/ááá¯á·ááá¯áẠáá»áœááºá¯ááºááá¯á·ááá¯á¡ááºáá±á¬á¡áá¬á¡áá»áá¯á·ááᯠá¡ááŒá±áá¶áá±á«áºááœáẠáá°ážáá±ážáá«á ááœáŸááºážááááºáž.
áá«ááŒá±á¬áá·áº áá±á¬ááºážááá¯áá»ááº
- á¡áááºážáá¯á¶áž á
á¬ááœááºá
á¬áááºážá¡áá»áá¯á·ááŸáááŒá±á¬ááºáž á
á
áºáá±ážáá«á
- áá»áœááºá¯ááºááá¯á·ááá¯á¡ááºáá±á¬á¡ááŒá±á¡áá±ááœááºá á¡áá»áá¯ážá¡á
á¬ážáá
áºáá¯ááŒá
áºáááºá
- á
á¬áá±ážáá° ááá¯á·ááá¯áẠáá»á±á¬áºááŒá±áá°ááẠáá»áœááºá¯ááºááá¯á·ááá¯á¡ááºáá±á¬ áááºáááºážááŒá
áºáááºá
Join + LIMIT á
ááá¬ážá¡áá»á¬ážá¡ááŒá¬ážááᯠáŠážá
áœá¬ááá·áºááœááºážáá¬ážááá·áº áá±á¬á·ááºáá²áá±ážáá¬ážáá°ááẠáááŒá¬ááááá¯áááᯠá
á¬áá±ážáááºááá¯ááá¯ááœááºáá°áááºá ááá¯á·áá±á¬áẠá€á¡á
á¯áá
áºáá¯áá¯á¶ážá០ááŸááºáááºážáá
áºáá¯áá¬áá»ááºáá±á¬á·áááºá áá«áá±ááá·áº developer á¡ááœáẠááá¯ááœááºáá¬á database á¡ááœáẠááá¯áááá±á¬ááºáááºááá¯á· áááá¯ááá¯áá«áá°ážá
áá«ááá¯á·ááá
á¹á
ááŸá¬ ááá¬áž á áá¯áá²ááŸááááºá áááºááá¯á¡áá»áá¯ážáááºáá±á¬ááºáá²...
"á á¬ááœááºá á¬áááºážá¡áá»áá¯ážá¡á á¬áž" ááá¬ážááŸáá·áºáá»áááºáááºááŸá¯ááᯠáŠážá áœá¬áááºááŸá¬ážááá¯ááºááŒáá«á áá¯á·á áá áºáá»áááºáááºážááœááºáá±áá¬áá±á·á áºááá¯ááŒá±á¬ááŒáá«á áá»áœááºá¯ááºááá¯á·á á¡áá»áá¯ážá¡á á¬ážááŸááºáááºážááẠáá°ážááŒá¬ážáááºá (áá«ááᯠáá«ááá¯á·áááá±ááá·áº á¡á á®á¡á ááºááœá²áá°á ááááá±ážáá°áž)á
WITH T AS (
SELECT
"@ТОпÐПкÑЌеМÑа"
FROM
"ТОпÐПкÑЌеМÑа"
WHERE
"ТОпÐПкÑЌеМÑа" = 'ÐлаМРабПÑ'
LIMIT 1
)
...
WHERE
d."ТОпÐПкÑЌеМÑа" = (TABLE T)
...
áá¯ááºáá²á·á ááá¬áž/CTE ááŸá¬ ááŸááºáááºážáá áºáá¯áá²á· ááœááºáááºáá áºáᯠáá«áááºáááºááá¯ááẠPG ááŸá¬ áá®á¡á á¬áž áá®ááá¯áá»áá¯áž áá±ážááá¯á·áá±á¬ááºááá«áááºá
d."ТОпÐПкÑЌеМÑа" = (SELECT "@ТОпÐПкÑЌеМÑа" FROM T LIMIT 1)
PostgreSQL áá±ážááœááºážáá»á¬ážááœáẠáá»ááºážááá¡áá²ááŒááºááŒááºážá
BitmapOr ááŸáá·áº áá°áá®áá¶
á¡áá»áá¯á·ááá
á¹á
áá»á¬ážááœááºá Bitmap Heap Scan ááẠáá»áœááºá¯ááºááá¯á·á¡ááœáẠáá»á¬ážá
áœá¬áá¯ááºáá»áááá·áºááẠ- á¥ááá¬á ááŸááºáááºážáá»á¬ážá
áœá¬ááẠááá¯á¡ááºáá±á¬á¡ááŒá±á¡áá±ááŸáá·áº ááá¯ááºáá®áá±á¬á¡áá« áá»áœááºá¯ááºááá¯á·áá¡ááŒá±á¡áá±ááœááºá ááá¯áá±á¬á· ááááºáá±á«á·á OR á¡ááŒá±á¡áá±ááẠBitmapOr ááá¯á·ááŒá±á¬ááºážááœá¬ážáááºá- á¡á
á®á¡á
á¥áºááœááºáá¯ááºáá±á¬ááºááŒááºážá
áá°áááºážááŒá¿áá¬ááᯠááŒááºááŒáá·áºáá¡á±á¬áẠ- áááºááá¯ááºáá²á· ááŸááºáááºážáá
áºáá¯ááᯠááŸá¬ááááºá áááºáá°áááᯠá¡ááŒá±á¡áá±áá»á¬ážá០- ááá¯ááá¯áááºááŸá¬á á¡ááŒá±á¡áá±ááŸá
áºáá¯áá¯á¶ážá¡á±á¬ááºááœáẠ59K ááŸááºáááºážá¡á¬ážáá¯á¶ážááá¯ááŸá¬ááœá±áááºáááá¯á¡ááºáá«á á¡ááŒá±á¡áá±áá
áºáá¯áááºážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááẠáááºážáááºážáá
áºáá¯ááŸááááºá áááááœáẠáá¬áá»áŸáááœá±á·áá±á¬á¡áá«á០áá¯áááááá¯á·ááœá¬ážáá«á. á¡á±á¬ááºáá±á¬áºááŒáá« áá®ááá¯ááºážááẠáá»áœááºá¯ááºááá¯á·ááᯠáá°áá®áá±ážáá«áááº-
(
SELECT
...
LIMIT 1
)
UNION ALL
(
SELECT
...
LIMIT 1
)
LIMIT 1
"ááŒááºá" ááá·áºáááºáá»áẠ1 ááẠááááá¯á¶ážááŸááºáááºážááᯠááœá±á·ááŸááá±á¬á¡áá« ááŸá¬ááœá±ááŸá¯ááŒá®ážáá¯á¶ážááŒá±á¬ááºáž áá±áá»á¬á á±áááºá áááááá±á¬ááºááœááºááœá±á·ááŸáááŒá®ážáá«áá áá¯áááááá±á¬ááºááá¯áá¯ááºáá±á¬ááºáááºááá¯ááºáá« (áááºáá±á¬á·á០ááááºáá°ážá áá±ážá á¬ážááŸá¯)á
"CASE á¡á±á¬ááºááœááºáááºáá²áá±á¬á¡ááŒá±á¡áá±áá»á¬ážááá¯áá¯á¶ážááœááºáá¬ážáááº"
áá°áááºážáá±ážááŒááºážááŸá¯ááœáẠá¡ááœááºá¡áááºáááŒá±ááá·áºá¡ááá¯ááºá¡ááá·áºáá
áºáá¯ááŸáááẠ- áááºá
ááºááá¬áž âDocumentExtensionâ ááŸáá·áº áááºáááºááá·áº á¡ááŒá±á¡áá±ááᯠá
á
áºáá±ážááŒááºážá ááá¹áá¬áá«á
ᬠáááœá²ááŒá¬ážáá² á¡ááŒá¬ážá¡ááŒá±á¡áá±áá»á¬áž (á¥ááá¬á ááâáá»ááºáá¬ážáááºâ ááẠáááŸááºáá«á) á€áá»áááºáááºááŸá¯ááᯠá¡ááŒá²áááºážáá¯ááºáá±á¬ááºááŒá®áž âá¡áááºážá¡ááŒá
áºáá»á¬ážááᯠáá¯ááºáá»á
ááááºáá»á¬ážâ áááºá áááºážááá¯á·ááᯠáá»á¬ážáá»á¬áž ááá¯á·ááá¯áẠáá»áŸá±á¬á·áá¯á¶ážááẠ- á€ááá¬ážá á¡ááœááºá¡á
á¬ážáá±á«áºááœáẠáá°áááºáááºá
ááá¯á·áá±á¬áº áááºááá¯ááºáᬠááŸááºáááºážááᯠááŸá¬ááœá±ááŒááºážááẠá¡ááŸááºáááẠááá¯á¡ááºááá·áºá¡áá«ááŸáᬠááẠáá±ážááŒááºážáá»ááºááᯠááŒááºáááºááá¯ááºáááº-
SELECT
...
FROM
"ÐПкÑЌеМÑ" d
WHERE
... /*index cond*/ AND
CASE
WHEN "$ЧеÑМПвОк" IS NULL AND "УЎалеМ" IS NOT TRUE THEN (
SELECT
"СПÑÑПÑМОе"[1] IS TRUE
FROM
"ÐПкÑЌеМÑРаÑÑОÑеМОе"
WHERE
"@ÐПкÑЌеМÑ" = d."@ÐПкÑЌеМÑ"
)
END
áá»áááºáá¬ážáá²á· á
á¬ážááœá²ááá± ááŒá®ážáá¬áá²á· áá»áœááºáá±á¬áºááá¯á·ááᯠáá±ážáááºá ááááºá¡ááœáẠá¡ááœááºáá
áºáá¯áá»áŸ áááá¯á¡ááºáá«áááá¯á·áá±á¬áẠáá»áœááºá¯ááºááá¯á·ááẠJOIN ááᯠáá±ážááœááºážááœá²áá
áºáá¯ááœáẠá¡ááŒá±á¡áá±áá
áºáá¯á¡ááŒá
ẠááŒá±á¬ááºážáá²ááẠá¡ááœáá·áºá¡áá±ážááŸááááºá
á¡ááœáŸááºážááŒá¯áá¬ážáá±á¬á¡ááœááºáá»á¬ážááᯠ"Case ááœááºážááááºáá»á¬ážá¡ááŒááºáááº" ááœááºáá¬ážáá²á·áá¬á ááŸááºáááºážááŸááá¯ážááŸááºážáá±á¬á¡ááŒá±á¡áá±áá»á¬ážááá¯ááááºááá¯á·ááá·áºá¡áá«ááœááºááá·áºáá« - ááá¯á¡áá»áááºááœáẠ"áá±ážáá¶áá±á¬" áá±ážááœááºážááá¯ááá¯ááá¯á·ááŒááºáááºážááá·áºá¡áá«ááŸáá¬áá¯ááºáá±á¬ááºáá«áááºá
áá»áœááºáá±á¬á·áºáá¬áááºá Total áá«
áá»áœááºá¯ááºááá¯á·ááẠá¡áááºáá±á¬áºááŒáá« á ááºááŒááºá¡á¬ážáá¯á¶ážááŒáá·áº áááŸááá¬áá±á¬áá±ážááœááºážááᯠá á¯áá±á¬ááºážáááº-
WITH T AS (
SELECT
"@ТОпÐПкÑЌеМÑа"
FROM
"ТОпÐПкÑЌеМÑа"
WHERE
"ТОпÐПкÑЌеМÑа" = 'ÐлаМРабПÑ'
)
(
SELECT
TRUE
FROM
"ÐПкÑЌеМÑ" d
WHERE
("ÐОÑП3", "ТОпÐПкÑЌеМÑа") = (19091, (TABLE T)) AND
CASE
WHEN "$ЧеÑМПвОк" IS NULL AND "УЎалеМ" IS NOT TRUE THEN (
SELECT
"СПÑÑПÑМОе"[1] IS TRUE
FROM
"ÐПкÑЌеМÑРаÑÑОÑеМОе"
WHERE
"@ÐПкÑЌеМÑ" = d."@ÐПкÑЌеМÑ"
)
END
LIMIT 1
)
UNION ALL
(
SELECT
TRUE
FROM
"ÐПкÑЌеМÑ" d
WHERE
("ТОпÐПкÑЌеМÑа", "СПÑÑÑЎМОк") = ((TABLE T), 19091) AND
CASE
WHEN "$ЧеÑМПвОк" IS NULL AND "УЎалеМ" IS NOT TRUE THEN (
SELECT
"СПÑÑПÑМОе"[1] IS TRUE
FROM
"ÐПкÑЌеМÑРаÑÑОÑеМОе"
WHERE
"@ÐПкÑЌеМÑ" = d."@ÐПкÑЌеМÑ"
)
END
LIMIT 1
)
LIMIT 1;
[ááá¯á·] á¡ááœáŸááºážáá»á¬ážááᯠáá»áááºááŸáááŒááºážá
UNION á¡ááœááºááœá²áá»á¬ážá¡ááœááºážááŸá á¡ááœáŸááºážááááºážá¡ááŒá±á¡áá±áá»á¬ážááẠá¡áááºážáááºááœá²ááŒá¬ážááŒá±á¬ááºáž áá±á·áá»áá·áºáááºááŒá¬ážáá¬ážáá±á¬áá»ááºáá¯á¶ážáá»á¬ážá áááááŒá¯ááááẠ- áááºážááŸá¬ áá»áœááºá¯ááºááá¯á·ááœáẠááá·áºáá»á±á¬áºáá±á¬á¡ááœáŸááºážáá»á¬áž ááá¬ážááŸáááŒá®ážáá¬ážááŒá
áºáá±á¬ááŒá±á¬áá·áºááŒá
áºáááºá áááºážááá¯á·áááŸááá²á·áá«áá áááºáá®ážááá»áá¯ážáááºáááá·áºáááº- á
á¬ááœááºá
á¬áááºáž (áá° áá á
á¬ááœááºá
á¬áááºážá¡áá»áá¯ážá¡á
á¬áž) О á
á¬ááœááºá
á¬áááºáž(á
á¬ááœááºá
á¬áááºážá¡áá»áá¯ážá¡á
á¬ážá áááºáááºáž).
ROW á¡ááŒá±á¡áá±áá»á¬ážááœáẠá¡ááœááºáá»á¬ážá á¡á
á®á¡á
á¥áºá¡ááŒá±á¬ááºážá¡á
á®á¡á
ááºáá±ážááœá²áá°áá¡ááŒááºááŸá áá±áá»á¬áááºááŸá¬áááºáá±ážááá¯ááºáááºá (Aá B) = (constAá constB)ááŸáá·áº (Bá A) = (constBá constA). áá«áá±ááá·áº ááŸááºáááºážáááºááá¯ááºáᬠá¡ááœáŸááºážááááºážááŸá á¡ááœááºáá»á¬ážá á¡á
á®á¡á
á¥áºá¡ááá¯ááºážááá¯ááá¯á·áá±á¬ áá±á¬ááºážááá¯áá»ááºááẠáá±á¬ááºááá¯ááºážááœáẠá¡ááŸá¬ážááŸá¬ááẠááá¯á¡áááºááŒá±áá«áááºá
á¡á
á®á¡á
ááºáá²ááŸá¬ áá¬áá«áá²á
áá¶ááá±á¬ááºážá
áœá¬ááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠáá¶ááá±á¬ááºážáá²á·áááŒáá·áº ááá UNION ááá±á¬ááºááœáẠáá¬áá»áŸáááœá±á·áá²á·áááŒáá·áº áá¯ááááá
áºáá¯ááᯠááœááºáá»ááºáá²ááŒá
áºáááºá áá«áá±á¬áẠ- áááºááẠ0.037ms ááŸáá·áº 11 ááŒá¬ážáá¶áá»á¬áž!
áá»áœááºá¯ááºááá¯á·ááẠáá±á¬ááºážááá¯áá»ááºááᯠá¡ááŸáááºááŒáŸáá·áºááŒá®áž ááŸááºáá¬ááºáá²ááœáẠáá±áá¬á
á¯ááºáá°ááŸá¯ááᯠáá»áŸá±á¬á·áá»ááá¯ááºáá«áááºá á¡ááŒáááºáá±á«ááºáž áá±á¬ááºáá±á«ááºážáá»á¬ážá
áœá¬ááá¯ážááŸááºážáá±á¬áááºážá
áá
áºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á áá±á¬áºáá®áá°ážááá·áºááŒááºážááŒáá·áº ááááºáá±á¬ááºážáá
áºáá¯á ð
source: www.habr.com