แฃแคแ แแฎแแแแแ แแแแ แแชแแแแก, แ แแแแแแกแแช แแฃแคแแ แแแ แแแแฅแแ...
แแแแแแแแแ, แแชแแ แ แจแแแแแฎแแแก แแแแแงแแแแแแ, แแแแแ แแแแแแฎแแแแ 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;
แชแฎแ แแแแแแกแ แแ แแแแแแแก แกแแฎแแแแแแก แจแแกแแฎแแแแแแแแแกแ แแ แชแฎแ แแแแแแก "แ แฃแกแฃแแ" แกแแฎแแแแแ แจแแแซแแแแ แแแแกแฎแแแแแแฃแแแ แแแแแฎแแแแแแแแก, แแแแ แแ แแก แแแแแแแแแแก แกแแแแแฎแแ. แฒแแแขแแ แ แแ
แแแแแ แจแแแฎแแแแ แจแแแแแแ แแแแแแก:
144 ms แแ แแแแฅแแแก 53K แแฃแคแแ แ - แแแฃ 400 แแ-แแ แแแขแ แแแแแชแแแ! แแ แฉแแแ แแแแแแแแ แแแแแก, แแฃ แงแแแแ แแแแแแแ แแฅแแแแ แฅแแจแจแ แฉแแแแ แแแแฎแแแแแก แแแแแแขแแกแแแแก, แฌแแแแแฆแแแแ แจแแแแฎแแแแแจแ แแแกแแแแแ แฌแแแแแฎแแแกแแก แแแแ แฏแแ แแแขแ แแ แ แแแกแญแแ แแแแ.
แแแแแ แแแแ แงแแแแแแ แแแแจแแแแแแแแแแ!
แแแแแกแแแแ แ แแแแฎแแแแแก แแแขแแแแแแชแแแกแแแแก, แฏแแ แฃแแแ แแแกแแแแแ, แ แ แฃแแแ แแแแแแแแก.
แแแแแ แแแแขแแแแ แแแแ แแแแแชแแแแ แแแแแก แกแขแ แฃแฅแขแฃแ แแก แแแแแแแแ แแแ แแ แกแขแแขแแแก แคแแ แแแแแก แแแ แแ แแ แจแแแแแแฎแแแแ, แ แแ แจแแแแแซแแแ แจแแแแ แแแแ โแแแคแแโ แแแแแฌแแ แแ แแแแฎแแแแ แแ/แแ แแแแแแฎแแแแ แแแแแแ, แ แแช แแแญแแ แแแแ แแแแแฅแกแแแ.
แแกแ แ แแ แแฎแแแแ:
โ แแแแฌแแแแก แ แแแแ แแแแฃแแแแขแแก แแ แกแแแแแแก แแแแแช
- แแ แแแแแแแ แแแแแจแ, แ แแแแแแช แแแญแแ แแแแ แแ แแแ แแแแฃแแ แขแแแแก
- แกแแแแช แแแขแแ แ แแ แจแแแกแ แฃแแแแแแ แแก แแแแแแจแ แแแแแแ, แ แแแแแแช แแแญแแ แแแแ
แจแแฃแแ แแแ + แแแแแขแ 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 แฃแแ แฃแแแแแงแแคแก แซแแแแแก แแแกแ แฃแแแแแก แแแ แแแแ แฉแแแแฌแแ แแก แแฆแแแฉแแแแกแแแแแแ. แแ แแฃ แแก แฃแแแ แแแแแแแแ แแแ แแแ แแแแแจแ, แแแแ แ แแแแแ แแ แจแแกแ แฃแแแแแ (แแ แแกแแแแก แจแแกแ แฃแแแแฃแแ แแแแแ แแแแแจแ).
"แ แแฃแแ แแแ แแแแแแก แแแแแแแ แกแแฅแแแก แแแ แแแแแจแ"
แแแแแแแแ แแแ แจแแแแแฎแแแจแ แแ แแก แฃแแแแฃแ แแกแแ แแ แแกแแกแแแแแแแ แแแแแแขแ - แกแขแแขแฃแกแแก แจแแแแฌแแแแ แจแแกแแแแแแก แชแฎแ แแแแแ "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 แคแ แฉแฎแแแแแแก แแแ แแโ, แแแแแแแขแแ แแแ แขแแแ แแแ แแแแแ แฉแแแแฌแแ แแแแ 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