ืืื ืืืื ืคืื ืึทืคึผืขืจืืืฉืึทื ื ืืืึธืก ืืจืขื ืืขื ืืึทืคืขืจื ...
ื ืืฆื ืึท ืงืืืื ืึธื ืคึฟืจืขื ืืื ืึท ืืืืฉืคึผืื, ืืึธืื ืืื ืื ืงืืง ืขืืืขืืข ืื ืืืืขืจืกืึทื ืึทืคึผืจืึธืืืฉืื ืฆื ืึธืคึผืืืืืืื ื ืคึฟืจืืื ืืื 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 ืืึทืคืขืจื - ืืึธืก ืืื, ืืขืจ ืืื 400 ืื ืคืื ืืึทืื! ืืื ืืืจ ืืืขืื ืืืื ืืึทืืืืืง ืืืื ืึทืืข ืคืื โโโโืืื ืืขื ืขื ืืื ืื ืงืึทืฉ ืืืจื ืื ืฆืืื ืคืื ืืื ืืืขืจ ืืงืฉื, ืึทื ืืขืจืฉ ืขืก ืืืขื ื ืขืืขื ืคืืืข ืืึธื ืืขืจ ืืืขื ืืืืขื ืขื ืคึฟืื ืืืกืง.
ืื ืึทืืืขืจืืืึทื ืืื ืืขืจืกื ืืืืืืืง!
ืืื ืกืืจ ืฆื ืขืคืขืก ืึทืคึผืืึทืืืื ืงืืื ืืงืฉื, ืืืจ ืืืื ืขืจืฉืืขืจ ืคึฟืึทืจืฉืืืื ืืืึธืก ืขืก ืืึธื ืืึธื.
ืืึธืืืจ ืืึธืื ืื ืึทื ืืืืืงืืื ื ืคืื ืื ืืึทืืึทืืืืก ืกืืจืืงืืืจ ืืื ืึทืจืืืก ืื ืคืึทืจื ืขื ืคืื ืืขื ืึทืจืืืงื ืคึฟืึทืจ ืืืฆื, ืืื ืฉืืืืขื ืึทื ืืืจ ืงืขื ืขื ืืขืคืืขืจืขื "ืืืืืง" ืจืืจืืื ืื ืืงืฉื ืืื / ืึธืืขืจ ืืขืื ืึทื ืื ืื ืืึทืืข ืขืืืขืืข ืคืื โโโโืื ืืื ืื ืืืึธืก ืืืจ ืืึทืจืคึฟื ืื ืืืกืขืก.
ืึทืืื ืื ืืงืฉื:
- ืืฉืขืงืก ืื ืขืงืืืกืืขื ืฅ ืคืื ืืืึท ืืื ืืกืืขืจ ืขืืืขืืข ืืึธืงืืืขื ื
- ืืื ืืขื ืฆืืฉืืึทื ื ืืืึธืก ืืืจ ืืึทืจืคึฟื ืืื ืคืื ืึท ืืืืขืจ ืืืคึผ
- ืืื ืืขืจ ืืืืจ ืึธืืขืจ ืคึผืขืจืคืึธืจืืขืจ ืืื ืืขืจ ืึธื ืืขืฉืืขืืืขืจ ืืืึธืก ืืืจ ืืึทืจืคึฟื
JOIN + ืืืืื 1
ืืึทื ืฅ ืึธืคื ืขืก ืืื ืืจืื ืืขืจ ืคึฟืึทืจ ืึท ืืขืืืขืืึธืคึผืขืจ ืฆื ืฉืจืืึทืื ืึท ืึธื ืคึฟืจืขื ืืื ืึท ืืจืืืก ื ืืืขืจ ืคืื ืืืฉื ืืขื ืขื ืขืจืฉืืขืจ ืืืื ืืขืฉืจืืื, ืืื ืืืืื ืืืื ืจืขืงืึธืจื ืืืืืื ืคืื ืืขื ืืึทื ืฅ ืืึทื ื. ืึธืืขืจ ืืจืื ืืขืจ ืคึฟืึทืจ ืื ืืขืืืขืืึธืคึผืขืจ ืืื ื ืืฉื ืืืื ืขื ืืขืจ ืขืคืขืงืืืื ืคึฟืึทืจ ืื ืืึทืืึทืืืืก.
ืืื ืืื ืืืขืจ ืคืึทื ืขืก ืืขื ืขื ืืขืืืขื ืืืืื 3 ืืืฉื - ืืื ืืืึธืก ืืื ืื ืืืืจืงืื ื ...
ืืื ืก ืขืจืฉืืขืจ ืืึทืงืืืขื ืืึทืคืจืืึทืขื ืคืื ืื ืงืฉืจ ืืื ืื "ืืึธืงืืืขื ื ืืืคึผ" ืืืฉ, ืืื ืืื ืืขืจ ืืขืืืืงืขืจ ืฆืืื ืืึธืื ืื ืืึทืืึทืืืืก ืึทื ืืื ืืืขืจ ืืืคึผ ืจืขืงืึธืจื ืืื ืืื ืฆืืง (ืืืจ ืืืืกื ืืขื, ืึธืืขืจ ืื ืกืงืขืืืฉืืืขืจ ืืื ืงืืื ืืขืืึทื ืง ื ืึธื):
WITH T AS (
SELECT
"@ะขะธะฟะะพะบัะผะตะฝัะฐ"
FROM
"ะขะธะฟะะพะบัะผะตะฝัะฐ"
WHERE
"ะขะธะฟะะพะบัะผะตะฝัะฐ" = 'ะะปะฐะฝะ ะฐะฑะพั'
LIMIT 1
)
...
WHERE
d."ะขะธะฟะะพะบัะผะตะฝัะฐ" = (TABLE T)
...
ืืึธ, ืืืื ืื ืืืฉ / CTE ืืืฉืืืื ืคืื ืึท ืืืื ืคืขืื ืคืื ืึท ืืืื ืจืขืงืึธืจื, ืืื PG ืืืจ ืงืขื ืขื ืืคืืื ืฉืจืืึทืื ืืื ืืึธืก, ืึทื ืฉืืึธื ืคืื
d."ะขะธะฟะะพะบัะผะตะฝัะฐ" = (SELECT "@ะขะธะฟะะพะบัะผะตะฝัะฐ" FROM T LIMIT 1)
ืคืืื ืืคืฉืืฆืื ื ืืื PostgreSQL ืคึฟืจืืื
ืืืืืึทืคึผืึธืจ ืืืก ืืื ืืึทื
ืืื ืขืืืขืืข ืงืึทืกืขืก, ืืืืืึทืคึผ ืืขืึทืคึผ ืกืงืึทื ืืืขื ืงืึธืกืื ืืื ืื ืึท ืคึผืืึทืฅ - ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืืื ืืื ืืืขืจ ืกืืืืึทืฆืืข, ืืืขื ืืึทื ืฅ ืึท ืคึผืืึทืฅ ืคืื ืจืขืงืึธืจืืก ืืจืขืคื ืื ืคืืจืืื ืื ืฆืืฉืืึทื ื. ืืืจ ืืึธืื ืขืก ืืืืึทื ืึธืืขืจ ืฆืืฉืืึทื ื ืคืืจืงืขืจื ืืื ืืืืืึทืคึผืึธืจ- ืึธืคึผืขืจืึทืฆืืข ืืื ืคึผืืึทื.
ืืื ืก ืฆืืจืืงืงืืืขื ืฆื ืืขืจ ืึธืจืืืื ืขื ืคึผืจืึธืืืขื - ืืืจ ืืึทืจืคึฟื ืฆื ืืขืคึฟืื ืขื ืึท ืจืขืงืึธืจื ืงืึธืจืึทืกืคึผืึทื ืืื ื ืืืขืจ ืขืก ืื ืคึฟืื ืื ืืืืื ืืื ืืขื - ืืึธืก ืืื, ืขืก ืืื ื ืื ืืึทืจืคึฟื ืฆื ืืืื ืคึฟืึทืจ ืึทืืข 59 ืง ืจืขืงืึธืจืืก ืืื ืืขืจ ืืืืืข ืืืืื ืืื ืืขื. ืขืก ืืื ืึท ืืืขื ืฆื ืึทืจืืขืื ืืืืก ืืืื ืฆืืฉืืึทื ื, ืืื ืืืื ืฆื ืื ืจืืข ื ืึธืจ ืืืขื ืืึธืจื ืืฉื ืืื ืืขืคืื ืขื ืืื ืืขืจ ืขืจืฉืืขืจ. ืื ืคืืืืขื ืืข ืคึผืืึทื ืืืขื ืืขืืคึฟื ืืื ืื:
(
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 ืืื ืึท ืฆืืฉืืึทื ื ืืืืฃ ืึท ืกืึทืืงืืืขืจื.
ืืึธืืืจ ืืึธืื ืื ืื ืืขืงืกื ืคืขืืืขืจ "ืึทืจืืืก ืื ืงืึทืกืข ืืจืึทืงืึทืฅ", ืืืืื ืคึผืฉืื ืื ืึธืื ืคืื ืื ืจืขืงืึธืจื ืฆื ืื ืืืขื ืืืึธืง - ืืื ืืืฆื ืื "ืฉืืืขืจ" ืึธื ืคึฟืจืขื ืืื ืขืงืกืึทืงืืืืึทื ืืืืื ืืืขื ืืืื ืคืืจืืื ืฆื 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 ืื ืึธืืืคืื ืื ืคึผืืึทื ื ืขืจ ืก ืคืื ื ืคืื ืืืื ืื ื, ืคืื ืงืืจืก, ืืืจ ืงืขื ืขื ืฉืจืืึทืื (ื, ื) = (ืงืึธื ืกืืึท, ืงืึธื ืกืื)ืืื (ื, ื) = (ืงืึธื ืกืื, ืงืึธื ืกืืึท). ืืืขืจ ืืืขื ืจืขืงืึธืจืืื ื ืืื ืื ืกืืจ ืคืื ืื ืคืขืืืขืจ ืืื ืื ืืื ืืขืงืก, ืึทืืึท ืึท ืืงืฉื ืืื ืคืฉืื ืืขืจ ืืึทืงืืืขื ืฆื ืืืืื ืฉืคึผืขืืขืจ.
ืืืึธืก ืืื ืืื ืื ืคึผืืึทื?
ืฆืื ืืึทืืืืขืจื, ืืืจ ืืึธืื ืฉืืืืึทืืืืืง ืืื ืืึธืจื ืืฉื ืืื ืืขืคืื ืขื ืืื ืืขืจ ืขืจืฉืืขืจ ืืื ืืึทื ืืืึธืง, ืึทืืื ืืขืจ ืฆืืืืืืขืจ ืืื ื ืึธื ืขืงืกืึทืงืืืืึทื. ืืืขืจ ืืคืืื ืึทืืื - ืืืืื 0.037ms ืืื 11 ืืึทืคืขืจื!
ืืืจ ืืึธืื ืกืคึผืืืึทื ืื ืืขืื ืืื ืจืืืืกื ืืึทืื ืคึผืึทืืคึผืื ื ืืื ืืึผืจืื ืขืืืขืืข ืืืืื ื ืืื, ื ืืฆื ืคืขืจืื ืคึผืฉืื ืืขืงื ืืงืก - ืึท ืืื ืจืขืืืืืึทื ืืื ืึท ืืืกื ืงืึธืคึผืืข-ืคึผืึทืคึผ. ๐
ืืงืืจ: www.habr.com