PostgreSQL เชเชจเซเชŸเชฟเชชเซ‡เชŸเชฐเซเชจ: เชนเชพเชจเชฟเช•เชพเชฐเช• เชœเซ‹เชกเชพเช“ เช…เชจเซ‡ 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;

เช•เซ‹เชทเซเชŸเช• เช…เชจเซ‡ เช•เซเชทเซ‡เชคเซเชฐเชจเชพ เชจเชพเชฎเซ‹ เชตเชฟเชถเซ‡เช•เซเชทเซ‡เชคเซเชฐเซ‹ เช…เชจเซ‡ เช•เซ‹เชทเซเชŸเช•เซ‹เชจเชพ "เชฐเชถเชฟเชฏเชจ" เชจเชพเชฎเซ‹เชจเซ‡ เช…เชฒเช— เชฐเซ€เชคเซ‡ เชธเชพเชฐเชตเชพเชฐ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชชเชฐเช‚เชคเซ เช† เชธเซเชตเชพเชฆเชจเซ€ เชฌเชพเชฌเชค เช›เซ‡. เช•เชพเชฐเชฃ เช•เซ‡ เช…เชนเซ€เช‚ เชŸเซ‡เชจเซเชธเชฐ เชชเชฐ เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชตเชฟเชฆเซ‡เชถเซ€ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“ เชจเชฅเซ€, เช…เชจเซ‡ PostgreSQL เช…เชฎเชจเซ‡ เชšเชฟเชคเซเชฐเชฒเชฟเชชเซ€เชฎเชพเช‚ เชชเชฃ เชจเชพเชฎ เช†เชชเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡, เชœเซ‹ เชคเซ‡เช“ เช…เชตเชคเชฐเชฃเชฎเชพเช‚ เชฌเช‚เชง, เชคเซ‹ เชชเช›เซ€ เช…เชฎเซ‡ เช…เชธเซเชชเชทเซเชŸ เช…เชจเซ‡ เชธเซเชชเชทเซเชŸ เชฐเซ€เชคเซ‡ เชตเชธเซเชคเซเช“เชจเซ‡ เชจเชพเชฎ เช†เชชเชตเชพเชจเซเช‚ เชชเชธเช‚เชฆ เช•เชฐเซ€เช เช›เซ€เช เชœเซ‡เชฅเซ€ เช•เซ‹เชˆ เชตเชฟเชธเช‚เช—เชคเชคเชพ เชจ เชนเซ‹เชฏ.
เชšเชพเชฒเซ‹ เชชเชฐเชฟเชฃเชพเชฎเซ€ เชฏเซ‹เชœเชจเชพ เชœเซ‹เชˆเช:
PostgreSQL เชเชจเซเชŸเชฟเชชเซ‡เชŸเชฐเซเชจ: เชนเชพเชจเชฟเช•เชพเชฐเช• เชœเซ‹เชกเชพเช“ เช…เชจเซ‡ ORs
[explan.tensor.ru เชชเชฐ เชœเซเช“]

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 เชฎเชพเช‚ เชซเซ‡เชฐเชตเชพเชˆ- เชฏเซ‹เชœเชจเชพเชฎเชพเช‚ เช•เชพเชฎเช—เซ€เชฐเซ€.
เชšเชพเชฒเซ‹ เชฎเซ‚เชณ เชธเชฎเชธเซเชฏเชพ เชชเชฐ เชชเชพเช›เชพ เชซเชฐเซ€เช - เช†เชชเชฃเซ‡ เชคเซ‡เชจเซ‡ เช…เชจเซเชฐเซ‚เชช เชฐเซ‡เช•เซ‹เชฐเซเชก เชถเซ‹เชงเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช•เซ‹เชˆเชชเชฃ เชถเชฐเชคเซ‹เชฎเชพเช‚เชฅเซ€ - เชเชŸเชฒเซ‡ เช•เซ‡, เชฌเช‚เชจเซ‡ เชถเชฐเชคเซ‹ เชนเซ‡เช เชณ เชคเชฎเชพเชฎ 59K เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธ เชถเซ‹เชงเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€. เชเช• เชถเชฐเชค เชฌเชนเชพเชฐ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เชฎเชพเชฐเซเช— เช›เซ‡, เช…เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชชเซเชฐเชฅเชฎเชฎเชพเช‚ เช•เช‚เชˆ เชจ เชฎเชณเซเชฏเซเช‚ เชคเซเชฏเชพเชฐเซ‡ เชœ เชฌเซ€เชœเชพ เชชเชฐ เชœเชพเช“. เชจเซ€เชšเซ‡เชจเซ€ เชกเชฟเชเชพเช‡เชจ เช…เชฎเชจเซ‡ เชฎเชฆเชฆ เช•เชฐเชถเซ‡:

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

"เชฌเชพเชนเซเชฏ" เชฎเชฐเซเชฏเชพเชฆเชพ 1 เช–เชพเชคเชฐเซ€ เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ เชœเซเชฏเชพเชฐเซ‡ เชชเซเชฐเชฅเชฎ เชฐเซ‡เช•เซ‹เชฐเซเชก เชฎเชณเซ‡ เชคเซเชฏเชพเชฐเซ‡ เชถเซ‹เชง เชธเชฎเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡. เช…เชจเซ‡ เชœเซ‹ เชคเซ‡ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เชชเซเชฐเชฅเชฎ เชฌเซเชฒเซ‹เช•เชฎเชพเช‚ เชœเซ‹เชตเชพ เชฎเชณเซ‡ เช›เซ‡, เชคเซ‹ เชฌเซ€เชœเซ‹ เชฌเซเชฒเซ‹เช• เชšเชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เชจเชนเซ€เช‚ (เช•เซเชฏเชพเชฐเซ‡เชฏ เชšเชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชจเชฅเซ€ เชจเชพ เชธเชจเซเชฎเชพเชจเชฎเชพเช‚).

"เช•เซ‡เชธ เชนเซ‡เช เชณ เชฎเซเชถเซเช•เซ‡เชฒ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเช“ เช›เซเชชเชพเชตเชตเซ€"

เชฎเซ‚เชณ เช•เซเชตเซ‡เชฐเซ€ เชฎเชพเช‚ เชเช• เช…เชคเซเชฏเช‚เชค เช…เชธเซเชตเชฟเชงเชพเชœเชจเช• เช•เซเชทเชฃ เช›เซ‡ - เชธเช‚เชฌเช‚เชงเชฟเชค เช•เซ‹เชทเซเชŸเช• โ€œDocumentExtensionโ€ เชธเชพเชฎเซ‡ เชธเซเชฅเชฟเชคเชฟ เชคเชชเชพเชธเซ€ เชฐเชนเซ€ เช›เซ‡. เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟเชฎเชพเช‚ เช…เชจเซเชฏ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเช“เชจเชพ เชธเชคเซเชฏเชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ€เชงเชพ เชตเชฟเชจเชพ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, 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 เชธเชฌเชฌเซเชฒเซ‹เช•เชฎเชพเช‚ เช…เชจเซเช•เซเชฐเชฎเชฟเชค เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเช“ เชฅเซ‹เชกเซ€ เช…เชฒเช— เช›เซ‡ - เช† เชเชŸเชฒเชพ เชฎเชพเชŸเซ‡ เช›เซ‡ เช•เชพเชฐเชฃ เช•เซ‡ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชŸเซ‡เชฌเชฒ เชชเชฐ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชฏเซ‹เช—เซเชฏ เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพเช“ เช›เซ‡. เช…เชจเซ‡ เชœเซ‹ เชคเซ‡เช“ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เชจ เชนเซ‹เชฏ, เชคเซ‹ เชคเซ‡ เชฌเชจเชพเชตเชตเชพ เชฏเซ‹เช—เซเชฏ เชนเชถเซ‡: เชฆเชธเซเชคเชพเชตเซ‡เชœ(เชตเซเชฏเช•เซเชคเชฟ3, เชฆเชธเซเชคเชพเชตเซ‡เชœเชจเซ‹ เชชเซเชฐเช•เชพเชฐ) ะธ เชฆเชธเซเชคเชพเชตเซ‡เชœ (เชฆเชธเซเชคเชพเชตเซ‡เชœ เชชเซเชฐเช•เชพเชฐ, เช•เชฐเซเชฎเชšเชพเชฐเซ€).
ROW เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเช“เชฎเชพเช‚ เช•เซเชทเซ‡เชคเซเชฐเซ‹เชจเชพ เช•เซเชฐเชฎ เชตเชฟเชถเซ‡เช†เชฏเซ‹เชœเช•เชจเชพ เชฆเซƒเชทเซเชŸเชฟเช•เซ‹เชฃเชฅเซ€, เช…เชฒเชฌเชคเซเชค, เชคเชฎเซ‡ เชฒเช–เซ€ เชถเช•เซ‹ เช›เซ‹ (A, B) = (constA, constB)เช…เชจเซ‡ (B, A) = (constB, constA). เชชเชฐเช‚เชคเซ เชœเซเชฏเชพเชฐเซ‡ เชฐเซ‡เช•เซ‹เชฐเซเชกเชฟเช‚เช— เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพเชฎเชพเช‚ เช•เซเชทเซ‡เชคเซเชฐเซ‹เชจเชพ เช•เซเชฐเชฎเชฎเชพเช‚, เช†เชตเซ€ เชตเชฟเชจเช‚เชคเซ€ เชชเชพเช›เชณเชฅเซ€ เชกเซ€เชฌเช— เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชตเชงเซ เช…เชจเซเช•เซ‚เชณ เช›เซ‡.
เชถเซเช‚ เช›เซ‡ เชฏเซ‹เชœเชจเชพเชฎเชพเช‚?
PostgreSQL เชเชจเซเชŸเชฟเชชเซ‡เชŸเชฐเซเชจ: เชนเชพเชจเชฟเช•เชพเชฐเช• เชœเซ‹เชกเชพเช“ เช…เชจเซ‡ ORs
[explan.tensor.ru เชชเชฐ เชœเซเช“]

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

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹