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 рд╢реЗрдбреНрдпреВрд▓рд░ рдЗрд╕ рдЬреНрдЮрд╛рди рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдЧрд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдо рд░рд┐рдХреЙрд░реНрдб рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП - рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдЕрдкреНрд░рднрд╛рд╡реА рдпреЛрдЬрдирд╛ рдЪреБрди рд▓реЗрдЧрд╛ред

рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ, рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЛ рджреЗрдЦрдиреЗ рдХреЛ рд╡рд┐рдЬрд╝реБрдЕрд▓ "рдкреЗрдЬреЛрдВ" рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрд┐рд╕реА рдХреЛ рднреА рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХреБрдЫ рднреА рд╕рдВрджрд┐рдЧреНрдз рдирдЬрд╝рд░ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред рдареАрдХ рдЙрд╕ рдХреНрд╖рдг рддрдХ, рдЬрдм рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рдореЗрдВ, рдпреВрдЖрдИ/рдпреВрдПрдХреНрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ "рдЕрдВрддрд╣реАрди рд╕реНрдХреНрд░реЙрд▓" рдореЗрдВ рд░реАрдореЗрдХ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИ - рдЕрд░реНрдерд╛рдд, рд╕рднреА рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдПрдХ рд╣реА рд╕реВрдЪреА рдореЗрдВ рдЦреАрдВрдЪреА рдЬрд╛рддреА рд╣реИрдВ рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЕрдЧрд▓реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди, рдЖрдк рдкрдХрдбрд╝реЗ рдЬрд╛рдПрдВрдЧреЗ рдЕрднрд┐рд▓реЗрдЦреЛрдВ рдХрд╛ рджреЛрд╣рд░рд╛рд╡ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ. рдХреНрдпреЛрдВ, рдХреНрдпреЛрдВрдХрд┐ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИ (ts), рдЖрдкрдХреА рдХреНрд╡реЗрд░реА рдХрд┐рд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ?

рдмрд┐рд▓реНрдХреБрд▓ рдЗрд╕рд▓рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЙрд╕ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ ts рдХреЛрдИ рдЕрдиреЛрдЦреА рдХреБрдВрдЬреА рдирд╣реАрдВ рд╣реИ рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ. рджрд░рдЕрд╕рд▓, рдФрд░ рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдЕрджреНрд╡рд┐рддреАрдп рдирд╣реАрдВ рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХрд┐рд╕реА рднреА "рд╕рдордп" рдХреА рддрд░рд╣ - рдЗрд╕рд▓рд┐рдП, рд╕рдорд╛рди рдХреБрдВрдЬреА рдорд╛рди рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рдПрдХ рдЕрд▓рдЧ рдЕрдВрддрд┐рдо рдХреНрд░рдо рдХреЗ рдХрд╛рд░рдг рджреЛ рдЖрд╕рдиреНрди рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рдПрдХ рд╣реА рд░рд┐рдХреЙрд░реНрдб рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдкреГрд╖реНрда рд╕реЗ рджреВрд╕рд░реЗ рдкреГрд╖реНрда рдкрд░ "рдХреВрдж" рдЬрд╛рддрд╛ рд╣реИред

рджрд░рдЕрд╕рд▓, рдпрд╣рд╛рдВ рдПрдХ рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рднреА рдЫрд┐рдкреА рд╣реБрдИ рд╣реИ, рдЬрд┐рд╕реЗ рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рдЬреНрдпрд╛рджрд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ - рдХреБрдЫ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рдЬрд╛рдПрдВрдЧреА рдмрд┐рд▓реНрдХреБрд▓ рднреА! рдЖрдЦрд╝рд┐рд░рдХрд╛рд░, "рдбреБрдкреНрд▓рд┐рдХреЗрдЯ" рд░рд┐рдХреЙрд░реНрдб рдиреЗ рдХрд┐рд╕реА рдФрд░ рдХреА рдЬрдЧрд╣ рд▓реЗ рд▓реАред рд╕реБрдВрджрд░ рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╣рд╛рдБ рдкрдврд╝реЗрдВ.

рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░

рдПрдХ рдЪрд╛рд▓рд╛рдХ рдбреЗрд╡рд▓рдкрд░ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдХреБрдВрдЬреА рдХреЛ рдЕрджреНрд╡рд┐рддреАрдп рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрджреНрд╡рд┐рддреАрдп рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкреАрдХреЗ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рд╣реИ:

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

рдФрд░ рдЕрдиреБрд░реЛрдз рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ:

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

#2. "рдХрд░реНрд╕рд░" рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ

рдХреБрдЫ рд╕рдордп рдмрд╛рдж, рдПрдХ рдбреАрдмреАрдП рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗ "рдкреНрд░рд╕рдиреНрди" рд╣реЛрддрд╛ рд╣реИ рд╡реЗ рдЕрдкрдиреЗ OFFSET рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдХреЛ рдирд░рдХ рдХреА рддрд░рд╣ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рджрд┐рдЦрд╛рдП рдЧрдП рдЕрдВрддрд┐рдо рдорд╛рди рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди. рдЖрдкрдХреА рдХреНрд╡реЗрд░реА рдлрд┐рд░ рд╕реЗ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ:

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

рдЙрд╕рдХреЗ рдЖрдиреЗ рддрдХ рдЖрдкрдиреЗ рд░рд╛рд╣рдд рдХреА рд╕рд╛рдВрд╕ рд▓реА...

#3. рд╕рдлрд╛рдИ рд╕реВрдЪрдХрд╛рдВрдХ

рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рджрд┐рди рдЖрдкрдХрд╛ рдбреА.рдмреА.рдП. рдкрдврд╝ рдЧрдпрд╛ рдЕрдкреНрд░рднрд╛рд╡реА рд╕реВрдЪрдХрд╛рдВрдХ рдЦреЛрдЬрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рдФрд░ рдЗрд╕рдХрд╛ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ "рдирд╡реАрдирддрдо рдирд╣реАрдВ" рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ. рдФрд░ рдореИрдВ рдлрд┐рд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрдпрд╛ - рдЕрдм рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд┐ рд╡рд╣ рд╕реВрдЪрдХрд╛рдВрдХ рдЕрднреА рднреА рд╡рд╛рдкрд╕ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП (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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ