PostgreSQL เด†เดจเตเดฑเดฟเดชเดพเดฑเตเดฑเต‡เดฃเตเด•เตพ: เดนเดพเดจเดฟเด•เดฐเดฎเดพเดฏ เดœเต‹เดฏเดฟเดจเตเด•เดณเตเด‚ OR-เด•เดณเตเด‚

เดฌเดซเดฑเตเด•เตพ เด•เตŠเดฃเตเดŸเตเดตเดฐเตเดจเตเดจ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ เดธเต‚เด•เตเดทเดฟเด•เตเด•เตเด•...
เด’เดฐเต เดšเต†เดฑเดฟเดฏ เดšเต‹เดฆเตเดฏเด‚ เด‰เดฆเดพเดนเดฐเดฃเดฎเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต, 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;

เดชเดŸเตเดŸเดฟเด•เดฏเต†เดฏเตเด‚ เดซเต€เตฝเดกเต เดจเดพเดฎเด™เตเด™เดณเต†เดฏเตเด‚ เด•เตเดฑเดฟเดšเตเดšเตเดซเต€เตฝเดกเตเด•เดณเตเดŸเต†เดฏเตเด‚ เดŸเต‡เดฌเดฟเดณเตเด•เดณเตเดŸเต†เดฏเตเด‚ "เดฑเดทเตเดฏเตป" เดชเต‡เดฐเตเด•เตพ เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏเดฟ เดชเดฐเดฟเด—เดฃเดฟเด•เตเด•เดพเด‚, เดชเด•เตเดทเต‡ เด‡เดคเต เดฐเตเดšเดฟเดฏเตเดŸเต† เด•เดพเดฐเตเดฏเดฎเดพเดฃเต. เดŽเดจเตเดคเตเด•เต†เดพเดฃเตเดŸเต†เดจเตเดจเดพเดฒเต เด‡เดตเดฟเดŸเต† เดŸเต†เตปเดธเดฑเดฟเตฝ เดตเดฟเดฆเต‡เดถ เดกเต†เดตเดฒเดชเตเดชเตผเดฎเดพเดฐเดฟเดฒเตเดฒ, เด•เต‚เดŸเดพเดคเต† เดนเตˆเดฑเต‹เด—เตเดฒเดฟเดซเตเด•เดณเดฟเตฝ เดชเต‹เดฒเตเด‚ เดชเต‡เดฐเตเด•เตพ เดจเตฝเด•เดพเตป PostgreSQL เดžเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. เด‰เดฆเตเดงเดฐเดฃเดฟเด•เดณเดฟเตฝ เด‰เตพเดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต, เดชเดฟเดจเตเดจเต† เดชเตŠเดฐเตเดคเตเดคเด•เตเด•เต‡เดŸเตเด•เตพ เด‰เดฃเตเดŸเดพเด•เดพเดคเดฟเดฐเดฟเด•เตเด•เดพเตป เดตเตเดฏเด•เตเดคเดตเตเด‚ เดตเตเดฏเด•เตเดคเดตเตเดฎเดพเดฏ เด’เดฌเตโ€Œเดœเด•เตโ€Œเดฑเตเดฑเตเด•เตพเด•เตเด•เต เดชเต‡เดฐเดฟเดŸเดพเตป เดžเด™เตเด™เตพ เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต.
เดซเดฒเดฎเดพเดฏเตเดฃเตเดŸเดพเด•เตเดจเตเดจ เดชเตเดฒเดพเตป เดจเต‹เด•เตเด•เดพเด‚:
PostgreSQL เด†เดจเตเดฑเดฟเดชเดพเดฑเตเดฑเต‡เดฃเตเด•เตพ: เดนเดพเดจเดฟเด•เดฐเดฎเดพเดฏ เดœเต‹เดฏเดฟเดจเตเด•เดณเตเด‚ OR-เด•เดณเตเด‚
[explain.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 vs UNION

เดšเดฟเดฒ เดธเดจเตเดฆเตผเดญเด™เตเด™เดณเดฟเตฝ, เดฌเดฟเดฑเตเดฑเตเดฎเดพเดชเตเดชเต เดนเต€เดชเตเดชเต เดธเตเด•เดพเตป เดžเด™เตเด™เตพเด•เตเด•เต เดตเดณเดฐเต†เดฏเดงเดฟเด•เด‚ เดšเดฟเดฒเดตเดพเด•เตเด‚ - เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดžเด™เตเด™เดณเตเดŸเต† เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดงเดพเดฐเดพเดณเด‚ เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เตพ เด†เดตเดถเตเดฏเดฎเดพเดฏ เด…เดตเดธเตเดฅ เดชเดพเดฒเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ. เด•เดพเดฐเดฃเด‚ เดžเด™เตเด™เตพเด•เตเด•เต เด…เดคเต เดฒเดญเดฟเดšเตเดšเต เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด…เดตเดธเตเดฅ 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-เดจเต† เด’เดฐเต เดตเตเดฏเดตเดธเตเดฅเดฏเดพเด•เตเด•เดฟ เดฎเดพเดฑเตเดฑเดพเดจเตเดณเตเดณ เด…เดตเดธเดฐเดฎเตเดฃเตเดŸเต.
เดธเต‚เดšเดฟเด•เดฏเดฟเดฒเดพเด•เตเด•เดฟเดฏ เดซเต€เตฝเดกเตเด•เตพ "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). เดŽเดจเตเดจเดพเตฝ เดฑเต†เด•เตเด•เต‹เตผเดกเต เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ เดธเต‚เดšเดฟเด•เดฏเดฟเดฒเต† เดซเต€เตฝเดกเตเด•เดณเตเดŸเต† เด•เตเดฐเดฎเดคเตเดคเดฟเตฝ, เด…เดคเตเดคเดฐเดฎเตŠเดฐเต เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดชเดฟเดจเตเดจเต€เดŸเต เดกเต€เดฌเด—เต เดšเต†เดฏเตเดฏเดพเตป เด•เต‚เดŸเตเดคเตฝ เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดฎเดพเดฃเต.
เดŽเดจเตเดคเดพเดฃเต เดชเตเดฒเดพเดจเดฟเตฝ เด‰เดณเตเดณเดคเต?
PostgreSQL เด†เดจเตเดฑเดฟเดชเดพเดฑเตเดฑเต‡เดฃเตเด•เตพ: เดนเดพเดจเดฟเด•เดฐเดฎเดพเดฏ เดœเต‹เดฏเดฟเดจเตเด•เดณเตเด‚ OR-เด•เดณเตเด‚
[explain.tensor.ru-เตฝ เด•เดพเดฃเตเด•]

เดจเดฟเตผเดญเดพเด—เตเดฏเดตเดถเดพเตฝ, เดžเด™เตเด™เตพ เดจเดฟเตผเดญเดพเด—เตเดฏเดตเดพเดจเตเดฎเดพเดฐเดพเดฏเดฟเดฐเตเดจเตเดจเต, เด†เดฆเตเดฏเดคเตเดคเต† UNION เดฌเตเดฒเต‹เด•เตเด•เดฟเตฝ เด’เดจเตเดจเตเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเดพเดจเดพเดฏเดฟเดฒเตเดฒ, เด…เดคเดฟเดจเดพเตฝ เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต‡เดคเต เด…เดชเตเดชเต‹เดดเตเด‚ เดจเดฟเตผเดตเตเดตเดนเดฟเดšเตเดšเต. เดŽเดจเตเดจเดพเตฝ เด…เด™เตเด™เดจเต†เดฏเดพเดฃเต†เด™เตเด•เดฟเดฒเตเด‚ - เดฎเดพเดคเตเดฐเด‚ 0.037ms เด‰เด‚ 11 เดฌเดซเดฑเตเด•เดณเตเด‚!
เดžเด™เตเด™เตพ เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดตเต‡เด—เดคเตเดคเดฟเดฒเดพเด•เตเด•เตเด•เดฏเตเด‚ เดฎเต†เดฎเตเดฎเดฑเดฟเดฏเดฟเดฒเต† เดกเดพเดฑเตเดฑ เดชเดฎเตเดชเดฟเด‚เด—เต เด•เตเดฑเดฏเตเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดคเต เด†เดฏเดฟเดฐเด•เตเด•เดฃเด•เตเด•เดฟเดจเต เดคเดตเดฃ, เดตเดณเดฐเต† เดฒเดณเดฟเดคเดฎเดพเดฏ เดŸเต†เด•เตเดจเดฟเด•เตเด•เตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต - เด’เดฐเต เดšเต†เดฑเดฟเดฏ เด•เต‹เดชเตเดชเดฟ-เดชเต‡เดธเตเดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดจเดฒเตเดฒ เดซเดฒเด‚. ๐Ÿ™‚

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•