рдЖрдЬ 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. "рдХрд░реНрд╕рд░" рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ
рдХреБрдЫ рд╕рдордп рдмрд╛рдж, рдПрдХ рдбреАрдмреАрдП рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗ "рдкреНрд░рд╕рдиреНрди" рд╣реЛрддрд╛ рд╣реИ
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;
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ?
- рд╣рдо 25 рд░рд┐рдХреЙрд░реНрдб "рдбрд╛рдЙрди" рдХрд░рддреЗ рд╣реИрдВ рдФрд░ "рд╕реАрдорд╛" рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ
ts
. - рдпрджрд┐ рд╡рд╣рд╛рдВ рдкрд╣рд▓реЗ рд╕реЗ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рддреЛ NULL рдорд╛рди рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ
-infinity
. - рд╣рдо рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдп рдХреЗ рдмреАрдЪ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдкреВрд░реЗ рдЦрдВрдб рдХреЛ рдШрдЯрд╛рддреЗ рд╣реИрдВ
ts
рдФрд░ $1 рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдкрд╛рд░рд┐рдд рд╣реБрдЖ (рдкрд┐рдЫрд▓рд╛ "рдЕрдВрддрд┐рдо" рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди)ред - рдпрджрд┐ рдХреЛрдИ рдмреНрд▓реЙрдХ 26 рд╕реЗ рдХрдо рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рд╛рде рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдВрддрд┐рдо рд╣реИред
рдпрд╛ рд╡рд╣реА рдЪрд┐рддреНрд░:
рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ рдирдореВрдиреЗ рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ "рд╢реБрд░реБрдЖрдд" рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреБрдЫ рднреА рд╣рдореЗрдВ рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЛ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ "рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд" рдХрд░рдиреЗ рдФрд░ рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ "рд╕рдВрджрд░реНрдн рдмрд┐рдВрджреБ" рд╕реЗ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХреА рдЧрддрд┐рд╢реАрд▓ рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ - рджреЛрдиреЛрдВ рдиреАрдЪреЗ рдФрд░ рдКрдкрд░ред
рдЯрд┐рдкреНрдкрдгреА
- рд╣рд╛рдБ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рд╕реВрдЪрдХрд╛рдВрдХ рддрдХ рджреЛ рдмрд╛рд░ рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ "рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛" рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╕рдмрдХреНрд╡реЗрд░реА рдХрд╛ рд╣реА рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдВрдбреЗрдХреНрд╕ рдУрдирд▓реА рд╕реНрдХреИрди рдХреЗ рд▓рд┐рдП.
- рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдореВрд▓реНрдп рд╣реЛрдВ
ts
рдХреЗрд╡рд▓ рд╕рдВрдпреЛрдЧрд╡рд╢ рд╣реА рдкрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдирд╣реАрдВ рд╣реИрдВ. рдпрджрд┐ рдЖрдкрдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ "00:00:00.000 рдкрд░ рдПрдХ рд▓рд╛рдЦ рд░рд┐рдХреЙрд░реНрдб" рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдЖрдкрдХреЛ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реЛрдиреЗ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдЗрдВрдбреЗрдХреНрд╕ рд╡рд╛рд▓реЗ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рд╕реНрд░реЛрдд: www.habr.com