PostgreSQL Antipatterns: เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบ—เบตเปˆเป€เบ›เบฑเบ™เบญเบฑเบ™เบ•เบฐเบฅเบฒเบ เปเบฅเบฐ ORs

เบฅเบฐโ€‹เบงเบฑเบ‡โ€‹เบเบฒเบ™โ€‹เบ”เปเบฒโ€‹เป€เบ™เบตเบ™โ€‹เบ‡เบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบ™เปเบฒโ€‹เป€เบญเบปเบฒ buffers ...
เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเป€เบ›เบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡, เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ—เบปเปˆเบงเป„เบ›เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเปƒเบ™ 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 เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบ•เบฑเป‰เบ‡เบŠเบทเปˆเป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเปƒเบ™ hieroglyphs, เบ–เป‰เบฒเบžเบงเบเป€เบ‚เบปเบฒ เบซเบธเป‰เบกเบขเบนเปˆเปƒเบ™เบงเบปเบ‡เบขเบทเบกเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบกเบฑเบเบ•เบฑเป‰เบ‡เบŠเบทเปˆเบงเบฑเบ”เบ–เบธเบขเปˆเบฒเบ‡เบšเปเปˆเบŠเบฑเบ”เป€เบˆเบ™ เปเบฅเบฐเบŠเบฑเบ”เป€เบˆเบ™เป€เบžเบทเปˆเบญเบšเปเปˆเปƒเบซเป‰เบกเบตเบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡.
เปƒเบซเป‰โ€‹เป€เบšเบดเปˆเบ‡โ€‹เปƒเบ™โ€‹เปเบœเบ™โ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹:
PostgreSQL Antipatterns: เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบ—เบตเปˆเป€เบ›เบฑเบ™เบญเบฑเบ™เบ•เบฐเบฅเบฒเบ เปเบฅเบฐ ORs
[เป€เบšเบดเปˆเบ‡เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบ.tensor.ru]

144ms เปเบฅเบฐเป€เบเบทเบญเบš 53K buffers - เบ™เบฑเป‰เบ™โ€‹เปเบกเปˆเบ™โ€‹เบซเบผเบฒเบโ€‹เบโ€‹เปˆโ€‹เบงเบฒ 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 เบ—เบฝเบšเบเบฑเบš UNION

เปƒเบ™เบšเบฒเบ‡เบเปเบฅเบฐเบ™เบต, Bitmap Heap Scan เบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบเบซเบผเบฒเบ - เบ•เบปเบงเบขเปˆเบฒเบ‡, เปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบšเบฑเบ™เบ—เบถเบเบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบซเบผเบฒเบเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™. เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบกเบฑเบ™เป€เบžเบฒเบฐเบงเปˆเบฒ OR เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบเบฒเบเป€เบ›เบฑเบ™ BitmapOr- เบเบฒเบ™โ€‹เบ”เปเบฒโ€‹เป€เบ™เบตเบ™โ€‹เบ‡เบฒเบ™โ€‹เปƒเบ™โ€‹เปเบœเบ™โ€‹เบเบฒเบ™โ€‹.
เปƒเบซเป‰เบเบฑเบšเบ„เบทเบ™เป„เบ›เบซเบฒเบšเบฑเบ™เบซเบฒเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš - เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบŠเบญเบเบซเบฒเบšเบฑเบ™เบ—เบถเบเบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™ เบœเบนเป‰เปƒเบ” เบˆเบฒเบเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚ - เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ„เบปเป‰เบ™เบซเบฒเบšเบฑเบ™เบ—เบถเบ 59K เบ—เบฑเบ‡เบซเบกเบปเบ”เบžเบฒเบเปƒเบ•เป‰เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ—เบฑเบ‡เบชเบญเบ‡. เบกเบตเบงเบดเบ—เบตเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบญเบญเบเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบซเบ™เบถเปˆเบ‡, เปเบฅเบฐ เป„เบ›เบ—เบตเบชเบญเบ‡เบžเบฝเบ‡เปเบ•เปˆเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบžเบปเบšเป€เบซเบฑเบ™เบขเบนเปˆเปƒเบ™เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”. เบเบฒเบ™เบญเบญเบเปเบšเบšเบ•เปเปˆเป„เบ›เบ™เบตเป‰เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒ:

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

"เบžเบฒเบเบ™เบญเบ" LIMIT 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 เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เปƒเบ™เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบเปˆเบญเบ.
เปƒเบซเป‰เบญเบญเบเบˆเบฒเบเบŠเปˆเบญเบ‡เบ—เบตเปˆเบ–เบทเบเบ”เบฑเบ”เบชเบฐเบ™เบต "เบ™เบญเบเบงเบปเบ‡เป€เบฅเบฑเบšเบเปเบฅเบฐเบ™เบต", เป€เบžเบตเปˆเบกเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ‡เปˆเบฒเบเป†เบˆเบฒเบเบšเบฑเบ™เบ—เบถเบเปƒเบชเปˆเป€เบกเบทเปˆเบญเบšเบฅเบฑเบญเบ - เปเบฅเบฐเบ•เบญเบ™เบ™เบตเป‰เบเบฒเบ™เบชเบญเบšเบ–เบฒเบก "เบซเบ™เบฑเบ" เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบžเบฝเบ‡เปเบ•เปˆเป€เบกเบทเปˆเบญเบœเปˆเบฒเบ™เป„เบ›เบซเบฒเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™.

เบ™เบฒเบกเบชเบฐเบเบธเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเปเบกเปˆเบ™ "เบฅเบงเบก"

เบžเบงเบเป€เบฎเบปเบฒเป€เบเบฑเบšเบเปเบฒเบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฑเบšเบเบปเบ™เป„เบเบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบ™เบตเป‰:

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;

เบ›เบฑเบš [เบเบฑเบš] indexes

เบ•เบฒเบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบเบถเบเบญเบปเบšเบฎเบปเบกเบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบงเปˆเบฒเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ—เบตเปˆเบ–เบทเบเบ”เบฑเบ”เบชเบฐเบ™เบตเบขเบนเปˆเปƒเบ™เบšเบฅเบฑเบญเบเบเปˆเบญเบเบ‚เบญเบ‡ UNION เปเบกเปˆเบ™เปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เป€เบฅเบฑเบเบ™เป‰เบญเบ - เบ™เบตเป‰เปเบกเปˆเบ™เบเป‰เบญเบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ”เบฑเบ”เบชเบฐเบ™เบตเบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบฅเป‰เบง. เปเบฅเบฐเบ–เป‰เบฒเบžเบงเบเป€เบ‚เบปเบฒเบšเปเปˆเบกเบต, เบกเบฑเบ™เบˆเบฐเบ„เบธเป‰เบกเบ„เปˆเบฒเปƒเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡: เป€เบญเบเบฐเบชเบฒเบ™(เบšเบธเบเบ„เบปเบ™ 3, เบ›เบฐเป€เบžเบ”เป€เบญเบเบฐเบชเบฒเบ™) ะธ เป€เบญเบเบฐเบชเบฒเบ™(เบ›เบฐเป€เบžเบ”เป€เบญเบเบฐเบชเบฒเบ™, เบžเบฐเบ™เบฑเบเบ‡เบฒเบ™).
เบเปˆเบฝเบงเบเบฑเบšเบฅเปเบฒเบ”เบฑเบšเบ‚เบญเบ‡เบ—เบปเปˆเบ‡เบ™เบฒเปƒเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚ ROWเบˆเบฒเบเบ—เบฑเบ”เบชเบฐเบ™เบฐเบ‚เบญเบ‡เบœเบนเป‰เบงเบฒเบ‡เปเบœเบ™, เปเบ™เปˆเบ™เบญเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ‚เบฝเบ™ (A, B) = (constA, constB)เปเบฅเบฐ (B, A) = (constB, constA). เปเบ•เปˆเป€เบงเบฅเบฒเบšเบฑเบ™เบ—เบถเบ เปƒเบ™เบฅเปเบฒเบ”เบฑเบšเบ‚เบญเบ‡เบ—เบปเปˆเบ‡เบ™เบฒเปƒเบ™เบ”เบฑเบ”เบŠเบฐเบ™เบต, เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเปเบกเปˆเบ™เบชเบฐเบ”เบงเบเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเบ”เบตเบšเบฑเบเปƒเบ™เบžเบฒเบเบซเบผเบฑเบ‡.
เปเบกเปˆเบ™เบซเบเบฑเบ‡เบขเบนเปˆเปƒเบ™เปเบœเบ™เบเบฒเบ™?
PostgreSQL Antipatterns: เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบ—เบตเปˆเป€เบ›เบฑเบ™เบญเบฑเบ™เบ•เบฐเบฅเบฒเบ เปเบฅเบฐ ORs
[เป€เบšเบดเปˆเบ‡เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบ.tensor.ru]

เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบžเบงเบเป€เบฎเบปเบฒเป‚เบŠเบเบšเปเปˆเบ”เบตเปเบฅเบฐเบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบ–เบทเบเบžเบปเบšเป€เบซเบฑเบ™เบขเบนเปˆเปƒเบ™เบ•เบฑเบ™ UNION เบ—เปเบฒเบญเบดเบ”, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบญเบฑเบ™เบ—เบตเบชเบญเบ‡เบเบฑเบ‡เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”. เปเบ•เปˆเป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒ - เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™ 0.037ms เปเบฅเบฐ 11 buffers!
เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบฅเบฑเปˆเบ‡เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเปเบฅเบฐเบซเบผเบธเบ”เบœเปˆเบญเบ™เบเบฒเบ™เบชเบนเบšเบ‚เปเป‰เบกเบนเบ™เปƒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ เบซเบผเบฒเบเบžเบฑเบ™เป€เบ—เบทเปˆเบญ, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เป€เบ•เบฑเบเบ™เบดเบเบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเบžเบปเบšเบ—เบปเปˆเบงเป„เบ› - เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบ”เบตเบเบฑเบšเบชเปเบฒเป€เบ™เบปเบฒเป€เบฅเบฑเบเบ™เป‰เบญเบ. ๐Ÿ™‚

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เบŠเบทเป‰เป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบšเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡ DDoS, เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ VPS VDS ๐Ÿ”ฅ เบŠเบทเป‰เป€เบงเบฑเบšเป„เบŠเบ—เปŒเป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบ”เป‰เบงเบเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™ DDoS, เป€เบŠเบตเบšเป€เบงเบต VPS VDS | ProHoster