PostgreSQL Antipatterns: "рдореГрдд" рднреАрдбрд╝ рд╕реЗ рд▓рдбрд╝рдиреЗ

рдЖрдВрддрд░рд┐рдХ PostgreSQL рддрдВрддреНрд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЗрд╕реЗ рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬ рд╣реЛрдиреЗ рджреЗрддреА рд╣реИрдВ рдФрд░ рджреВрд╕рд░реЛрдВ рдореЗрдВ рдЗрддрдиреА рддреЗрдЬреА рд╕реЗ рдирд╣реАрдВред рдЖрдЬ рд╣рдо рдбреАрдмреАрдПрдордПрд╕ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмреАрдЪ рд╕рдВрдШрд░реНрд╖ рдХреЗ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ - UPDATE рдмрдирд╛рдо MVCS рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ ред

рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд▓реЗрдЦ рд╕реЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╕рд╛рдЬрд┐рд╢ :
рдЬрдм рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ UPDATE рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рджреЛ рдСрдкрд░реЗрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ: DELETE рдФрд░ INSERTред рд▓рд╛рдЗрди рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ , xmax рдХреЛ рдЙрд╕ рд▓реЗрдирджреЗрди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ UPDATE рдХреЛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдлрд┐рд░ рдЙрд╕реА рд▓рд╛рдЗрди рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдЗрд╕рдХрд╛ xmin рдорд╛рди рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ xmax рдорд╛рди рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
рдЗрд╕ рд▓реЗрди-рджреЗрди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдХреБрдЫ рд╕рдордп рдмрд╛рдж, рдкреБрд░рд╛рдиреЗ рдпрд╛ рдирдП рд╕рдВрд╕реНрдХрд░рдг, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ COMMIT/ROOLBACK, рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдФрд░ рд╕рд╛рдл рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж "рдореГрдд" (рдореГрдд рдЯреБрдкрд▓реНрд╕) рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ VACUUMред



рд▓реЗрдХрд┐рди рдпрд╣ рддреБрд░рдВрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди "рдореГрдд" рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдПрдХ рдмрдбрд╝реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдХрдИ рдпрд╛ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЕрдкрдбреЗрдЯ рдХреЗ рд╕рд╛рде , рдФрд░ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж, рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдХрд┐ VACUUM рдорджрдж рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ ред

# 1: рдореИрдВ рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ


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

UPDATE tbl SET X = <newX> WHERE pk = $1;

рдлрд┐рд░, рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдпрд╣ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИ, рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рдИ рдХреНрд╖реЗрддреНрд░ рдХреЛ рднреА рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

UPDATE tbl SET Y = <newY> WHERE pk = $1;

... рдФрд░ рдлрд┐рд░ рдЬреЗрдб рднреА - рдХреНрдпреЛрдВ рдХреБрдЫ trifle?

UPDATE tbl SET Z = <newZ> WHERE pk = $1;

рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЕрдм рдЗрд╕ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдХрд┐рддрдиреЗ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВ? рд╣рд╛рдБ, 4 рдЯреБрдХрдбрд╝реЗ! рдЗрдирдореЗрдВ рд╕реЗ, рдПрдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рдФрд░ 3 рдХреЛ рдЖрдкрдХреЗ рд▓рд┐рдП [рдСрдЯреЛ] VACUUM рдЪреБрдирдирд╛ рд╣реЛрдЧрд╛ред

рдРрд╕рд╛ рдордд рдХрд░рдирд╛! рдПрдХ рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╕рднреА рдлрд╝реАрд▓реНрдб рдХреЗ рдЕрджреНрдпрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рд╡рд┐рдзрд┐ рдХрд╛ рддрд░реНрдХ рдЗрд╕ рддрд░рд╣ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

UPDATE tbl SET X = <newX>, Y = <newY>, Z = <newZ> WHERE pk = $1;

# 2: IS DISTINCT FROM, Luke рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ!


рдЗрд╕рд▓рд┐рдП, рдЖрдк рдЕрднреА рднреА рдХрдИ, рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХрдИ рд░рд┐рдХреЙрд░реНрдб (рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╛ рдХрдирд╡рд░реНрдЯрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рджреМрд░рд╛рди, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ ред рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдЙрдбрд╝рддрд╛ рд╣реИ:

UPDATE tbl SET X = <newX> WHERE pk BETWEEN $1 AND $2;

рд▓рдЧрднрдЧ рдЗрд╕ рд░реВрдк рдореЗрдВ, рдПрдХ рдХреНрд╡реЗрд░реА рдХрд╛ рд╕рд╛рдордирд╛ рдЕрдХреНрд╕рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдПрдХ рдЦрд╛рд▓реА рдирдП рдХреНрд╖реЗрддреНрд░ рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдбреЗрдЯрд╛ рдореЗрдВ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрдж рдбреЗрдЯрд╛ рдХреА рд╢реБрджреНрдзрддрд╛ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рд╡реНрдпрд░реНрде! рдпрд╣реА рд╣реИ, рд░рд┐рдХреЙрд░реНрдб рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рд╡рд╣реА рдерд╛ рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ - рдХреНрдпреЛрдВ? рд╕рд╣реА рдмрд╛рдд:

UPDATE tbl SET X = <newX> WHERE pk BETWEEN $1 AND $2 AND X IS DISTINCT FROM <newX>;

рдХрдИ рдРрд╕реЗ рдЕрджреНрднреБрдд рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ IS DISTINCT FROMрдЕрдиреНрдп рддрд╛рд░реНрдХрд┐рдХ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдзреЛрдЦрд╛ рдкрддреНрд░ рд╣реИ :

... рдФрд░ рдЬрдЯрд┐рд▓ ROW()рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ :

# 3: рдореИрдВ рдЕрдкрдиреЗ рдкреНрд░рд┐рдп рдХреЛ рдкрд╣рдЪрд╛рдиреВрдВрдЧрд╛ ... рдЕрд╡рд░реБрджреНрдз рдХрд░рдХреЗ


рджреЛ рд╕рдорд╛рди рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЪрд▓рд╛рдПрдВ , рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рдирд┐рд╢рд╛рди рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рд╣реИ, рдХрд┐ рдпрд╣ "рдСрдкрд░реЗрд╢рди рдореЗрдВ" рд╣реИ:

UPDATE tbl SET processing = TRUE WHERE pk = $1;

рднрд▓реЗ рд╣реА рдпреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реЛрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдЖрдИрдбреА рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░, рдЗрд╕ рдЕрдиреБрд░реЛрдз рдкрд░ рджреВрд╕рд░рд╛ рдЧреНрд░рд╛рд╣рдХ "рд▓реЗрди-рджреЗрди" рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдкрд╣рд▓рд╛ рд▓реЗрдирджреЗрди рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ред

рд╕рдорд╛рдзрд╛рди # 1 : рдХрд╛рд░реНрдп рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд▓рд┐рдП рдХрдо рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдмрд╕ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝реЗрдВ IS DISTINCT FROM:

UPDATE tbl SET processing = TRUE WHERE pk = $1 AND processing IS DISTINCT FROM TRUE;

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

рдирд┐рд░реНрдгрдп рд╕рдВрдЦреНрдпрд╛ 2 : рд╕рд▓рд╛рд╣рдХрд╛рд░ рддрд╛рд▓реЗ

рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛ рд╡рд┐рд╖рдп рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдЖрд╡реЗрджрди рдХреЗ рддрд░реАрдХреЛрдВ рдФрд░ рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреЗ рддрд╛рд▓реЗ рдХреЗ "рд░реЗрдХ" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ ред

рд╕рдорд╛рдзрд╛рди # 3 : рдмрд┐рдирд╛ [рдбреА] рд╕реНрдорд╛рд░реНрдЯ рдХреЙрд▓ рдХреЗ

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

All Articles