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