PostgreSQL Antipatterns: แƒœแƒแƒ•แƒ˜แƒ’แƒแƒชแƒ˜แƒ แƒ แƒ”แƒ”แƒกแƒขแƒ แƒจแƒ˜

แƒ“แƒฆแƒ”แƒก SQL-แƒจแƒ˜ แƒแƒ  แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ แƒ—แƒฃแƒšแƒ˜ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ“แƒแƒฎแƒ•แƒ”แƒฌแƒ˜แƒšแƒ˜ แƒแƒšแƒ’แƒแƒ แƒ˜แƒ—แƒ›แƒ”แƒ‘แƒ˜. แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒซแƒแƒšแƒ˜แƒแƒœ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ, แƒ™แƒแƒžแƒ˜แƒขแƒแƒœ แƒชแƒฎแƒแƒ“แƒ˜ แƒ“แƒแƒœแƒ”แƒ–แƒ” - แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒแƒ— แƒฆแƒแƒœแƒ˜แƒกแƒซแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ แƒ”แƒ”แƒกแƒขแƒ แƒ˜แƒก แƒœแƒแƒฎแƒ•แƒ แƒ“แƒแƒšแƒแƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ“แƒ แƒแƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—.

แƒแƒœแƒฃ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜ แƒแƒ แƒ˜แƒก แƒœแƒ˜แƒจแƒแƒœแƒ˜ 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. OFFSET

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

แƒกแƒแƒ˜แƒ“แƒแƒœ แƒ’แƒแƒฉแƒœแƒ“แƒ แƒœแƒแƒ›แƒ”แƒ แƒ˜ 26? แƒ”แƒก แƒแƒ แƒ˜แƒก แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒ•แƒแƒ แƒแƒฃแƒ“แƒ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ แƒ”แƒ แƒ—แƒ˜ แƒ”แƒ™แƒ แƒแƒœแƒ˜แƒก แƒจแƒ”แƒกแƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“. แƒฃแƒคแƒ แƒ แƒ–แƒฃแƒกแƒขแƒแƒ“, 25 แƒœแƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ˜ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜, แƒžแƒšแƒฃแƒก 1, แƒ แƒแƒช แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒ”แƒ‘แƒก แƒ˜แƒ›แƒแƒ–แƒ”, แƒ แƒแƒ› แƒกแƒฃแƒš แƒชแƒแƒขแƒ แƒกแƒฎแƒ•แƒ แƒ แƒแƒ›แƒ”แƒ แƒœแƒ˜แƒ›แƒฃแƒจแƒจแƒ˜ แƒ“แƒ แƒแƒ–แƒ แƒ˜ แƒแƒฅแƒ•แƒก แƒ’แƒแƒ“แƒแƒแƒ“แƒ’แƒ˜แƒšแƒ”แƒ‘แƒแƒก.

แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒ”แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ แƒแƒ  แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ "แƒจแƒ”แƒ™แƒ”แƒ แƒ˜แƒšแƒ˜" แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒกแƒฎแƒ”แƒฃแƒšแƒจแƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ’แƒแƒ“แƒแƒ”แƒชแƒ”แƒ›แƒ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒก. แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, PostgreSQL แƒ’แƒแƒœแƒ แƒ˜แƒ’แƒก แƒแƒ  แƒจแƒ”แƒ”แƒซแƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ”แƒงแƒ แƒ“แƒœแƒแƒก แƒชแƒแƒ“แƒœแƒแƒก, แƒ แƒแƒ› แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒจแƒ”แƒ“แƒแƒ แƒ”แƒ‘แƒ˜แƒ— แƒชแƒแƒขแƒ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ - แƒ“แƒ แƒแƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒแƒ˜แƒ แƒฉแƒ”แƒ•แƒก แƒแƒ แƒแƒ”แƒคแƒ”แƒฅแƒขแƒฃแƒ  แƒ’แƒ”แƒ’แƒ›แƒแƒก.

แƒ“แƒ แƒกแƒแƒœแƒแƒ› แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒจแƒ˜, แƒ แƒ”แƒ”แƒกแƒขแƒ แƒ˜แƒก แƒœแƒแƒฎแƒ•แƒ แƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ“แƒ”แƒ‘แƒ แƒ•แƒ˜แƒ–แƒฃแƒแƒšแƒฃแƒ  โ€žแƒ’แƒ•แƒ”แƒ แƒ“แƒ”แƒ‘แƒกโ€œ แƒจแƒแƒ แƒ˜แƒก แƒ’แƒแƒ“แƒแƒ แƒ—แƒ•แƒ˜แƒ—, แƒ“แƒ˜แƒ“แƒ˜ แƒฎแƒœแƒ˜แƒก แƒ’แƒแƒœแƒ›แƒแƒ•แƒšแƒแƒ‘แƒแƒจแƒ˜ แƒ•แƒ”แƒ แƒแƒ•แƒ˜แƒœ แƒจแƒ”แƒœแƒ˜แƒจแƒœแƒแƒ•แƒก แƒ แƒแƒ˜แƒ›แƒ” แƒกแƒแƒ”แƒญแƒ•แƒแƒก. แƒ–แƒฃแƒกแƒขแƒแƒ“ แƒ˜แƒ› แƒ›แƒแƒ›แƒ”แƒœแƒขแƒแƒ›แƒ“แƒ”, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ›แƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒฃแƒšแƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ‘แƒ แƒซแƒแƒšแƒแƒจแƒ˜ UI/UX แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒก แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ˜แƒก แƒ’แƒแƒ“แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒแƒก โ€žแƒ’แƒแƒฃแƒ—แƒแƒ•แƒ”แƒ‘แƒ”แƒš แƒ’แƒแƒ“แƒแƒฎแƒ•แƒ”แƒ•แƒแƒ–แƒ”โ€œ - แƒแƒœแƒฃ, แƒ แƒ”แƒ”แƒกแƒขแƒ แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ แƒจแƒ”แƒ“แƒ’แƒ”แƒœแƒ˜แƒšแƒ˜แƒ แƒ”แƒ แƒ— แƒกแƒ˜แƒแƒจแƒ˜, แƒ แƒแƒ›แƒšแƒ˜แƒ—แƒแƒช แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒ’แƒแƒ“แƒแƒแƒฎแƒ•แƒ˜แƒแƒก แƒ–แƒ”แƒ›แƒแƒ— แƒ“แƒ แƒฅแƒ•แƒ”แƒ›แƒแƒ—.

แƒแƒกแƒ” แƒ แƒแƒ›, แƒ›แƒแƒ›แƒ“แƒ”แƒ•แƒœแƒ แƒขแƒ”แƒกแƒขแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒแƒก แƒ—แƒฅแƒ•แƒ”แƒœ แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒšแƒ˜ แƒฎแƒแƒ แƒ— แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒฃแƒ‘แƒšแƒ˜แƒ แƒ”แƒ‘แƒ แƒ แƒ”แƒ”แƒกแƒขแƒ แƒจแƒ˜. แƒ แƒแƒขแƒแƒ›, แƒ แƒแƒ“แƒ’แƒแƒœ แƒชแƒฎแƒ แƒ˜แƒšแƒก แƒแƒฅแƒ•แƒก แƒœแƒแƒ แƒ›แƒแƒšแƒฃแƒ แƒ˜ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜ (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 แƒ›แƒแƒ“แƒ˜แƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒ—แƒแƒœ แƒ“แƒ "แƒ›แƒแƒฎแƒแƒ แƒฃแƒšแƒ˜แƒ" แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒ— แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒฏแƒแƒฏแƒแƒฎแƒ”แƒ—แƒแƒ“ แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒแƒ•แƒ”แƒœ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒก แƒ—แƒแƒ•แƒ˜แƒแƒœแƒ—แƒ˜ 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: แƒœแƒแƒ•แƒ˜แƒ’แƒแƒชแƒ˜แƒ แƒ แƒ”แƒ”แƒกแƒขแƒ แƒจแƒ˜

แƒ แƒแƒ“แƒ’แƒแƒœ แƒแƒฎแƒšแƒ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒœแƒ˜แƒ›แƒฃแƒจแƒก แƒแƒ  แƒแƒฅแƒ•แƒก แƒ แƒแƒ˜แƒ›แƒ” แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒ˜ "แƒ“แƒแƒกแƒแƒฌแƒงแƒ˜แƒกแƒ˜", แƒ›แƒแƒจแƒ˜แƒœ แƒแƒ แƒแƒคแƒ”แƒ แƒ˜ แƒ’แƒ•แƒ˜แƒจแƒšแƒ˜แƒก แƒฎแƒ”แƒšแƒก แƒแƒ› แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก โ€žแƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒแƒจแƒ˜โ€œ แƒกแƒแƒžแƒ˜แƒ แƒ˜แƒกแƒžแƒ˜แƒ แƒ แƒ›แƒ˜แƒ›แƒแƒ แƒ—แƒฃแƒšแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒ แƒ’แƒแƒœแƒ•แƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒแƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒšแƒแƒ™แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ˜แƒœแƒแƒ›แƒ˜แƒฃแƒ แƒ˜ แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ โ€žแƒกแƒแƒชแƒœแƒแƒ‘แƒแƒ แƒ แƒฌแƒ”แƒ แƒขแƒ˜แƒšแƒ˜แƒ“แƒแƒœโ€œ แƒแƒ แƒ˜แƒ•แƒ” แƒ›แƒ˜แƒ›แƒแƒ แƒ—แƒฃแƒšแƒ”แƒ‘แƒ˜แƒ— - แƒ แƒแƒ’แƒแƒ แƒช แƒฅแƒ•แƒ”แƒ›แƒแƒ—, แƒแƒกแƒ”แƒ•แƒ” แƒ–แƒ”แƒ›แƒแƒ—.

แƒจแƒ”แƒœแƒ˜แƒจแƒ•แƒœแƒ:

  1. แƒ“แƒ˜แƒแƒฎ, แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒแƒ แƒฏแƒ”แƒ  แƒ•แƒฌแƒ•แƒ“แƒ”แƒ‘แƒ˜แƒ— แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ "แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜แƒ—". แƒแƒ›แƒ˜แƒขแƒแƒ›, แƒฅแƒ•แƒ”แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ’แƒแƒ›แƒแƒ˜แƒฌแƒ•แƒ”แƒ•แƒก แƒ”แƒ แƒ—แƒ˜ แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜แƒก แƒกแƒ™แƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒ.
  2. แƒแƒจแƒ™แƒแƒ แƒแƒ, แƒ แƒแƒ› แƒแƒ› แƒขแƒ”แƒฅแƒœแƒ˜แƒ™แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ›แƒแƒจแƒ˜แƒœ, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ—แƒฅแƒ•แƒ”แƒœ แƒ’แƒแƒฅแƒ•แƒ— แƒฆแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜ ts แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ“แƒแƒ™แƒ•แƒ”แƒ—แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ˜แƒ— แƒ“แƒ แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒ›แƒแƒ—แƒ’แƒแƒœแƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก. แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒขแƒ˜แƒžแƒ˜แƒฃแƒ แƒ˜ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒ โ€žแƒ›แƒ˜แƒšแƒ˜แƒแƒœแƒ˜ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ 00:00:00.000 แƒกแƒแƒแƒ—แƒ–แƒ”โ€œ, แƒ”แƒก แƒแƒ  แƒฃแƒœแƒ“แƒ แƒ’แƒแƒแƒ™แƒ”แƒ—แƒแƒ—. แƒ•แƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒแƒ‘, แƒแƒ  แƒฃแƒœแƒ“แƒ แƒ“แƒแƒฃแƒจแƒ•แƒแƒ— แƒแƒกแƒ”แƒ—แƒ˜ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ—แƒฃ แƒ”แƒก แƒ›แƒแƒฎแƒ“แƒ”แƒ‘แƒ, แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜ แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜แƒ—.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ