PostgreSQL เชเชจเซเชŸเชฟเชชเซ‡เชŸเชฐเซเชจ: เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€ เชจเซ‡เชตเชฟเช—เซ‡เชŸ เช•เชฐเชตเซเช‚

เช†เชœเซ‡ 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. เช“เชซเชธเซ‡เชŸ

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 เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เช†เชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเชฎเชพเชฐเซ€ เชตเชฟเชจเช‚เชคเซ€เช“เชฅเซ€ "เชชเซเชฐเชธเชจเซเชจ" เชฅเชพเชฏ เช›เซ‡ เชคเซ‡เช“ เชคเซ‡เชฎเชจเชพ เช“เชซเชธเซ‡เชŸ เชจเชฟเชฏเชฎเซ‹ เชธเชพเชฅเซ‡ เชธเชฐเซเชตเชฐเชจเซ‡ เชจเชฐเช•เชจเซ€ เชœเซ‡เชฎ เชฒเซ‹เชก เช•เชฐเซ‡ เช›เซ‡, เช…เชจเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เช† เชชเชฐ เชธเซเชตเชฟเชš เช•เชฐเชตเชพเชจเซ‹ เชธเชฎเชฏ เช›เซ‡ เชฌเชคเชพเชตเซ‡เชฒ เช›เซ‡เชฒเซเชฒเชพ เชฎเซ‚เชฒเซเชฏเชฎเชพเช‚เชฅเซ€ เชจเซ‡เชตเชฟเช—เซ‡เชถเชจ. เชคเชฎเชพเชฐเซ€ เช•เซเชตเซ‡เชฐเซ€ เชซเชฐเซ€ เชชเชฐเชฟเชตเชฐเซเชคเชฟเชค เชฅเชพเชฏ เช›เซ‡:

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 เชเชจเซเชŸเชฟเชชเซ‡เชŸเชฐเซเชจ: เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€ เชจเซ‡เชตเชฟเช—เซ‡เชŸ เช•เชฐเชตเซเช‚

เช•เชพเชฐเชฃ เช•เซ‡ เชนเชตเซ‡ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เช›เซ‡ เชจเชฎเซ‚เชจเชพเชฎเชพเช‚ เช•เซ‹เชˆ เชšเซ‹เช•เซเช•เชธ "เชถเชฐเซ‚เช†เชค" เชจเชฅเซ€, เชคเซ‹ เชชเช›เซ€ เช† เชตเชฟเชจเช‚เชคเชฟเชจเซ‡ เชตเชฟเชฐเซเชฆเซเชง เชฆเชฟเชถเชพเชฎเชพเช‚ "เชตเชฟเชธเซเชคเชฐเชฃ" เช•เชฐเชตเชพเชฅเซ€ เช…เชจเซ‡ "เชธเช‚เชฆเชฐเซเชญ เชฌเชฟเช‚เชฆเซ" เชฅเซ€ เชกเซ‡เชŸเชพ เชฌเซเชฒเซ‹เช•เชจเชพ เช—เชคเชฟเชถเซ€เชฒ เชฒเซ‹เชกเชฟเช‚เช—เชจเซ‡ เชฌเช‚เชจเซ‡ เชฆเชฟเชถเชพเชฎเชพเช‚ - เชจเซ€เชšเซ‡ เช…เชจเซ‡ เช‰เชชเชฐ เชฌเช‚เชจเซ‡เชฎเชพเช‚ เช…เชฎเชฒเชฎเชพเช‚ เช•เชฐเชตเชพเชฅเซ€ เช…เชฎเชจเซ‡ เช•เช‚เชˆเชชเชฃ เช…เชŸเช•เชพเชตเชคเซเช‚ เชจเชฅเซ€.

เชจเซ‹เช‚เชง

  1. เชนเชพ, เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เช†เชชเชฃเซ‡ เช‡เชจเซเชกเซ‡เช•เซเชธเชจเซ‡ เชฌเซ‡ เชตเชพเชฐ เชเช•เซเชธเซ‡เชธ เช•เชฐเซ€เช เช›เซ€เช, เชชเชฐเช‚เชคเซ เชฌเชงเซเช‚ เชœ โ€œเช•เซ‡เชตเชณ เช‡เชจเซเชกเซ‡เช•เซเชธ เชฆเซเชตเชพเชฐเชพโ€ เช›เซ‡. เชคเซ‡เชฅเซ€, เชธเชฌเช•เซเชตเซ‡เชฐเซ€ เชฎเชพเชคเซเชฐ เชชเชฐเชฟเชฃเชฎเชถเซ‡ เชฎเชพเชคเซเชฐ เชเช• เชตเชงเชพเชฐเชพเชจเชพ เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพ เชฎเชพเชŸเซ‡ เชธเซเช•เซ‡เชจ เช•เชฐเซ‹.
  2. เชคเซ‡ เชเช•เชฆเชฎ เชธเซเชชเชทเซเชŸ เช›เซ‡ เช•เซ‡ เช† เชคเช•เชจเซ€เช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชคเซเชฏเชพเชฐเซ‡ เชœ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡ เชœเซเชฏเชพเชฐเซ‡ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชฎเซ‚เชฒเซเชฏเซ‹ เชนเซ‹เชฏ ts เชฎเชพเชคเซเชฐ เชคเช• เชฆเซเชตเชพเชฐเชพ เชชเชพเชฐ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡, เช…เชจเซ‡ เชคเซ‡เชฎเชพเช‚เชจเชพ เช˜เชฃเชพ เชจเชฅเซ€. เชœเซ‹ เชคเชฎเชพเชฐเซ‹ เชฒเชพเช•เซเชทเชฃเชฟเช• เช•เซ‡เชธ "00:00:00.000 เชชเชฐ เชเช• เชฎเชฟเชฒเชฟเชฏเชจ เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธ" เช›เซ‡, เชคเซ‹ เชคเชฎเชพเชฐเซ‡ เช† เช•เชฐเชตเซเช‚ เชœเซ‹เชˆเช เชจเชนเซ€เช‚. เชฎเชพเชฐเซ‹ เชฎเชคเชฒเชฌ เช›เซ‡ เช•เซ‡ เชคเชฎเชพเชฐเซ‡ เช†เชตเชพ เช•เชฟเชธเซเชธเชพ เชฌเชจเชตเชพ เชฆเซ‡เชตเชพ เชœเซ‹เชˆเช เชจเชนเซ€เช‚. เชชเชฐเช‚เชคเซ เชœเซ‹ เช†เชตเซเช‚ เชฅเชพเชฏ, เชคเซ‹ เชตเชฟเชธเซเชคเซƒเชค เช‡เชจเซเชกเซ‡เช•เซเชธ เชธเชพเชฅเซ‡ เชตเชฟเช•เชฒเซเชชเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹.

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

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