PostgreSQL Antipatterns: เบ—เปˆเบญเบ‡เป„เบ›เบซเบฒ Registry

เบกเบทเป‰เบ™เบตเป‰เบˆเบฐเบšเปเปˆเบกเบตเบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบŠเบฑเบšเบŠเป‰เบญเบ™เปเบฅเบฐ algorithms เบ—เบตเปˆเบŠเบฑเบšเบŠเป‰เบญเบ™เปƒเบ™ SQL. เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบˆเบฐเบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบ, เปƒเบ™เบฅเบฐเบ”เบฑเบšเบ‚เบญเบ‡ Captain Obvious - เปƒเบซเป‰เป€เบฎเบฑเบ”เบกเบฑเบ™ เป€เบšเบดเปˆเบ‡เบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เป€เบซเบ”เบเบฒเบ™ เบˆเบฑเบ”เบฎเบฝเบ‡เบ•เบฒเบกเป€เบงเบฅเบฒ.

เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบกเบตเป€เบ„เบทเปˆเบญเบ‡เบซเบกเบฒเบเปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ events, เปเบฅเบฐเบ™เบฒเบ‡เบกเบตเบžเบฒเบเบชเบฐเบซเบ™เบฒเบก ts - เบเบปเบ‡เบเบฑเบšเป€เบงเบฅเบฒเบ—เบตเปˆเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบšเบฑเบ™เบ—เบถเบเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบฅเบฐเบšเบฝเบš:

CREATE TABLE events(
  id
    serial
      PRIMARY KEY
, ts
    timestamp
, data
    json
);

CREATE INDEX ON events(ts DESC);

เบกเบฑเบ™เป€เบ›เบฑเบ™เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบšเปเปˆเบกเบตเบšเบฑเบ™เบ—เบถเบเบซเบผเบฒเบเบชเบดเบšเบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เบšเบฒเบ‡เบฎเบนเบšเปเบšเบš เบเบฒเบ™เบ™เปเบฒเบ—เบฒเบ‡เบซเบ™เป‰เบฒ.

#0. "เบ‚เป‰เบญเบเป€เบ›เบฑเบ™เปเบกเปˆเบ‚เบญเบ‡เปเบกเปˆเบ‚เบญเบ‡เบ‚เป‰เบญเบ"

cur.execute("SELECT * FROM events;")
rows = cur.fetchall();
rows.sort(key=lambda row: row.ts, reverse=True);
limit = 26
print(rows[offset:offset+limit]);

เบกเบฑเบ™เป€เบเบทเบญเบšเบšเปเปˆเปเบกเปˆเบ™เป€เบฅเบทเปˆเบญเบ‡เบ•เบฐเบซเบฅเบปเบ - เบกเบฑเบ™เป€เบ›เบฑเบ™เป€เบฅเบทเปˆเบญเบ‡เบ—เบตเปˆเบซเบฒเบเบฒเบ, เปเบ•เปˆเบžเบปเบšเป€เบซเบฑเบ™เบขเบนเปˆเปƒเบ™เบ—เปเบฒเบกเบฐเบŠเบฒเบ”. เบšเบฒเบ‡เบ„เบฑเป‰เบ‡, เบซเบผเบฑเบ‡เบˆเบฒเบเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš ORM, เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบเบฒเบเบ—เบตเปˆเบˆเบฐเบ›เปˆเบฝเบ™เป„เบ›เป€เบฎเบฑเบ”เบงเบฝเบ "เป‚เบ”เบเบเบปเบ‡" เบเบฑเบš SQL.

เปเบ•เปˆเบ‚เปเปƒเบซเป‰เป€เบฎเบปเบฒเบเป‰เบฒเบงเป„เบ›เบชเบนเปˆเบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบžเบปเบšเป€เบฅเบทเป‰เบญเบเบเบงเปˆเบฒ เปเบฅเบฐเบŠเบฑเบ”เป€เบˆเบ™เบเบงเปˆเบฒ.

#1. เบŠเบปเบ”เป€เบŠเบตเบ

SELECT
  ...
FROM
  events
ORDER BY
  ts DESC
LIMIT 26 OFFSET $1; -- 26 - ะทะฐะฟะธัะตะน ะฝะฐ ัั‚ั€ะฐะฝะธั†ะต, $1 - ะฝะฐั‡ะฐะปะพ ัั‚ั€ะฐะฝะธั†ั‹

เป€เบฅเบ 26 เบกเบฒเบˆเบฒเบเปƒเบช? เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เป‚เบ”เบโ€‹เบ›เบฐโ€‹เบกเบฒเบ™โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ›เป‰เบญเบ™โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เปƒเบ™โ€‹เบซเบ™เบถเปˆเบ‡โ€‹เบซเบ™เป‰เบฒโ€‹เบˆเปโ€‹. เบซเบผเบฒเบเบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™, 25 เบšเบฑเบ™เบ—เบถเบเบ—เบตเปˆเบชเบฐเปเบ”เบ‡, เบšเบงเบ 1, เบชเบฑเบ™เบเบฒเบ™เบงเปˆเบฒเบกเบตเบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบญเบทเปˆเบ™เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เปเบฅเบฐเบกเบฑเบ™เป€เบฎเบฑเบ”เปƒเบซเป‰เบ„เบงเบฒเบกเบฎเบนเป‰เบชเบถเบเบ—เบตเปˆเบˆเบฐเบเป‰เบฒเบงเบ•เปเปˆเป„เบ›.

เปเบ™เปˆเบ™เบญเบ™, เบ„เปˆเบฒเบ™เบตเป‰เบšเปเปˆเบชเบฒเบกเบฒเบ” "เบซเบเบดเบš" เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ•เบปเบงเบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป, เปเบ•เปˆเบœเปˆเบฒเบ™เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™. เปเบ•เปˆเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบœเบนเป‰เบเปเบฒเบ™เบปเบ”เป€เบงเบฅเบฒ PostgreSQL เบˆเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เบญเบตเบ‡เปƒเบชเปˆเบ„เบงเบฒเบกเบฎเบนเป‰เบ—เบตเปˆเบ„เบงเบ™เบˆเบฐเบกเบตเบšเบฑเบ™เบ—เบถเบเบ—เบตเปˆเบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบซเบ™เป‰เบญเบ - เปเบฅเบฐเบˆเบฐเป€เบฅเบทเบญเบเป€เบญเบปเบฒเปเบœเบ™เบเบฒเบ™เบ—เบตเปˆเบšเปเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเป„เบ”เป‰เบ‡เปˆเบฒเบ.

เปเบฅเบฐเปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบขเบนเปˆเปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™, เบเบฒเบ™เป€เบšเบดเปˆเบ‡เบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบ›เบฑเบ™เบเบฒเบ™เบ›เปˆเบฝเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡ "เบซเบ™เป‰เบฒ", เบšเปเปˆเบกเบตเปƒเบœเบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ‡เป„เบชเป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™. เบˆเบปเบ™เบเปˆเบงเบฒเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆ, เปƒเบ™เบเบฒเบ™เบ•เปเปˆเบชเบนเป‰เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบชเบฐเบ”เบงเบ, UI / UX เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆ remake เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบเบฑเบš "เป€เบฅเบทเปˆเบญเบ™เบšเปเปˆเบกเบตเบ—เบตเปˆเบชเบดเป‰เบ™เบชเบธเบ”" - เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ–เบทเบเปเบ•เป‰เบกเบขเบนเปˆเปƒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ”เบฝเบงเบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰เบชเบฒเบกเบฒเบ”เป€เบฅเบทเปˆเบญเบ™เบ‚เบถเป‰เบ™เปเบฅเบฐเบฅเบปเบ‡เป„เบ”เป‰.

เปเบฅเบฐเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ•เปเปˆเป„เบ›, เป€เบˆเบปเป‰เบฒเบ–เบทเบเบˆเบฑเบš เบŠเปเป‰เบฒเบŠเป‰เบญเบ™เบ‚เบญเบ‡เบšเบฑเบ™เบ—เบถเบ เปƒเบ™โ€‹เบเบฒเบ™โ€‹เบˆเบปเบ”โ€‹เบ—เบฐโ€‹เบšเบฝเบ™โ€‹. เป€เบ›เบฑเบ™เบซเบเบฑเบ‡, เป€เบžเบฒเบฐเบงเปˆเบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบกเบตเบ”เบฑเบ”เบŠเบฐเบ™เบตเบ›เบปเบเบเบฐเบ•เบด (ts), เบ—เบตเปˆเบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบญเบตเบ‡เปƒเบชเปˆ?

เปเบ—เป‰เบˆเบดเบ‡เปเบฅเป‰เบงเป€เบžเบฒเบฐเบงเปˆเบฒเบ—เปˆเบฒเบ™เบšเปเปˆเป„เบ”เป‰เบ„เปเบฒเบ™เบถเบ‡เป€เบ–เบดเบ‡เบกเบฑเบ™ ts เบšเปเปˆเปเบกเปˆเบ™เบเบฐเปเบˆเบ—เบตเปˆเป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบ เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ™เบตเป‰. เบ•เบปเบงเบˆเบดเบ‡เปเบฅเป‰เบง, เปเบฅเบฐ เบ„เบธเบ™เบ„เปˆเบฒเบ‚เบญเบ‡เบกเบฑเบ™เบšเปเปˆเป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบ, เป€เบŠเบฑเปˆเบ™ "เป€เบงเบฅเบฒ" เปƒเบ™เบชเบฐเบžเบฒเบšเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡ - เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบšเบฑเบ™เบ—เบถเบเบ”เบฝเบงเบเบฑเบ™เปƒเบ™เบชเบญเบ‡เบ„เปเบฒเบ–เบฒเบกเบ—เบตเปˆเบ•เบดเบ”เบเบฑเบ™เป„เบ”เป‰เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ "เป‚เบ”เบ”" เบˆเบฒเบเบซเบ™เป‰เบฒเป„เบ›เบซเบฒเบซเบ™เป‰เบฒเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ„เปเบฒเบชเบฑเปˆเบ‡เบชเบธเบ”เบ—เป‰เบฒเบเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เปƒเบ™เบเบญเบšเบ‚เบญเบ‡เบเบฒเบ™เบˆเบฑเบ”เบฅเบฝเบ‡เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ”เบฝเบงเบเบฑเบ™.

เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบเบฑเบ‡เบกเบตเบšเบฑเบ™เบซเบฒเบ—เบตเบชเบญเบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ‡เป„เบงเป‰เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰, เป€เบŠเบดเปˆเบ‡เบกเบตเบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบเบซเบผเบฒเบเบ—เบตเปˆเบˆเบฐเบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™ - เบšเบฒเบ‡เบฅเบฒเบเบเบฒเบ™เบˆเบฐเบšเปเปˆเบ–เบทเบเบชเบฐเปเบ”เบ‡ เป€เบฅเบตเบ! เบซเบผเบฑเบ‡เบˆเบฒเบเบ—เบตเปˆเบ—เบฑเบ‡เบซเบกเบปเบ”, เบšเบฑเบ™เบ—เบถเบ "เบŠเป‰เปเบฒเบเบฑเบ™" เป„เบ”เป‰เป€เบญเบปเบฒเบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ‚เบญเบ‡เบ„เบปเบ™เบญเบทเปˆเบ™. เบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ—เบตเปˆเบกเบตเบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบชเบงเบเบ‡เบฒเบกเบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰ เบญเปˆเบฒเบ™เบ—เบตเปˆเบ™เบตเป‰.

เบ‚เบฐเบซเบเบฒเบเบ”เบฑเบ”เบŠเบฐเบ™เบต

เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบ—เบตเปˆเบชเบฐเบซเบฅเบฒเบ”เป€เบ‚เบปเป‰เบฒเปƒเบˆเบ”เบตเบงเปˆเบฒเบเบฐเปเบˆเบ”เบฑเบ”เบ™เบตเบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบ, เปเบฅเบฐเบงเบดเบ—เบตเบ—เบตเปˆเบ‡เปˆเบฒเบเบ—เบตเปˆเบชเบธเบ”เปเบกเปˆเบ™เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบกเบฑเบ™เบ”เป‰เบงเบเบžเบฒเบเบชเบฐเบซเบ™เบฒเบกเบ—เบตเปˆเป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบเบชเบฐเป€เบžเบฒเบฐ, เป€เบŠเบดเปˆเบ‡ PK เปเบกเปˆเบ™เบ”เบตเป€เบฅเบตเบ”เบชเปเบฒเบฅเบฑเบš:

CREATE UNIQUE INDEX ON events(ts DESC, id DESC);

เปเบฅเบฐโ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เบ›เปˆเบฝเบ™โ€‹เปเบ›เบ‡โ€‹:

SELECT
  ...
ORDER BY
  ts DESC, id DESC
LIMIT 26 OFFSET $1;

#2. เบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™ "เป€เบ„เบตเป€เบŠเบต"

เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบ•เปเปˆเบกเบฒ, DBA เบกเบฒเบซเบฒเบ—เปˆเบฒเบ™เปเบฅเบฐ "เบžเปเปƒเบˆ" เบเบฑเบšเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ‚เบญเบ‡เบ—เปˆเบฒเบ™ เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป‚เบซเบผเบ”เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ„เบท hell เบเบฑเบšเบเบปเบ”เบฅเบฐเบšเบฝเบš OFFSET เบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ, เปเบฅเบฐเป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เบกเบฑเบ™เป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐเบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™ เบเบฒเบ™เบ™เปเบฒเบ—เบฒเบ‡เบˆเบฒเบเบ„เปˆเบฒเบชเบธเบ”เบ—เป‰เบฒเบเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™. เบ„เปเบฒเบ–เบฒเบกเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡:

SELECT
  ...
WHERE
  (ts, id) < ($1, $2) -- ะฟะพัะปะตะดะฝะธะต ะฟะพะปัƒั‡ะตะฝะฝั‹ะต ะฝะฐ ะฟั€ะตะดั‹ะดัƒั‰ะตะผ ัˆะฐะณะต ะทะฝะฐั‡ะตะฝะธั
ORDER BY
  ts DESC, id DESC
LIMIT 26;

เป€เบˆเบปเป‰เบฒเบซเบฒเบเปƒเบˆเป‚เบฅเปˆเบ‡เปƒเบˆเบˆเบปเบ™เบกเบฑเบ™เบกเบฒ...

#3. เบ”เบฑเบ”โ€‹เบŠเบฐโ€‹เบ™เบตโ€‹เบ—เปเบฒโ€‹เบ„เบงเบฒเบกโ€‹เบชเบฐโ€‹เบญเบฒเบ”โ€‹

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบกเบทเป‰เบซเบ™เบถเปˆเบ‡ DBA เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบญเปˆเบฒเบ™ เบšเบปเบ”เบ„เบงเบฒเบกเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบŠเบญเบเบซเบฒเบ”เบฑเบ”เบชเบฐเบ™เบตเบ—เบตเปˆเบšเปเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš เปเบฅเบฐเบฎเบฑเบšเบฎเบนเป‰เบงเปˆเบฒ เบเบฒเบ™เบชเบฐเปเบ•เบกเป€เบงเบฅเบฒ "เบšเปเปˆเบซเบฅเป‰เบฒเบชเบธเบ”" เบšเปเปˆเบ”เบต. เปเบฅเบฐเบ‚เป‰เบญเบเป„เบ”เป‰เบกเบฒเบซเบฒเป€เบˆเบปเป‰เบฒเบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡ - เบ•เบญเบ™เบ™เบตเป‰เบ”เป‰เบงเบเบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบตเปˆเบงเปˆเบฒเบ”เบฑเบ”เบŠเบฐเบ™เบตเบ™เบฑเป‰เบ™เบเบฑเบ‡เบ„เบงเบ™เบˆเบฐเบซเบฑเบ™เบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™ (ts DESC).

เปเบ•เปˆเบˆเบฐเป€เบฎเบฑเบ”เปเบ™เบงเปƒเบ”เบเบฑเบšเบšเบฑเบ™เบซเบฒเป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เบ‚เบญเบ‡ "เป‚เบ”เบ”" เบšเบฑเบ™เบ—เบถเบเบฅเบฐเบซเบงเปˆเบฒเบ‡เบซเบ™เป‰เบฒ?.. เปเบฅเบฐเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบ - เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฅเบทเบญเบเบšเบฅเบฑเบญเบเบ—เบตเปˆเบกเบตเบˆเปเบฒเบ™เบงเบ™เบšเบฑเบ™เบ—เบถเบเบ—เบตเปˆเบšเปเปˆเบเปเบฒเบ™เบปเบ”!

เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เปƒเบœเบซเป‰เบฒเบกเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเปƒเบซเป‰เบญเปˆเบฒเบ™ "26 เปเบ—เป‰", เปเบ•เปˆ "เบšเปเปˆเบซเบ™เป‰เบญเบเบเบงเปˆเบฒ 26"? เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เปƒเบ™เบ•เบฑเบ™เบ•เปเปˆเป„เบ›เบกเบต เบšเบฑเบ™เบ—เบถเบเบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบซเบกเบฒเบเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบขเปˆเบฒเบ‡เบˆเบฐเปเบˆเป‰เบ‡ ts - เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบ™เบฑเป‰เบ™โ€‹เบˆเบฐโ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบšเบฑเบ™โ€‹เบซเบฒโ€‹เบเบฑเบš "เบเบฒเบ™โ€‹เป‚เบ”เบ”โ€‹" เบเบฒเบ™โ€‹เบšเบฑเบ™โ€‹เบ—เบถเบโ€‹เบฅเบฐโ€‹เบซเบงเปˆเบฒเบ‡โ€‹เบ•เบฑเบ™โ€‹!

เบ™เบตเป‰เปเบกเปˆเบ™เบงเบดเบ—เบตเบ—เบตเปˆเบˆเบฐเบšเบฑเบ™เบฅเบธเป„เบ”เป‰:

SELECT
  ...
WHERE
  ts < $1 AND
  ts >= coalesce((
    SELECT
      ts
    FROM
      events
    WHERE
      ts < $1
    ORDER BY
      ts DESC
    LIMIT 1 OFFSET 25
  ), '-infinity')
ORDER BY
  ts DESC;

เป€เบเบตเบ”เบซเบเบฑเบ‡เบ‚เบถเป‰เบ™เบขเบนเปˆเบ™เบตเป‰?

  1. เบžเบงเบเป€เบฎเบปเบฒเบ‚เบฑเป‰เบ™เบ•เบญเบ™ 25 เบšเบฑเบ™เบ—เบถเบ "เบฅเบปเบ‡" เปเบฅเบฐเป„เบ”เป‰เบฎเบฑเบšเบ„เปˆเบฒ "เบ‚เบญเบšเป€เบ‚เบ”". ts.
  2. เบ–เป‰เบฒเบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบขเบนเปˆเปเบฅเป‰เบง, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ›เปˆเบฝเบ™เบ„เปˆเบฒ NULL เบ”เป‰เบงเบ -infinity.
  3. เบžเบงเบเป€เบฎเบปเบฒเบฅเบปเบšเบชเปˆเบงเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบ„เปˆเบฒเบฅเบฐเบซเบงเปˆเบฒเบ‡เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบš ts เปเบฅเบฐเบ„เปˆเบฒเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต $1 เบœเปˆเบฒเบ™เบˆเบฒเบเบชเปˆเบงเบ™เบ•เบดเบ”เบ•เปเปˆ (เบ„เปˆเบฒเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบœเบปเบ™ โ€œเบชเบธเบ”เบ—เป‰เบฒเบโ€ เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ).
  4. เบ–เป‰เบฒเบšเบฅเบฑเบญเบเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™เบ”เป‰เบงเบเบšเบฑเบ™เบ—เบถเบเบซเบ™เป‰เบญเบเบเบงเปˆเบฒ 26, เบกเบฑเบ™เปเบกเปˆเบ™เบญเบฑเบ™เบชเบธเบ”เบ—เป‰เบฒเบ.

เบซเบผเบทเบฎเบนเบšเบ”เบฝเบงเบเบฑเบ™:
PostgreSQL Antipatterns: เบ—เปˆเบญเบ‡เป„เบ›เบซเบฒ Registry

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบกเบต เบ•เบปเบงเบขเปˆเบฒเบ‡เบšเปเปˆเบกเบต "เบˆเบธเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™" เบชเบฐเป€เบžเบฒเบฐ., เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เบžเบงเบเป€เบฎเบปเบฒเบˆเบฒเบ "เบ‚เบฐเบซเบเบฒเบ" เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ™เบตเป‰เปƒเบ™เบ—เบดเบ”เบ—เบฒเบ‡เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบกเปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป‚เบซเบผเบ”เบ‚เปเป‰เบกเบนเบ™เปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบ‚เบญเบ‡เบ•เบฑเบ™เบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบ "เบˆเบธเบ”เบญเป‰เบฒเบ‡เบญเบดเบ‡" เปƒเบ™เบ—เบฑเบ‡เบชเบญเบ‡เบ—เบดเบ”เบ—เบฒเบ‡ - เบ—เบฑเบ‡เบฅเบปเบ‡เปเบฅเบฐเบ‚เบถเป‰เบ™.

เบซเบกเบฒเบเป€เบซเบ”

  1. เปเบกเปˆเบ™เปเบฅเป‰เบง, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ”เบฑเบ”เบŠเบฐเบ™เบตเบชเบญเบ‡เบ„เบฑเป‰เบ‡, เปเบ•เปˆเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™ "เป‚เบ”เบเบ”เบฑเบ”เบŠเบฐเบ™เบต". เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบเปˆเบญเบเบžเบฝเบ‡เปเบ•เปˆเบˆเบฐเบชเบปเปˆเบ‡เบœเบปเบ™เปƒเบซเป‰ เป€เบ›เบฑเบ™ Index เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบซเบ™เบถเปˆเบ‡เบžเบฝเบ‡เปเบ•เปˆเบชเบฐเปเบเบ™.
  2. เบกเบฑเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบˆเบฐเปเบˆเป‰เบ‡เบงเปˆเบฒเป€เบ•เบฑเบเบ™เบดเบเบ™เบตเป‰เบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰เบžเบฝเบ‡เปเบ•เปˆเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ—เปˆเบฒเบ™เบกเบตเบ„เบธเบ™เบ„เปˆเบฒ ts เบชเบฒเบกเบฒเบ”เบ‚เป‰เบฒเบกเบžเบฝเบ‡เปเบ•เปˆเป‚เบ”เบเบšเบฑเบ‡เป€เบญเบตเบ™, เปเบฅเบฐ เบšเปเปˆเบกเบตเบˆเปเบฒเบ™เบงเบ™เบซเบผเบฒเบเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ. เบ–เป‰เบฒเบเปเบฅเบฐเบ™เบตเบ›เบปเบเบเบฐเบ•เบดเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปเบกเปˆเบ™ "เบฅเป‰เบฒเบ™เบšเบฑเบ™เบ—เบถเบเบขเบนเปˆเบ—เบตเปˆ 00: 00: 00.000", เบ—เปˆเบฒเบ™เบšเปเปˆเบ„เบงเบ™เป€เบฎเบฑเบ”เปเบ™เบงเบ™เบตเป‰. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒ, เบ—เปˆเบฒเบ™เบšเปเปˆเบ„เบงเบ™เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบเปเบฅเบฐเบ™เบตเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป€เบเบตเบ”เบ‚เบถเป‰เบ™. เปเบ•เปˆเบ–เป‰เบฒเบชเบดเปˆเบ‡เบ™เบตเป‰เป€เบเบตเบ”เบ‚เบทเป‰เบ™, เปƒเบซเป‰เปƒเบŠเป‰เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบกเบตเบ”เบฑเบ”เบชเบฐเบ™เบตเบ‚เบฐเบซเบเบฒเบ.

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

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™