ΠΠΎΠΉΡΠ΅ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, buffers ΠΏΡΠΈΠ½ΠΎΡΡΡΠΈΡ
β¦
ΠΠ° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Ρ ΠΊ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π½Π° PostgreSQL. ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΈΠΌΠΈ ΠΈΠ»ΠΈ Π½Π΅Ρ β Π²ΡΠ±ΠΈΡΠ°ΡΡ Π²Π°ΠΌ, Π½ΠΎ Π·Π½Π°ΡΡ ΠΎ Π½ΠΈΡ
ΡΡΠΎΠΈΡ.
Π ΠΊΠ°ΠΊΠΈΡ
-ΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΡ
Π²Π΅ΡΡΠΈΡΡ
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 buffers β ΡΠΎ Π΅ΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ 400MB Π΄Π°Π½Π½ΡΡ ! Π Π½Π°ΠΌ ΠΏΠΎΠ²Π΅Π·Π΅Ρ, Π΅ΡΠ»ΠΈ Π²ΡΠ΅ ΠΎΠ½ΠΈ ΠΎΠΊΠ°ΠΆΡΡΡΡ Π² ΠΊΡΡΠ΅ ΠΊ ΠΌΠΎΠΌΠ΅Π½ΡΡ Π½Π°ΡΠ΅Π³ΠΎ Π·Π°ΠΏΡΠΎΡΠ°, ΠΈΠ½Π°ΡΠ΅ ΠΎΠ½ ΡΡΠ°Π½Π΅Ρ Π² ΡΠ°Π·Ρ Π΄ΠΎΠ»ΡΡΠ΅ ΠΏΡΠΈ Π²ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠΈ Ρ Π΄ΠΈΡΠΊΠ°.
ΠΠ»Π³ΠΎΡΠΈΡΠΌ Π²Π°ΠΆΠ½Π΅Π΅ Π²ΡΠ΅Π³ΠΎ!
Π§ΡΠΎΠ±Ρ ΠΊΠ°ΠΊ-ΡΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π»ΡΠ±ΠΎΠΉ Π·Π°ΠΏΡΠΎΡ, Π½Π°Π΄ΠΎ ΡΠ½Π°ΡΠ°Π»Π° ΠΏΠΎΠ½ΡΡΡ, ΡΡΠΎ ΠΆΠ΅ ΠΎΠ½ Π²ΠΎΠΎΠ±ΡΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π΅Π»Π°ΡΡ.
ΠΡΡΠ°Π²ΠΈΠΌ ΠΏΠΎΠΊΠ° Π·Π° ΡΠ°ΠΌΠΊΠ°ΠΌΠΈ ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ ΡΠ°ΠΌΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ ΠΠ, ΠΈ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌΡΡ, ΡΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Β«Π΄Π΅ΡΠ΅Π²ΠΎΒ» ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°ΡΡ Π·Π°ΠΏΡΠΎΡ ΠΈ/ΠΈΠ»ΠΈ Π½Π°ΠΊΠ°ΡΠΈΡΡ Π½Π° Π±Π°Π·Ρ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π½ΡΠΆΠ½ΡΠ΅ Π½Π°ΠΌ ΠΈΠ½Π΄Π΅ΠΊΡΡ.
ΠΡΠ°ΠΊ, Π·Π°ΠΏΡΠΎΡ:
β ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ
ΠΎΡΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΡΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°
β Π² Π½ΡΠΆΠ½ΠΎΠΌ Π½Π°ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°
β Π³Π΄Π΅ Π°Π²ΡΠΎΡΠΎΠΌ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π΅ΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½ΡΠΆΠ½ΡΠΉ Π½Π°ΠΌ ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊ
JOIN + LIMIT 1
ΠΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠ°ΡΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ ΠΏΡΠΎΡΠ΅ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π·Π°ΠΏΡΠΎΡ, Π³Π΄Π΅ ΡΠ½Π°ΡΠ°Π»Π° Π΄Π΅Π»Π°Π΅ΡΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΡΠ°Π±Π»ΠΈΡ, Π° ΠΏΠΎΡΠΎΠΌ ΠΈΠ· Π²ΡΠ΅Π³ΠΎ ΡΡΠΎΠ³ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΎΡΡΠ°Π΅ΡΡΡ ΠΎΠ΄Π½Π°-Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ Π·Π°ΠΏΠΈΡΡ. ΠΠΎ ΠΏΡΠΎΡΠ΅ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° β Π½Π΅ Π·Π½Π°ΡΠΈΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Π΅Π΅ Π΄Π»Ρ ΠΠ.
Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ°Π±Π»ΠΈΡ Π±ΡΠ»ΠΎ Π²ΡΠ΅Π³ΠΎ 3 β Π° ΠΊΠ°ΠΊΠΎΠΉ ΡΡΡΠ΅ΠΊΡβ¦
ΠΠ°Π²Π°ΠΉΡΠ΅ Π΄Π»Ρ Π½Π°ΡΠ°Π»Π° ΠΈΠ·Π±Π°Π²ΠΈΠΌΡΡ ΠΎΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Ρ ΡΠ°Π±Π»ΠΈΡΠ΅ΠΉ Β«Π’ΠΈΠΏΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°Β», Π° Π·Π°ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ΄ΡΠΊΠ°ΠΆΠ΅ΠΌ Π±Π°Π·Π΅, ΡΡΠΎ Ρ Π·Π°ΠΏΠΈΡΡ ΡΠΈΠΏΠ° Ρ Π½Π°Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½Π° (ΠΌΡ-ΡΠΎ ΡΡΠΎ Π·Π½Π°Π΅ΠΌ, Π° Π²ΠΎΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊ ΠΏΠΎΠΊΠ° Π½Π΅ Π΄ΠΎΠ³Π°Π΄ΡΠ²Π°Π΅ΡΡΡ):
WITH T AS (
SELECT
"@Π’ΠΈΠΏΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°"
FROM
"Π’ΠΈΠΏΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°"
WHERE
"Π’ΠΈΠΏΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°" = 'ΠΠ»Π°Π½Π Π°Π±ΠΎΡ'
LIMIT 1
)
...
WHERE
d."Π’ΠΈΠΏΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°" = (TABLE T)
...
ΠΠ°, Π΅ΡΠ»ΠΈ ΡΠ°Π±Π»ΠΈΡΠ°/CTE ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Ρ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΠΆΠ΅ Π·Π°ΠΏΠΈΡΠΈ, ΡΠΎ Π² PG ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΈΡΠ°ΡΡ Π΄Π°ΠΆΠ΅ ΡΠ°ΠΊ, Π²ΠΌΠ΅ΡΡΠΎ
d."Π’ΠΈΠΏΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°" = (SELECT "@Π’ΠΈΠΏΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°" FROM T LIMIT 1)
Β«ΠΠ΅Π½ΠΈΠ²ΡΠ΅Β» Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π² Π·Π°ΠΏΡΠΎΡΠ°Ρ PostgreSQL
BitmapOr vs UNION
Π Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
ΡΠ»ΡΡΠ°ΡΡ
Bitmap Heap Scan Π±ΡΠ΄Π΅Ρ ΡΡΠΎΠΈΡΡ Π½Π°ΠΌ ΠΎΡΠ΅Π½Ρ Π΄ΠΎΡΠΎΠ³ΠΎ β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² Π½Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΠΏΠΎΠ΄ΠΏΠ°Π΄Π°Π΅Ρ ΠΏΠΎΠ΄ ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΠ΅. ΠΠΎΠ»ΡΡΠΈΠ»ΠΈ ΠΌΡ Π΅Π³ΠΎ ΠΈΠ·-Π·Π° OR-ΡΡΠ»ΠΎΠ²ΠΈΡ, ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΠ²ΡΠ΅Π³ΠΎΡΡ Π² BitmapOr-ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π² ΠΏΠ»Π°Π½Π΅.
ΠΠ΅ΡΠ½Π΅ΠΌΡΡ ΠΊ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ β Π½Π°Π΄ΠΎ Π½Π°ΠΉΡΠΈ Π·Π°ΠΏΠΈΡΡ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ Π»ΡΠ±ΠΎΠΌΡ ΠΈΠ· ΡΡΠ»ΠΎΠ²ΠΈΠΉ β ΡΠΎ Π΅ΡΡΡ Π½Π΅Π·Π°ΡΠ΅ΠΌ ΠΈΡΠΊΠ°ΡΡ Π²ΡΠ΅ 59K Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΠΏΠΎ ΠΎΠ±ΠΎΠΈΠΌ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌ. ΠΡΡΡ ΡΠΏΠΎΡΠΎΠ± ΠΎΡΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΎΠ΄Π½ΠΎ ΡΡΠ»ΠΎΠ²ΠΈΠ΅, Π° ΠΊΠΎ Π²ΡΠΎΡΠΎΠΌΡ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ³Π΄Π° ΠΏΠΎ ΠΏΠ΅ΡΠ²ΠΎΠΌΡ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π½Π°ΡΠ»ΠΎΡΡ. ΠΠ°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΠΊΠ°Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ:
(
SELECT
...
LIMIT 1
)
UNION ALL
(
SELECT
...
LIMIT 1
)
LIMIT 1
Β«ΠΠ½Π΅ΡΠ½ΠΈΠΉΒ» LIMIT 1 Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ ΠΏΠΎΠΈΡΠΊ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ ΠΏΡΠΈ Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΆΠ΅ Π·Π°ΠΏΠΈΡΠΈ. Π Π΅ΡΠ»ΠΈ ΠΎΠ½Π° Π½Π°ΠΉΠ΄Π΅ΡΡΡ ΡΠΆΠ΅ Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ Π±Π»ΠΎΠΊΠ΅, Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡΡΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ (never executed Π² ΠΏΠ»Π°Π½Π΅).
Β«ΠΡΡΡΠ΅ΠΌ ΠΏΠΎΠ΄ CASEΒ» ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡ
Π ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΌ Π·Π°ΠΏΡΠΎΡΠ΅ Π΅ΡΡΡ ΠΊΡΠ°ΠΉΠ½Π΅ Π½Π΅ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ β ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΏΠΎ ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅ Β«ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅Β». ΠΠ΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΠΈΡΡΠΈΠ½Π½ΠΎΡΡΠΈ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ
ΡΡΠ»ΠΎΠ²ΠΈΠΉ Π² Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, d.Β«Π£Π΄Π°Π»Π΅Π½Β» IS NOT TRUE), ΡΡΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π²ΡΠ΅Π³Π΄Π° ΠΈ Β«ΡΡΠΎΠΈΡ ΡΠ΅ΡΡΡΡΠΎΠ²Β». ΠΠΎΠ»ΡΡΠ΅ ΠΈΠ»ΠΈ ΠΌΠ΅Π½ΡΡΠ΅ ΠΈΡ
Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡΡΠ°ΡΠ΅Π½ΠΎ β Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΎΠ±ΡΠ΅ΠΌΠ° ΡΡΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ.
ΠΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ Π·Π°ΠΏΡΠΎΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠΈΡΠΊ ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΠ» Π±Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ³Π΄Π° ΡΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ:
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, ΠΏΡΠΎΡΡΡΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡ ΠΎΡ Π·Π°ΠΏΠΈΡΠΈ Π²Π½ΠΎΡΠΈΠΌ Π² WHEN-Π±Π»ΠΎΠΊ β ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ Β«ΡΡΠΆΠ΅Π»ΡΠΉΒ» Π·Π°ΠΏΡΠΎΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄Π΅ Π² THEN.
ΠΠΎΡ ΡΠ°ΠΌΠΈΠ»ΠΈΡ Β«ΠΡΠΎΠ³ΠΎΒ»
Π‘ΠΎΠ±ΠΈΡΠ°Π΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠΉ Π·Π°ΠΏΡΠΎΡ ΡΠΎ Π²ΡΠ΅ΠΌΠΈ ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΌΠΈ Π²ΡΡΠ΅ ΠΌΠ΅Ρ Π°Π½ΠΈΠΊΠ°ΠΌΠΈ:
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 ΡΡΡΡ ΡΠ°Π·Π½ΡΡΡΡ β ΡΡΠΎ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ Ρ Π½Π°Ρ ΡΠΆΠ΅ Π΅ΡΡΡ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠΈΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ΅. Π Π΅ΡΠ»ΠΈ Π±Ρ ΠΈΡ
Π½Π΅ Π±ΡΠ»ΠΎ β ΡΠΎ ΡΡΠΎΠΈΠ»ΠΎ Π±Ρ ΡΠΎΠ·Π΄Π°ΡΡ: ΠΠΎΠΊΡΠΌΠ΅Π½Ρ(ΠΠΈΡΠΎ3, Π’ΠΈΠΏΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°) ΠΈ ΠΠΎΠΊΡΠΌΠ΅Π½Ρ(Π’ΠΈΠΏΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°, Π‘ΠΎΡΡΡΠ΄Π½ΠΈΠΊ).
ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΠΏΠΎΠ»Π΅ΠΉ Π² ROW-ΡΡΠ»ΠΎΠ²ΠΈΡΡ
Π‘ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΠ°, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΈ (A, B) = (constA, constB), ΠΈ (B, A) = (constB, constA). ΠΠΎ ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ Π² ΠΈΠ½Π΄Π΅ΠΊΡΠ΅, ΡΠ°ΠΊΠΎΠΉ Π·Π°ΠΏΡΠΎΡ ΠΏΡΠΎΡΡΠΎ ΡΠ΄ΠΎΠ±Π½Π΅Π΅ ΠΏΠΎΡΠΎΠΌ ΠΎΡΠ»Π°ΠΆΠΈΠ²Π°ΡΡ.
Π§ΡΠΎ Π² ΠΏΠ»Π°Π½Π΅?
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π½Π°ΠΌ Π½Π΅ ΠΏΠΎΠ²Π΅Π·Π»ΠΎ, ΠΈ Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ UNION-Π±Π»ΠΎΠΊΠ΅ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π½Π°ΡΠ»ΠΎΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΡΠΎΡΠΎΠΉ Π²ΡΠ΅-ΡΠ°ΠΊΠΈ ΠΏΠΎΡΠ΅Π» Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ΠΠΎ Π΄Π°ΠΆΠ΅ ΠΏΡΠΈ ΡΡΠΎΠΌ β Π²ΡΠ΅Π³ΠΎ 0.037ms ΠΈ 11 buffers!
ΠΡ ΡΡΠΊΠΎΡΠΈΠ»ΠΈ Π·Π°ΠΏΡΠΎΡ ΠΈ ΡΠΎΠΊΡΠ°ΡΠΈΠ»ΠΈ Β«ΠΏΡΠΎΠΊΠ°ΡΠΊΡΒ» Π΄Π°Π½Π½ΡΡ
Π² ΠΏΠ°ΠΌΡΡΠΈ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΡΡ ΡΠ°Π·, Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π²ΡΠΈΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΡΠΌΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠ°ΠΌΠΈ β Π½Π΅ΠΏΠ»ΠΎΡ
ΠΎΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΡΠΈ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΊΠΎΠΏΠΈΠΏΠ°ΡΡΠ΅. π
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com