PostgreSQL เจเจ‚เจŸเฉ€เจชเฉˆเจŸเจฐเจจ: เจนเจพเจจเฉ€เจ•เจพเจฐเจ• JOINs เจ…เจคเฉ‡ ORs

เจ“เจชเจฐเฉ‡เจธเจผเจจเจพเจ‚ เจคเฉ‹เจ‚ เจธเจพเจตเจงเจพเจจ เจฐเจนเฉ‹ เจœเฉ‹ เจฌเจซเจฐ เจฒเจฟเจ†เจ‰เจ‚เจฆเฉ‡ เจนเจจ...
เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ เจฆเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจ‡เฉฑเจ• เจ›เฉ‹เจŸเฉ€ เจœเจฟเจนเฉ€ เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจ†เจ“ 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;

เจธเจพเจฐเจฃเฉ€ เจ…เจคเฉ‡ เจ–เฉ‡เจคเจฐ เจฆเฉ‡ เจจเจพเจฎ เจฌเจพเจฐเฉ‡เจ–เฉ‡เจคเจพเจ‚ เจ…เจคเฉ‡ เจŸเฉ‡เจฌเจฒเจพเจ‚ เจฆเฉ‡ "เจฐเฉ‚เจธเฉ€" เจจเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจตเฉฑเจ–เจฐเฉ‡ เจขเฉฐเจ— เจจเจพเจฒ เจธเจฎเจเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจชเจฐ เจ‡เจน เจธเฉเจ†เจฆ เจฆเจพ เจฎเจพเจฎเจฒเจพ เจนเฉˆ. เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฆ เจ‡เฉฑเจฅเฉ‡ Tensor 'เจคเฉ‡ เจ‡เฉฑเจฅเฉ‡ เจ•เฉ‹เจˆ เจตเจฟเจฆเฉ‡เจธเจผเฉ€ เจกเจฟเจตเฉˆเจฒเจชเจฐ เจจเจนเฉ€เจ‚ เจนเจจ, เจ…เจคเฉ‡ PostgreSQL เจธเจพเจจเฉ‚เฉฐ เจนเจพเจ‡เจฐเฉ‹เจ—เจฒเจฟเจซเจธ เจตเจฟเฉฑเจš เจตเฉ€ เจจเจพเจฎ เจฆเฉ‡เจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, เจœเฉ‡เจ•เจฐ เจ‰เจน เจนเจตเจพเจฒเฉ‡ เจตเจฟเฉฑเจš เจจเฉฑเจฅเฉ€ เจนเฉˆ, เจซเจฟเจฐ เจ…เจธเฉ€เจ‚ เจ…เจธเจชเจธเจผเจŸ เจ…เจคเฉ‡ เจธเจชเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡ เจตเจธเจคเฉ‚เจ†เจ‚ เจจเฉ‚เฉฐ เจจเจพเจฎ เจฆเฉ‡เจฃเจพ เจชเจธเฉฐเจฆ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจคเจพเจ‚ เจœเฉ‹ เจ•เฉ‹เจˆ เจ…เฉฐเจคเจฐ เจจเจพ เจนเฉ‹เจตเฉ‡เฅค
เจ†เจ“ เจจเจคเฉ€เจœเจพ เจฏเฉ‹เจœเจจเจพ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจ:
PostgreSQL เจเจ‚เจŸเฉ€เจชเฉˆเจŸเจฐเจจ: เจนเจพเจจเฉ€เจ•เจพเจฐเจ• JOINs เจ…เจคเฉ‡ ORs
[explanation.tensor.ru 'เจคเฉ‡ เจฆเฉ‡เจ–เฉ‹]

144ms เจ…เจคเฉ‡ เจฒเจ—เจญเจ— 53K เจฌเจซเจฐ - เจฏเจพเจจเฉ€ 400MB เจคเฉ‹เจ‚ เจตเฉฑเจง เจกเจพเจŸเจพ! เจ…เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจ–เฉเจธเจผเจ•เจฟเจธเจฎเจค เจนเฉ‹เจตเจพเจ‚เจ—เฉ‡ เจœเฉ‡เจ•เจฐ เจ‰เจน เจธเจพเจฐเฉ‡ เจธเจพเจกเฉ€ เจฌเฉ‡เจจเจคเฉ€ เจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจคเฉฑเจ• เจ•เฉˆเจธเจผ เจตเจฟเฉฑเจš เจนเจจ, เจจเจนเฉ€เจ‚ เจคเจพเจ‚ เจกเจฟเจธเจ• เจคเฉ‹เจ‚ เจชเฉœเฉเจนเฉ‡ เจœเจพเจฃ 'เจคเฉ‡ เจ•เจˆ เจ—เฉเจฃเจพ เจœเจผเจฟเจ†เจฆเจพ เจธเจฎเจพเจ‚ เจฒเฉฑเจ—เฉ‡เจ—เจพเฅค

เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจธเจญ เจคเฉ‹เจ‚ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจนเฉˆ!

เจ•เจฟเจธเฉ‡ เจตเฉ€ เจฌเฉ‡เจจเจคเฉ€ เจจเฉ‚เฉฐ เจ•เจฟเจธเฉ‡ เจคเจฐเฉเจนเจพเจ‚ เจ…เจจเฉเจ•เฉ‚เจฒ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจชเจนเจฟเจฒเจพเจ‚ เจ‡เจน เจธเจฎเจเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เจธเจจเฉ‚เฉฐ เจ•เฉ€ เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค
เจ†เจ‰ เจนเฉเจฃเฉ‡ เจฒเจˆ เจ‡เจธ เจฒเฉ‡เจ– เจฆเฉ‡ เจฆเจพเจ‡เจฐเฉ‡ เจคเฉ‹เจ‚ เจฌเจพเจนเจฐ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจขเจพเจ‚เจšเฉ‡ เจฆเฉ‡ เจตเจฟเจ•เจพเจธ เจจเฉ‚เฉฐ เจ›เฉฑเจก เจฆเฉ‡เจˆเจ, เจ…เจคเฉ‡ เจธเจนเจฟเจฎเจค เจนเจพเจ‚ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจฎเฉเจ•เจพเจฌเจฒเจคเจจ "เจธเจธเจคเฉ‡" เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ เจฌเฉ‡เจจเจคเฉ€ เจจเฉ‚เฉฐ เจฎเฉเฉœ เจฒเจฟเจ–เฉ‹ เจ…เจคเฉ‡/เจœเจพเจ‚ เจ•เฉเจ เจšเฉ€เจœเจผเจพเจ‚ เจจเฉ‚เฉฐ เจฌเฉ‡เจธ เจ‰เฉฑเจคเฉ‡ เจฐเฉ‹เจฒ เจ•เจฐเฉ‹ เจœเจฟเจจเฉเจนเจพเจ‚ เจฆเฉ€ เจธเจพเจจเฉ‚เฉฐ เจฒเฉ‹เฉœ เจนเฉˆ เจธเฉ‚เจšเจ•เจพเจ‚เจ•.

เจ‡เจธ เจฒเจˆ เจฌเฉ‡เจจเจคเฉ€:
โ€” เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจ•เฉเจ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจฆเฉ€ เจฎเฉŒเจœเฉ‚เจฆเจ—เฉ€ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจฆเจพ เจนเฉˆ
- เจœเจฟเจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš เจธเจพเจจเฉ‚เฉฐ เจฒเฉ‹เฉœ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจ–เจพเจธ เจ•เจฟเจธเจฎ เจฆเฉ€
- เจœเจฟเฉฑเจฅเฉ‡ เจฒเฉ‡เจ–เจ• เจœเจพเจ‚ เจ•เจฒเจพเจ•เจพเจฐ เจ‰เจน เจ•เจฐเจฎเจšเจพเจฐเฉ€ เจนเฉˆ เจœเจฟเจธเจฆเฉ€ เจธเจพเจจเฉ‚เฉฐ เจฒเฉ‹เฉœ เจนเฉˆ

เจธเจผเจพเจฎเจฒ เจนเฉ‹เจตเฉ‹ + เจธเฉ€เจฎเจพ 1

เจ…เจ•เจธเจฐ เจ‡เฉฑเจ• เจกเจฟเจตเฉˆเจฒเจชเจฐ เจฒเจˆ เจ‡เฉฑเจ• เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› เจฒเจฟเจ–เจฃเจพ เจ†เจธเจพเจจ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจชเจนเจฟเจฒเจพเจ‚ เจตเฉฑเจกเฉ€ เจ—เจฟเจฃเจคเฉ€ เจตเจฟเฉฑเจš เจŸเฉ‡เจฌเจฒ เจœเฉเฉœ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ, เจ…เจคเฉ‡ เจซเจฟเจฐ เจ‡เจธ เจชเฉ‚เจฐเฉ‡ เจธเฉˆเฉฑเจŸ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจฐเจฟเจ•เจพเจฐเจก เจฐเจนเจฟเฉฐเจฆเจพ เจนเฉˆเฅค เจชเจฐ เจกเจฟเจตเฉˆเจฒเจชเจฐ เจฒเจˆ เจ†เจธเจพเจจ เจฆเจพ เจฎเจคเจฒเจฌ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจฒเจˆ เจตเจงเฉ‡เจฐเฉ‡ เจ•เฉเจธเจผเจฒ เจจเจนเฉ€เจ‚ เจนเฉˆ.
เจธเจพเจกเฉ‡ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš เจธเจฟเจฐเจซ 3 เจŸเฉ‡เจฌเจฒ เจธเจจ - เจ…เจคเฉ‡ เจ‡เจธเจฆเจพ เจ•เฉ€ เจชเฉเจฐเจญเจพเจต เจนเฉˆ ...

เจ†เจ“ เจชเจนเจฟเจฒเจพเจ‚ "เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจ•เจฟเจธเจฎ" เจŸเฉ‡เจฌเจฒ เจฆเฉ‡ เจจเจพเจฒ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจคเฉ‹เจ‚ เจ›เฉเจŸเจ•เจพเจฐเจพ เจชเจพเจˆเจ, เจ…เจคเฉ‡ เจ‰เจธเฉ‡ เจธเจฎเฉ‡เจ‚ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจจเฉ‚เฉฐ เจฆเฉฑเจธเฉ‹ เจ•เจฟ เจธเจพเจกเจพ เจŸเจพเจˆเจช เจฐเจฟเจ•เจพเจฐเจก เจตเจฟเจฒเฉฑเจ–เจฃ เจนเฉˆ (เจ…เจธเฉ€เจ‚ เจ‡เจน เจœเจพเจฃเจฆเฉ‡ เจนเจพเจ‚, เจชเจฐ เจธเจผเจกเจฟเจŠเจฒเจฐ เจจเฉ‚เฉฐ เจ…เจœเฉ‡ เจคเฉฑเจ• เจ•เฉ‹เจˆ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ):

WITH T AS (
  SELECT
    "@ะขะธะฟะ”ะพะบัƒะผะตะฝั‚ะฐ"
  FROM
    "ะขะธะฟะ”ะพะบัƒะผะตะฝั‚ะฐ"
  WHERE
    "ะขะธะฟะ”ะพะบัƒะผะตะฝั‚ะฐ" = 'ะŸะปะฐะฝะ ะฐะฑะพั‚'
  LIMIT 1
)
...
WHERE
  d."ะขะธะฟะ”ะพะบัƒะผะตะฝั‚ะฐ" = (TABLE T)
...

เจนเจพเจ‚, เจœเฉ‡เจ•เจฐ เจธเจพเจฐเจฃเฉ€/เจธเฉ€เจŸเฉ€เจˆ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจธเจฟเฉฐเจ—เจฒ เจฐเจฟเจ•เจพเจฐเจก เจฆเจพ เจ‡เฉฑเจ• เจ–เฉ‡เจคเจฐ เจธเจผเจพเจฎเจฒ เจนเฉˆ, เจคเจพเจ‚ เจชเฉ€เจœเฉ€ เจตเจฟเฉฑเจš เจคเฉเจธเฉ€เจ‚ เจ‡เจธ เจฆเฉ€ เจฌเจœเจพเจ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจตเฉ€ เจฒเจฟเจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹

d."ะขะธะฟะ”ะพะบัƒะผะตะฝั‚ะฐ" = (SELECT "@ะขะธะฟะ”ะพะบัƒะผะตะฝั‚ะฐ" FROM T LIMIT 1)

PostgreSQL เจธเจตเจพเจฒเจพเจ‚ เจตเจฟเฉฑเจš เจ†เจฒเจธเฉ€ เจฎเฉเจฒเจพเจ‚เจ•เจฃ

BitmapOr เจฌเจจเจพเจฎ UNION

เจ•เฉเจ เจฎเจพเจฎเจฒเจฟเจ†เจ‚ เจตเจฟเฉฑเจš, เจฌเจฟเจŸเจฎเฉˆเจช เจนเฉ€เจช เจธเจ•เฉˆเจจ เจธเจพเจกเฉ‡ เจฒเจˆ เจฌเจนเฉเจค เจ–เจฐเจš เจ•เจฐเฉ‡เจ—เจพ - เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจธเจพเจกเฉ€ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, เจœเจฆเฉ‹เจ‚ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจฐเจฟเจ•เจพเจฐเจก เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€ เจธเจผเจฐเจค เจจเฉ‚เฉฐ เจชเฉ‚เจฐเจพ เจ•เจฐเจฆเฉ‡ เจนเจจเฅค เจธเจพเจจเฉ‚เฉฐ เจ‡เจน เจฎเจฟเจฒเจฟเจ† เจ•เจฟเจ‰เจ‚เจ•เจฟ OR เจธเจผเจฐเจค BitmapOr เจตเจฟเฉฑเจš เจฌเจฆเจฒ เจ—เจˆ- เจฏเฉ‹เจœเจจเจพ เจตเจฟเฉฑเจš เจ•เจพเจฐเจตเจพเจˆ.
เจ†เจ‰ เจฎเฉ‚เจฒ เจธเจฎเฉฑเจธเจฟเจ† เจตเฉฑเจฒ เจตเจพเจชเจธ เจšเจฒเฉ€เจ - เจธเจพเจจเฉ‚เฉฐ เจ‡เจธ เจจเจพเจฒ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจฐเจฟเจ•เจพเจฐเจก เจฒเฉฑเจญเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจ•เฉ‹เจˆ เจตเฉ€ เจธเจผเจฐเจคเจพเจ‚ เจคเฉ‹เจ‚ - เจญเจพเจต, เจฆเฉ‹เจตเจพเจ‚ เจธเจผเจฐเจคเจพเจ‚ เจ…เจงเฉ€เจจ เจธเจพเจฐเฉ‡ 59K เจฐเจฟเจ•เจพเจฐเจกเจพเจ‚ เจฆเฉ€ เจ–เฉ‹เจœ เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจˆ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจ‡เฉฑเจ• เจธเจผเจฐเจค เจจเฉ‚เฉฐ เจฌเจพเจนเจฐ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฆเจพ เจ‡เฉฑเจ• เจคเจฐเฉ€เจ•เจพ เจนเฉˆ, เจ…เจคเฉ‡ เจฆเฉ‚เจœเฉ‡ เจ‰เฉฑเจคเฉ‡ เจ‰เจฆเฉ‹เจ‚ เจนเฉ€ เจœเจพเจ“ เจœเจฆเฉ‹เจ‚ เจชเจนเจฟเจฒเฉ€ เจตเจฟเฉฑเจš เจ•เฉเจ เจจเจนเฉ€เจ‚ เจฎเจฟเจฒเจฟเจ†. เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเจพ เจกเจฟเจœเจผเจพเจˆเจจ เจธเจพเจกเฉ€ เจฎเจฆเจฆ เจ•เจฐเฉ‡เจ—เจพ:

(
  SELECT
    ...
  LIMIT 1
)
UNION ALL
(
  SELECT
    ...
  LIMIT 1
)
LIMIT 1

"เจฌเจพเจนเจฐเฉ€" เจธเฉ€เจฎเจพ 1 เจ‡เจน เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจ•เจฟ เจ–เฉ‹เจœ เจ‰เจฆเฉ‹เจ‚ เจ–เจคเจฎ เจนเฉ‹ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจชเจนเจฟเจฒเจพ เจฐเจฟเจ•เจพเจฐเจก เจฎเจฟเจฒเจฆเจพ เจนเฉˆเฅค เจ…เจคเฉ‡ เจœเฉ‡เจ•เจฐ เจ‡เจน เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจชเจนเจฟเจฒเฉ‡ เจฌเจฒเจพเจ• เจตเจฟเฉฑเจš เจชเจพเจ‡เจ† เจ—เจฟเจ† เจนเฉˆ, เจคเจพเจ‚ เจฆเฉ‚เจœเฉ‡ เจฌเจฒเจพเจ• เจจเฉ‚เฉฐ เจšเจฒเจพเจ‡เจ† เจจเจนเฉ€เจ‚ เจœเจพเจตเฉ‡เจ—เจพ (เจ•เจฆเฉ‡ เจจเจนเฉ€เจ‚ เจšเจฒเจพเจ‡เจ† เจ—เจฟเจ† เจฆเฉ‡ เจธเจฌเฉฐเจง เจตเจฟเฉฑเจš).

"เจ•เฉ‡เจธ เจฆเฉ‡ เจคเจนเจฟเจค เจฎเฉเจธเจผเจ•เจฒ เจนเจพเจฒเจพเจคเจพเจ‚ เจจเฉ‚เฉฐ เจฒเฉเจ•เจพเจ‰เจฃเจพ"

เจ…เจธเจฒ เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฌเจนเฉเจค เจนเฉ€ เจ…เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจชเจฒ เจนเฉˆ - เจธเฉฐเจฌเฉฐเจงเจฟเจค เจŸเฉ‡เจฌเจฒ "เจกเฉŒเจ•เฉ‚เจฎเฉˆเจ‚เจŸ เจเจ•เจธเจŸเฉˆเจ‚เจธเจผเจจ" เจฆเฉ‡ เจตเจฟเจฐเฉเฉฑเจง เจธเจฅเจฟเจคเฉ€ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจเจพเฅค เจธเจฎเฉ€เจ•เจฐเจจ เจตเจฟเฉฑเจš เจนเฉ‹เจฐ เจธเจฅเจฟเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจธเฉฑเจšเจพเจˆ เจฆเฉ‡ เจฌเจพเจตเจœเฉ‚เจฆ (เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, d. "เจฎเจฟเจŸเจพเจ‡เจ† เจ—เจฟเจ†" เจธเฉฑเจš เจจเจนเฉ€เจ‚ เจนเฉˆ), เจ‡เจธ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจนเจฎเฉ‡เจธเจผเจพ เจšเจฒเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ "เจธเจฐเฉ‹เจค เจฆเฉ€ เจฒเจพเจ—เจค" เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค เจ‰เจนเจจเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจตเฉฑเจง เจœเจพเจ‚ เจ˜เฉฑเจŸ เจ–เจฐเจš เจ•เฉ€เจคเฉ‡ เจœเจพเจฃเจ—เฉ‡ - เจ‡เจธ เจธเจพเจฐเจฃเฉ€ เจฆเฉ‡ เจ†เจ•เจพเจฐ 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจ•เจฐเจฆเจพ เจนเฉˆเฅค
เจชเจฐ เจคเฉเจธเฉ€เจ‚ เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› เจจเฉ‚เฉฐ เจธเฉฐเจธเจผเฉ‹เจงเจฟเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจคเจพเจ‚ เจ•เจฟ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจฐเจฟเจ•เจพเจฐเจก เจฆเฉ€ เจ–เฉ‹เจœ เจ‰เจฆเฉ‹เจ‚ เจนเฉ€ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจ‡เจน เจ…เจธเจฒ เจตเจฟเฉฑเจš เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉ‹เจตเฉ‡:

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 เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจธเจผเจฐเจค เจตเจฟเฉฑเจš เจฌเจฆเจฒเจฃ เจฆเจพ เจฎเฉŒเจ•เจพ เจนเฉˆเฅค
เจšเจฒเฉ‹ เจ‡เฉฐเจกเฉˆเจ•เจธเจก เจ–เฉ‡เจคเจฐเจพเจ‚ เจจเฉ‚เฉฐ "เจ•เฉ‡เจธ เจฌเจฐเฉˆเจ•เจŸเจพเจ‚ เจฆเฉ‡ เจฌเจพเจนเจฐ" เจ›เฉฑเจก เจฆเฉ‡เจˆเจ, เจฐเจฟเจ•เจพเจฐเจก เจคเฉ‹เจ‚ 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). เจชเจฐ เจœเจฆเฉ‹เจ‚ เจฐเจฟเจ•เจพเจฐเจกเจฟเฉฐเจ— เจธเฉ‚เจšเจ•เจพเจ‚เจ• เจตเจฟเฉฑเจš เจ–เฉ‡เจคเจฐเจพเจ‚ เจฆเฉ‡ เจ•เฉเจฐเจฎ เจตเจฟเฉฑเจš, เจ…เจœเจฟเจนเฉ€ เจฌเฉ‡เจจเจคเฉ€ เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจกเฉ€เจฌเฉฑเจ— เจ•เจฐเจจ เจฒเจˆ เจตเจงเฉ‡เจฐเฉ‡ เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจนเฉˆเฅค
เจฏเฉ‹เจœเจจเจพ เจตเจฟเฉฑเจš เจ•เฉ€ เจนเฉˆ?
PostgreSQL เจเจ‚เจŸเฉ€เจชเฉˆเจŸเจฐเจจ: เจนเจพเจจเฉ€เจ•เจพเจฐเจ• JOINs เจ…เจคเฉ‡ ORs
[explanation.tensor.ru 'เจคเฉ‡ เจฆเฉ‡เจ–เฉ‹]

เจฌเจฆเจ•เจฟเจธเจฎเจคเฉ€ เจจเจพเจฒ, เจ…เจธเฉ€เจ‚ เจฌเจฆเจ•เจฟเจธเจฎเจค เจธเฉ€ เจ…เจคเฉ‡ เจชเจนเจฟเจฒเฉ‡ UNION เจฌเจฒเจพเจ• เจตเจฟเฉฑเจš เจ•เฉเจ เจตเฉ€ เจจเจนเฉ€เจ‚ เจฎเจฟเจฒเจฟเจ†, เจ‡เจธเจฒเจˆ เจฆเฉ‚เจœเฉ‡ เจจเฉ‚เฉฐ เจ…เจœเฉ‡ เจตเฉ€ เจšเจฒเจพเจ‡เจ† เจ—เจฟเจ† เจธเฉ€เฅค เจชเจฐ เจซเจฟเจฐ เจตเฉ€ - เจ•เฉ‡เจตเจฒ 0.037ms เจ…เจคเฉ‡ 11 เจฌเจซเจฐ!
เจ…เจธเฉ€เจ‚ เจฌเฉ‡เจจเจคเฉ€ เจจเฉ‚เฉฐ เจคเฉ‡เจœเจผ เจ•เฉ€เจคเจพ เจนเฉˆ เจ…เจคเฉ‡ เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจตเจฟเฉฑเจš เจกเจพเจŸเจพ เจชเฉฐเจชเจฟเฉฐเจ— เจจเฉ‚เฉฐ เจ˜เจŸเจพ เจฆเจฟเฉฑเจคเจพ เจนเฉˆ เจ•เจˆ เจนเจœเจผเจพเจฐ เจตเจพเจฐ, เจ•เจพเจซเจผเฉ€ เจธเจงเจพเจฐเจจ เจคเจ•เจจเฉ€เจ•เจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ - เจฅเฉ‹เฉœเฉเจนเฉ‡ เจœเจฟเจนเฉ‡ เจ•เจพเจชเฉ€-เจชเฉ‡เจธเจŸ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจตเจงเฉ€เจ† เจจเจคเฉ€เจœเจพ. ๐Ÿ™‚

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹