рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдореЗрдВ рддрд╛рд▓реЗ: рддрд╛рд▓реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ 7 рдЯрд┐рдкреНрд╕

рдлрд┐рд░ рд╕реЗ рдирдорд╕реНрдХрд╛рд░! рдЕрдЧрд▓реЗ рдордВрдЧрд▓рд╡рд╛рд░ рдХреЛ, "рд░рд┐рд▓реЗрд╢рдирд▓ рдбреАрдмреАрдПрдордПрд╕" рдкрд╛рдареНрдпрдХреНрд░рдо рдкрд░ рдПрдХ рдирдИ рдзрд╛рд░рд╛ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╡рд┐рд╖рдп рдкрд░ рдЙрдкрдпреЛрдЧреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВред



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

1. рдХрднреА рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде рдХреЙрд▓рдо рди рдЬреЛрдбрд╝реЗрдВ


рдЧреЛрд▓реНрдбрди рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдХреНрдпреВрдПрд▓ рдирд┐рдпрдо: рдЙрддреНрдкрд╛рджрди рдкрд░рд┐рд╡реЗрд╢ рдореЗрдВ рдЯреЗрдмрд▓ рдкрд░ рдПрдХ рдХреЙрд▓рдо рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рдХрднреА рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рди рдХрд░реЗрдВ ред

рдХреЙрд▓рдо рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдЖрдХреНрд░рд╛рдордХ рдЯреЗрдмрд▓ рд▓реЙрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рджреЛрдиреЛрдВ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрддрдВрдн рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ PostgreSQL рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджреЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдмрдбрд╝реА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдХрдИ рдШрдВрдЯреЗ рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рд╕рднреА рдЕрдиреБрд░реЛрдз рдЕрд╡рд░реБрджреНрдз рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдРрд╕рд╛ рди рдХрд░реЗрдВ:

--     ,       (?) ALTER TABLE items ADD COLUMN last_update timestamptz DEFAULT now(); 

рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд░реЗрдВ рдмреЗрд╣рддрд░:

 -- select, update, insert  delete ,      () ALTER TABLE items ADD COLUMN last_update timestamptz; -- select  insert ,  update  delete ,    UPDATE items SET last_update = now(); 

рдпрд╛, рдФрд░ рднреА рдмреЗрд╣рддрд░, рд▓рдВрдмреЗ рд╕рдордп рддрдХ рддрд╛рд▓реЗ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдФрд░ delete рд╕реЗ рдмрдЪреЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЫреЛрдЯреЗ рдмреИрдЪреЛрдВ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛:

 do { numRowsUpdated = executeUpdate( "UPDATE items SET last_update = ? " + "WHERE ctid IN (SELECT ctid FROM items WHERE last_update IS NULL LIMIT 5000)", now); } while (numRowsUpdate > 0); 

рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдХреЙрд▓рдо рдЬреЛрдбрд╝ рдФрд░ рдЖрдмрд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

2. рд▓реЙрдХ рдХрддрд╛рд░реЛрдВ рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ, рдЯрд╛рдЗрдордЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


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

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

рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдЦрд┐рд▓рд╛рдл рд▓рдВрдмреЗ рд╕рдордп рддрдХ SELECT рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдРрд╕рд╛ рди рдХрд░реЗрдВ:

 ALTER TABLE items ADD COLUMN last_update timestamptz; 

рдмреЗрд╣рддрд░ рдпрд╣ рдХрд░реЗрдВ:

 SET lock_timeout TO '2s' ALTER TABLE items ADD COLUMN last_update timestamptz; 

рдпрджрд┐ lock_timeout рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ lock_timeout рдбреАрдбреАрдПрд▓ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдпрд╣ рд▓реЙрдХ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░, 2 рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рддрд╛ рд╣реИред рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ ALTER TABLE рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдмрд╛рдж рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред DDL рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд▓рдВрдмреА рдкреВрдЫрддрд╛рдЫ рд╣реИ, рддреЛ рдЖрдк pg_stat_activity рдХреЛ рдХреНрд╡реЗрд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

3. рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


PostgreSQL рдХрд╛ рдПрдХ рдФрд░ рд╕реБрдирд╣рд░рд╛ рдирд┐рдпрдо: рд╣рдореЗрд╢рд╛ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рд╕реВрдЪрдХрд╛рдВрдХ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдПрдХ рдмрдбрд╝реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдиреЗ рдореЗрдВ рдШрдВрдЯреЗ рдпрд╛ рджрд┐рди рднреА рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд░реЗрдЧреБрд▓рд░ CREATE INDEX рдХрдорд╛рдВрдб рдХрдорд╛рдВрдб рдХреА рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕рднреА рд░рд┐рдХреЙрд░реНрдб рдХреЛ рд▓реЙрдХ рдХрд░ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдпрд╣ рд╕реЗрд▓реЗрдХреНрдЯреНрд╕ рдХреЛ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЕрднреА рднреА рдмрд╣реБрдд рдЦрд░рд╛рдм рд╣реИ, рдФрд░ рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ: CREATE INDEX CONCURRENTLY ред

рдРрд╕рд╛ рди рдХрд░реЗрдВ:

 --    CREATE INDEX items_value_idx ON items USING GIN (value jsonb_path_ops); 

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдХрд░реЗрдВ:

 --    DDL CREATE INDEX CONCURRENTLY items_value_idx ON items USING GIN (value jsonb_path_ops); 

рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд╣рд▓реВ рд╣реИред рдпрджрд┐ рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЕрдзреВрд░рд╛ ("рдЕрдорд╛рдиреНрдп") рд╕реВрдЪрдХрд╛рдВрдХ рдЫреЛрдбрд╝рддрд╛ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ, рдмрд╕ рджреМрдбрд╝реЗрдВ
 DROP INDEX CONCURRENTLY items_value_idx 
рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

4. рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрд╕рдВрднрд╡ рд╣реЛ рдЖрдХреНрд░рд╛рдордХ рддрд╛рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдЬрдм рдЖрдкрдХреЛ рдПрдХ рдЖрджреЗрд╢ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЖрдХреНрд░рд╛рдордХ рддрд╛рд▓рд┐рдХрд╛ рддрд╛рд▓реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд▓реЗрдирджреЗрди рдореЗрдВ рдЬрд┐рддрдиреА рджреЗрд░ рд╣реЛ рд╕рдХреЗ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЬрд╛рд░реА рд░рдЦрд╛ рдЬрд╛ рд╕рдХреЗред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдРрд╕рд╛ рди рдХрд░реЗрдВ:

 BEGIN; --     : TRUNCATE items; -  : \COPY items FROM 'newdata.csv' WITH CSV COMMIT; 

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдирдИ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдкреБрд░рд╛рдиреЗ рдХреЛ рдмрджрд▓реЗрдВ:

 BEGIN; CREATE TABLE items_new (LIKE items INCLUDING ALL); --  : \COPY items_new FROM 'newdata.csv' WITH CSV --     : DROP TABLE items; ALTER TABLE items_new RENAME TO items; COMMIT; 

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

 BEGIN; LOCK items IN EXCLUSIVE MODE; ... 

рдХрднреА-рдХрднреА рдЕрд╡рд░реБрджреНрдз рдХреЛ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рд▓реЗрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред

5. рдиреНрдпреВрдирддрдо рдмреНрд▓реЙрдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдЬреЛрдбрд╝рдирд╛


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

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

 ALTER TABLE items ADD PRIMARY KEY (id); --      

рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЖрдк CREATE UNIQUE INDEX CONCURRENTLY рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╣рд▓реЗ рд╕рднреА рдХрдард┐рди рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдЕрджреНрд╡рд┐рддреАрдп рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рддреНрд╡рд░рд┐рдд рдСрдкрд░реЗрд╢рди рд╣реИред

 CREATE UNIQUE INDEX CONCURRENTLY items_pk ON items (id); --   ,     ALTER TABLE items ADD CONSTRAINT items_pk PRIMARY KEY USING INDEX items_pk; --  ,   

рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рджреЛ рдЪрд░рдгреЛрдВ рдореЗрдВ рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╡рд┐рднрд╛рдЬрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

6. VACUUM FULL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрднреА рди рдХрд░реЗрдВ


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

 PLEASE FREEZE MY DATABASE FOR HOURS; 

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

7. рдЖрджреЗрд╢реЛрдВ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдХреЗ рдЧрддрд┐рд░реЛрдз рд╕реЗ рдмрдЪреЗрдВ


рдпрджрд┐ рдЖрдк рдХреБрдЫ рд╕рдордп рд╕реЗ PostgreSQL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрд╛ рд╣реИ рдЬреИрд╕реЗ:

 ERROR: deadlock detected DETAIL: Process 13661 waits for ShareLock on transaction 45942; blocked by process 13483. Process 13483 waits for ShareLock on transaction 45937; blocked by process 13661. 

рдпрд╣ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╕рдорд╡рд░реНрддреА рд▓реЗрдирджреЗрди рдПрдХ рд╣реА рддрд╛рд▓реЗ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдХреНрд░рдо рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд▓реЗрдирджреЗрди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред

 BEGIN; UPDATE items SET counter = counter + 1 WHERE key = 'hello'; --    hello UPDATE items SET counter = counter + 1 WHERE key = 'world'; --    world END; 

рдЙрд╕реА рд╕рдордп, рдПрдХ рдФрд░ рд▓реЗрдирджреЗрди рд╕рдорд╛рди рдЖрджреЗрд╢ рдЬрд╛рд░реА рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рдХреНрд░рдо рдореЗрдВред

 BEGIN UPDATE items SET counter = counter + 1 WHERE key = 'world'; --    world UPDATE items SET counter = counter + 1 WHERE key = 'hello'; --    hello END; 

рдпрджрд┐ рд▓реЗрдирджреЗрди рдХреЗ рдЗрди рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ рдФрд░ рдХрднреА рднреА рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рд▓рдЧрднрдЧ рдПрдХ рд╕реЗрдХрдВрдб рдореЗрдВ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реЗ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдирджреЗрди рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд░рджреНрдж рдХрд░ рджреЗрдЧрд╛ред рдЬрдм рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдкрд░ рдПрдХ рдирдЬрд╝рд░ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рд▓реЗрдирджреЗрди рдХреЛ рд╣рдореЗрд╢рд╛ рдЙрд╕реА рдХреНрд░рдо рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрджрд┐ рджреЛрдиреЛрдВ рд▓реЗрди-рджреЗрди рдкрд╣рд▓реЗ hello рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ, рддреЛ world , рдлрд┐рд░ рдкрд╣рд▓рд╛ рд▓реЗрдирджреЗрди hello рдкрд░ рджреВрд╕рд░рд╛ рд▓реЙрдХ рдХрд░реЗрдЧрд╛, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╡рд╣ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд╛рд▓реЗ рдХреЛ рдкрдХрдбрд╝ рд╕рдХреЗред
рдЕрдкрдиреЗ рд╕реБрдЭрд╛рд╡ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ!

рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпреЗ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рдорджрджрдЧрд╛рд░ рд▓рдЧреА рд╣реЛрдВрдЧреАред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдиреНрдп рд╕реБрдЭрд╛рд╡ рд╣реИрдВ, рддреЛ @citusdata рдпрд╛ рд╕реНрд▓реИрдХ рдкрд░ рд╣рдорд╛рд░реЗ рд╕рдХреНрд░рд┐рдп рд╕рд╛рдЗрдЯрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореБрджрд╛рдп рдХреЛ рдЯреНрд╡реАрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред

рд╣рдо рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рдШрдВрдЯреЛрдВ рдореЗрдВ рдПрдХ рдЦреБрд▓рд╛ рджрд┐рди рд╣реЛрдЧрд╛ рдЬрд┐рд╕ рдкрд░ рд╣рдо рдЖрдЧрд╛рдореА рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

Source: https://habr.com/ru/post/hi452986/


All Articles