PostgreSQL Antipatterns: рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдиреЗрднрд┐рдЧреЗрдЯ рдЧрд░реНрджреИ

рдЖрдЬ SQL рдорд╛ рдХреБрдиреИ рдЬрдЯрд┐рд▓ рдХреЗрд╕рд╣рд░реВ рд░ рдкрд░рд┐рд╖реНрдХреГрдд рдПрд▓реНрдЧреЛрд░рд┐рджрдорд╣рд░реВ рд╣реБрдиреЗрдЫреИрдирдиреНред рд╕рдмреИ рдХреБрд░рд╛ рдзреЗрд░реИ рд╕рд░рд▓ рд╣реБрдиреЗрдЫ, рдХрдкреНрддрд╛рди рд╕реНрдкрд╖реНрдЯ рдХреЛ рд╕реНрддрд░ рдорд╛ - рдпреЛ рдЧрд░реМрдВ рдШрдЯрдирд╛ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╣реЗрд░реНрджреИ рд╕рдордп рдЕрдиреБрд╕рд╛рд░ рдХреНрд░рдордмрджреНрдзред

рддреНрдпреЛ рд╣реЛ, рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рдПрдЙрдЯрд╛ рдЪрд┐рдиреНрд╣ рдЫ events, рд░ рдЙрдиреАрд╕рдБрдЧ рдПрдЙрдЯрд╛ рдХреНрд╖реЗрддреНрд░ рдЫ ts - рдареНрдпрд╛рдХреНрдХреИ рдЬреБрди рд╕рдордпрдорд╛ рд╣рд╛рдореА рдпреА рд░реЗрдХрд░реНрдбрд╣рд░реВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдкрдорд╛ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВ:

CREATE TABLE events(
  id
    serial
      PRIMARY KEY
, ts
    timestamp
, data
    json
);

CREATE INDEX ON events(ts DESC);

рдпреЛ рд╕реНрдкрд╖реНрдЯ рдЫ рдХрд┐ рд╣рд╛рдореАрд╕рдБрдЧ рддреНрдпрд╣рд╛рдБ рджрд░реНрдЬрдиреМрдВ рд░реЗрдХрд░реНрдбрд╣рд░реВ рдЫреИрдирдиреН, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдХреЗрд╣рд┐ рдлрд╛рд░рдо рдЪрд╛рд╣рд┐рдиреНрдЫ рдкреГрд╖реНрда рдиреЗрднрд┐рдЧреЗрд╕рди.

#режред "рдо рдореЗрд░реА рдЖрдорд╛рдХреЛ рдкреЛрдЧреНрд░реЛрдорд┐рд╕реНрдЯ рд╣реБрдБ"

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 рд╕рдБрдЧ "рдкреНрд░рддреНрдпрдХреНрд╖" рдХрд╛рд░реНрдпрдорд╛ рд╕реНрд╡рд┐рдЪ рдЧрд░реНрди рдЧрд╛рд╣реНрд░реЛ рд╣реБрди рд╕рдХреНрдЫред

рддрд░ рд╣рд╛рдореА рдердк рд╕рд╛рдорд╛рдиреНрдп рд░ рдХрдо рд╕реНрдкрд╖реНрдЯ рд╕рдорд╕реНрдпрд╛рд╣рд░реВрдорд╛ рдЬрд╛рдФрдВред

#резред рдЕрдлрд╕реЗрдЯ

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

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

рддреНрдпреЛ рдирдЖрдЙрдиреНрдЬреЗрд▓ рддрдкрд╛рдИрд▓реЗ рд░рд╛рд╣рддрдХреЛ рд╕рд╛рд╕ рдлреЗрд░реНрдиреБрднрдпреЛ ...

#рейред рд╕рд░рд╕рдлрд╛рдИ рд╕реВрдЪрдХрд╛рдВрдХ

рдХрд┐рдирднрдиреЗ рдПрдХ рджрд┐рди рддрдкрд╛рдИрдХреЛ 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 Antipatterns: рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдиреЗрднрд┐рдЧреЗрдЯ рдЧрд░реНрджреИ

рдХрд┐рдирднрдиреЗ рдЕрд╣рд┐рд▓реЗ рд╣рд╛рдореАрд╕рдБрдЧ рдЫ рдирдореВрдирд╛рдХреЛ рдХреБрдиреИ рд╡рд┐рд╢реЗрд╖ "рд╕реБрд░реБрд╡рд╛рдд" рдЫреИрди, рддреНрдпрд╕реЛрднрдП рдХреБрдиреИ рдкрдирд┐ рдХреБрд░рд╛рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдпреЛ рдЕрдиреБрд░реЛрдзрд▓рд╛рдИ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛рдорд╛ "рд╡рд┐рд╕реНрддрд╛рд░" рдЧрд░реНрди рд░ "рд╕рдиреНрджрд░реНрдн рдмрд┐рдиреНрджреБ" рдмрд╛рдЯ рдбрд╛рдЯрд╛ рдмреНрд▓рдХрд╣рд░реВрдХреЛ рдЧрддрд┐рд╢реАрд▓ рд▓реЛрдбрд┐рдЩ рд▓рд╛рдЧреВ рдЧрд░реНрдирдмрд╛рдЯ рд░реЛрдХреНрджреИрди - рджреБрдмреИ рджрд┐рд╢рд╛рдорд╛ - рддрд▓ рд░ рдорд╛рдерд┐ред

рдиреЛрдЯ

  1. рд╣реЛ, рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛ рд╣рд╛рдореА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рджреБрдИ рдкрдЯрдХ рдкрд╣реБрдБрдЪ рдЧрд░реНрдЫреМрдВ, рддрд░ рд╕рдмреИ рдХреБрд░рд╛ "рд╡рд┐рд╢реБрджреНрдз рд░реВрдкрдорд╛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛" рд╣реЛред рддреНрдпрд╕рдХрд╛рд░рдг, рд╕рдмрдХреНрд╡реЗрд░реА рдорд╛рддреНрд░ рдкрд░рд┐рдгрд╛рдо рд╣реБрдиреЗрдЫ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдорд╛рддреНрд░ рд╕реНрдХреНрдпрд╛рди рдЧрд░реНрди.
  2. рдпреЛ рдПрдХрджрдо рд╕реНрдкрд╖реНрдЯ рдЫ рдХрд┐ рдпреЛ рдкреНрд░рд╡рд┐рдзрд┐ рдорд╛рддреНрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рдЬрдм рддрдкрд╛рдИрдВрд╕рдБрдЧ рдорд╛рдирд╣рд░реВ рдЫрдиреН ts рд╕рдВрдпреЛрдЧрд▓реЗ рдорд╛рддреНрд░ рдкрд╛рд░ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рд░ рддреА рдордзреНрдпреЗ рдзреЗрд░реИ рдЫреИрдирдиреНред рдпрджрд┐ рддрдкрд╛рдЗрдБрдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХреЗрд╕ "00:00:00.000 рдорд╛ рдПрдХ рдорд┐рд▓рд┐рдпрди рд░реЗрдХрд░реНрдб" рд╣реЛ рднрдиреЗ, рддрдкрд╛рдЗрдБрд▓реЗ рдпреЛ рдЧрд░реНрдиреБ рд╣реБрдБрджреИрдиред рдореЗрд░реЛ рдорддрд▓рдм, рддрдкрд╛рдИрдВрд▓реЗ рдпрд╕реНрддреЛ рдШрдЯрдирд╛ рд╣реБрди рджрд┐рдиреБ рд╣реБрдБрджреИрдиред рддрд░ рдпрджрд┐ рдпреЛ рд╣реБрдиреНрдЫ рднрдиреЗ, рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рдХреЛ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдк рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди