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;

#реи. "рдХрд░реНрд╕рд░" рд╡рд░ рд╕реНрд╡рд┐рдЪ рдХрд░рд╛

рдХрд╛рд╣реА рдХрд╛рд│рд╛рдирдВрддрд░, рдПрдХ DBA рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдпреЗрддреЛ рдЖрдгрд┐ рддреБрдордЪреНрдпрд╛ рд╡рд┐рдирдВрддреАрдмрджреНрджрд▓ "рдЦреБрд╢" рд╣реЛрддреЛ рддреЗ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдСрдлрд╕реЗрдЯ рдирд┐рдпрдорд╛рдВрд╕рд╣ рд╕рд░реНрд╡реНрд╣рд░рд▓рд╛ рдирд░рдХрд╛рд╕рд╛рд░рдЦреЗ рд▓реЛрдб рдХрд░рддрд╛рдд, рдЖрдгрд┐ рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рдпрд╛рд╡рд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдгреНрдпрд╛рдЪреА рд╡реЗрд│ рдЖрд▓реА рдЖрд╣реЗ рджрд╛рдЦрд╡рд▓реЗрд▓реНрдпрд╛ рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рдореВрд▓реНрдпрд╛рд╡рд░реВрди рдиреЗрд╡реНрд╣рд┐рдЧреЗрд╢рди. рддреБрдордЪреА рдХреНрд╡реЗрд░реА рдкреБрдиреНрд╣рд╛ рдмрджрд▓рддреЗ:

SELECT
  ...
WHERE
  (ts, id) < ($1, $2) -- ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨┐╨╛╨╗╤Г╤З╨╡╨╜╨╜╤Л╨╡ ╨╜╨░ ╨┐╤А╨╡╨┤╤Л╨┤╤Г╤Й╨╡╨╝ ╤И╨░╨│╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П
ORDER BY
  ts DESC, id DESC
LIMIT 26;

рддреЛ рдпреЗрдИрдкрд░реНрдпрдВрдд рддреВ рд╕реБрдЯрдХреЗрдЪрд╛ рдирд┐:рд╢реНрд╡рд╛рд╕ рд╕реЛрдбрд▓рд╛рд╕...

#рей. рд╕реНрд╡рдЪреНрдЫрддрд╛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ

рдХрд╛рд░рдг рдПрдХ рджрд┐рд╡рд╕ рддреБрдордЪрд╛ рдбреАрдмреАрдП рд╡рд╛рдЪрд▓рд╛ рдЕрдкреНрд░рднрд╛рд╡реА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╢реЛрдзрдгреНрдпрд╛рд╡рд┐рд╖рдпреА рд▓реЗрдЦ рдЖрдгрд┐ рддреЗ рд▓рдХреНрд╖рд╛рдд рдЖрд▓реЗ тАЬрдирд╡реАрдирддрдо рдирд╛рд╣реАтАЭ рдЯрд╛рдЗрдорд╕реНрдЯреЕрдореНрдк рдЪрд╛рдВрдЧрд▓рд╛ рдирд╛рд╣реА. рдЖрдгрд┐ рдореА рдкреБрдиреНрд╣рд╛ рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЖрд▓реЛ - рдЖрддрд╛ рддреНрдпрд╛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХрд╛рдд рдкрд░рдд рдпрд╛рд╡реЗ рдпрд╛ рд╡рд┐рдЪрд╛рд░рд╛рдиреЗ (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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛