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 เดจเดฟเด™เตเด™เดณเตเดŸเต† เด…เดŸเตเด•เตเด•เตฝ เดตเดฐเตเดจเตเดจเต, เดจเดฟเด™เตเด™เดณเตเดŸเต† เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เดณเดฟเตฝ "เดธเดจเตเดคเต‹เดทเดฎเตเดฃเตเดŸเต" เด…เดตเตผ เด…เดตเดฐเตเดŸเต† 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 เด†เดจเตเดฑเดฟเดชเดพเดฑเตเดฑเต‡เดฃเตเด•เตพ: เดฐเดœเดฟเดธเตเดŸเตเดฐเดฟ เดจเดพเดตเดฟเด—เต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เด•เดพเดฐเดฃเด‚ เด‡เดชเตเดชเต‹เตพ เดจเดฎเตเด•เตเด•เตเดฃเตเดŸเต เดธเดพเดฎเตเดชเดฟเดณเดฟเดจเต เดชเตเดฐเดคเตเดฏเต‡เด• "เด†เดฐเด‚เดญเด‚" เด‡เดฒเตเดฒ, เด…เดชเตเดชเต‹เตพ เดˆ เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดตเดฟเดชเดฐเต€เดค เดฆเดฟเดถเดฏเดฟเตฝ "เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเตฝ" เดจเดฟเดจเตเดจเตเด‚ "เดฑเดซเดฑเตปเดธเต เดชเต‹เดฏเดฟเดจเตเดฑเดฟเตฝ" เดจเดฟเดจเตเดจเต เดกเดพเดฑเตเดฑ เดฌเตเดฒเต‹เด•เตเด•เตเด•เดณเตเดŸเต† เดกเตˆเดจเดพเดฎเดฟเด•เต เดฒเต‹เดกเดฟเด‚เด—เต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเตเด‚ เด’เดจเตเดจเตเด‚ เดžเด™เตเด™เดณเต† เดคเดŸเดฏเตเดจเตเดจเดฟเดฒเตเดฒ - เดคเดพเดดเต‡เด•เตเด•เตเด‚ เดฎเตเด•เดณเดฟเดฒเต‡เด•เตเด•เตเด‚.

เด•เตเดฑเดฟเดชเตเดชเต

  1. เด…เดคเต†, เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ เดžเด™เตเด™เตพ เดฐเดฃเตเดŸเตเดคเดตเดฃ เดธเต‚เดšเดฟเด•เดฏเดฟเดฒเต‡เด•เตเด•เต เดชเตเดฐเดตเต‡เดถเดฟเด•เตเด•เตเดจเตเดจเต, เดŽเดจเตเดจเดพเตฝ เดŽเดฒเตเดฒเดพเด‚ "เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏเตเด‚ เดธเต‚เดšเดฟเด• เดชเตเดฐเด•เดพเดฐเด‚" เด†เดฃเต. เด…เดคเดฟเดจเดพเตฝ, เด’เดฐเต เด‰เดชเดšเต‹เดฆเตเดฏเด‚ เดฎเดพเดคเตเดฐเดฎเต‡ เดซเดฒเดฎเตเดฃเตเดŸเดพเด•เต‚ เด’เดฐเต เด…เดงเดฟเด• เดธเต‚เดšเดฟเด•เดฏเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดคเตเดฐเด‚ เดธเตเด•เดพเตป เดšเต†เดฏเตเดฏเตเด•.
  2. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฎเต‚เดฒเตเดฏเด™เตเด™เตพ เด‰เดณเตเดณเดชเตเดชเต‹เตพ เดฎเดพเดคเตเดฐเดฎเต‡ เดˆ เดธเดพเด™เตเด•เต‡เดคเดฟเด•เดตเดฟเดฆเตเดฏ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเต‚ เดŽเดจเตเดจเดคเต เดตเดณเดฐเต† เดตเตเดฏเด•เตเดคเดฎเดพเดฃเต ts เด†เด•เดธเตเดฎเดฟเด•เดฎเดพเดฏเดฟ เดฎเดพเดคเตเดฐเดฎเต‡ เด•เดŸเด•เตเด•เดพเตป เด•เดดเดฟเดฏเต‚, เด•เต‚เดŸเดพเดคเต† เด…เดตเดฏเดฟเตฝ เดชเดฒเดคเตเด‚ เด‡เดฒเตเดฒ. เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเดพเดงเดพเดฐเดฃ เด•เต‡เดธเต "00:00:00.000 เดจเต เด’เดฐเต เดฆเดถเดฒเด•เตเดทเด‚ เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เตพ" เด†เดฃเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพ เด‡เดคเต เดšเต†เดฏเตเดฏเดพเตป เดชเดพเดŸเดฟเดฒเตเดฒ. เดžเดพเตป เด‰เดฆเตเดฆเต‡เดถเดฟเด•เตเด•เตเดจเตเดจเดคเต, เด…เดคเตเดคเดฐเดฎเตŠเดฐเต เด•เต‡เดธเต เดธเด‚เดญเดตเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เตพ เด…เดจเตเดตเดฆเดฟเด•เตเด•เดฐเตเดคเต. เดŽเดจเตเดจเดพเตฝ เด‡เดคเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เด’เดฐเต เดตเดฟเดชเตเดฒเต€เด•เตƒเดค เดธเต‚เดšเดฟเด• เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด“เดชเตเดทเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•