DBA: рдЬрдм VACUUM рдЧреБрдЬрд░рддрд╛ рд╣реИ - рд╣рдо рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рд╛рдл рдХрд░рддреЗ рд╣реИрдВ

рдбрд╛рдХрдШрд░реЛрдВ рдореЗрдВ VACUUM рдПрдХ рдореЗрдЬ рд╕реЗ "рд╕рдлрд╛рдИ" рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХреЛрдИ рднреА рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ - рдЕрд░реНрдерд╛рдд, рдЗрди рд░рд┐рдХреЙрд░реНрдбреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╢реБрд░реВ рдХреА рдЧрдИ рдПрдХ рднреА рд╕рдХреНрд░рд┐рдп рдХреНрд╡реЗрд░реА рдирд╣реАрдВ рд╣реИред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдРрд╕рд╛ рдХреЛрдИ рдЕрдкреНрд░рд┐рдп рдкреНрд░рдХрд╛рд░ (рдУрдПрд▓рдЯреАрдкреА рдЖрдзрд╛рд░ рдкрд░ рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рдУрдПрд▓рдПрдкреА рд▓реЛрдб) рд╣реИ? рд▓рдВрдмреЗ рдкреНрд░рд╢реНрдиреЛрдВ рд╕реЗ рдШрд┐рд░реЗ рдПрдХ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдмрджрд▓рддреЗ рдЯреЗрдмрд▓ рдХреЛ рдХреИрд╕реЗ рд╕рд╛рдл рдХрд░реЗрдВ рдФрд░ рдПрдХ рд░реЗрдХ рдкрд░ рдХрджрдо рди рд░рдЦреЗрдВ?



рд╣рдордиреЗ рдПрдХ рд░реЗрдХ рдлреИрд▓рд╛рдпрд╛


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЬрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рдо рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рдХреИрд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рд╕реНрдерд┐рддрд┐ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЫреЛрдЯреА рдореЗрдЬ рдкрд░ рд╣реЛрддреА рд╣реИ , рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмрджрд▓рд╛рд╡ рд╣реЛрддреЗ рд╣реИрдВ ред рдЖрдорддреМрд░ рдкрд░, рдпреЗ рдпрд╛ рддреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рдЙрдВрдЯрд░ / рдПрдЧреНрд░реАрдЧреЗрдЯ / рд░реЗрдЯрд┐рдВрдЧ рд╣реЛрддреЗ рд╣реИрдВ , рдЬрд┐рди рдкрд░ UPDATE рдХреЛ рдЕрдХреНрд╕рд░-рдЕрдХреНрд╕рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреА рд▓рдЧрд╛рддрд╛рд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдлрд░ рдХрддрд╛рд░ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рд╣рдореЗрд╢рд╛ INSERT / DELETE рд╣реЛрддреЗ рд╣реИрдВред

рдЖрдЗрдП рд░реЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдк рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

CREATE TABLE tbl(k text PRIMARY KEY, v integer); CREATE INDEX ON tbl(v DESC); --       INSERT INTO tbl SELECT chr(ascii('a'::text) + i) k , 0 v FROM generate_series(0, 25) i; 

рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ, рдПрдХ рдЕрд▓рдЧ рдХрдиреЗрдХреНрд╢рди рдореЗрдВ, рдПрдХ рд▓рдВрдмреА-рд▓рдВрдмреА рдХреНрд╡реЗрд░реА рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдХреБрдЫ рдЬрдЯрд┐рд▓ рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реА рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ :

 SELECT pg_sleep(10000); 

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

 DO $$ DECLARE i integer; tsb timestamp; tse timestamp; d double precision; BEGIN PERFORM dblink_connect('dbname=' || current_database() || ' port=' || current_setting('port')); FOR i IN 1..10000 LOOP tsb = clock_timestamp(); PERFORM dblink($e$UPDATE tbl SET v = v + 1 WHERE k = 'a';$e$); tse = clock_timestamp(); IF i % 1000 = 0 THEN d = (extract('epoch' from tse) - extract('epoch' from tsb)) * 1000; RAISE NOTICE 'i = %, exectime = %', lpad(i::text, 5), lpad(d::text, 5); END IF; END LOOP; PERFORM dblink_disconnect(); END; $$ LANGUAGE plpgsql; 

 NOTICE: i = 1000, exectime = 0.524 NOTICE: i = 2000, exectime = 0.739 NOTICE: i = 3000, exectime = 1.188 NOTICE: i = 4000, exectime = 2.508 NOTICE: i = 5000, exectime = 1.791 NOTICE: i = 6000, exectime = 2.658 NOTICE: i = 7000, exectime = 2.318 NOTICE: i = 8000, exectime = 2.572 NOTICE: i = 9000, exectime = 2.929 NOTICE: i = 10000, exectime = 3.808 

рдХреНрдпрд╛ рд╣реБрдЖ рдерд╛? рдХреНрдпреЛрдВ, рдПрдХрд▓ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рд░рд▓рддрдо рдЕрджреНрдпрддрди рдХреЗ рд▓рд┐рдП рднреА , рд░рдирдЯрд╛рдЗрдо 7 рдЧреБрдирд╛ - 0.524ms рд╕реЗ 3.808ms рддрдХ рдШрдЯрд╛рдпрд╛ рдЧрдпрд╛? рдФрд░ рд╣рдорд╛рд░реА рд░реЗрдЯрд┐рдВрдЧ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдзреАрд░реЗ-рдзреАрд░реЗ рдФрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

MVCC рдХреЛ рджреЛрд╖ рджреЗрдирд╛ рд╣реИ


рдпрд╣ MVCC рддрдВрддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ , рдЬреЛ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рднреА рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред рддреЛ рдЖрдЗрдП "рдореГрдд" рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╕реЗ рдЕрдкрдиреА рддрд╛рд▓рд┐рдХрд╛ рд╕рд╛рдл рдХрд░реЗрдВ:

 VACUUM VERBOSE tbl; 

 INFO: vacuuming "public.tbl" INFO: "tbl": found 0 removable, 10026 nonremovable row versions in 45 out of 45 pages DETAIL: 10000 dead row versions cannot be removed yet, oldest xmin: 597439602 

рдУрд╣, рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ! рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдХреНрд╡реЗрд░реА рд╣рдореЗрдВ рдкрд░реЗрд╢рд╛рди рдХрд░ рд░рд╣реА рд╣реИ - рдЖрдЦрд┐рд░рдХрд╛рд░, рдПрдХ рджрд┐рди рд╡рд╣ рдЗрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ (рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?), рдФрд░ рд╡реЗ рдЙрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЗрд╕рд▓рд┐рдП VACUUM FULL рднреА рд╣рдорд╛рд░реА рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

"рдХреНрд▓реИрдореНрдкрд┐рдВрдЧ" рддрд╛рд▓рд┐рдХрд╛


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

рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╣рдо рдПрдХ рдмрдлрд░ рдЯреЗрдмрд▓ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдорд╛рдирддреЗ рд╣реИрдВред рдЕрд░реНрдерд╛рддреН, рдПрдХ рдмрдбрд╝реА INSERT / DELETE рд╕реНрдЯреНрд░реАрдо рд╣реИ, рдФрд░ рдХрднреА-рдХрднреА рддрд╛рд▓рд┐рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрд╛рд▓реА рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рд╡рд╣рд╛рдВ рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрд╕рдХреА рд╡рд░реНрддрдорд╛рди рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рд╣реЛрдЧрд╛ред

# 0: рд╕реНрдерд┐рддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВ


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

рд╣рдо рдорд╛рдирджрдВрдб рдмрдирд╛рддреЗ рд╣реИрдВ - "рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХрд╛ рд╕рдордп" рдпрджрд┐:

  • рд╡реИрдХреНрдпреВрдо рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИ
    рд╣рдо рдПрдХ рдмрдбрд╝реЗ рднрд╛рд░ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЕрдВрддрд┐рдо [рдСрдЯреЛ] VACUUM рд╕реЗ 60 рд╕реЗрдХрдВрдб рддрдХ рд░рд╣рдиреЗ рджреЗрдВред
  • рднреМрддрд┐рдХ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЖрдХрд╛рд░ рд▓рдХреНрд╖реНрдп рд╕реЗ рдмрдбрд╝рд╛ рд╣реИ
    рд╣рдо рдЗрд╕реЗ рдиреНрдпреВрдирддрдо рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкреГрд╖реНрдареЛрдВ рдХреА рджреЛрдЧреБрдиреА рд╕рдВрдЦреНрдпрд╛ (8KB рдмреНрд▓реЙрдХ) рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдХреНрддрд┐рдХрд╛ рдХреЗ рд▓рд┐рдП 1 рдвреЗрд░ рдкреНрд░рддрд┐ + + 1 blk - рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдЦрд╛рд▓реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдПред рдпрджрд┐ рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдбреЗрдЯрд╛ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рддреНрд░рд╛ рд╣рдореЗрд╢рд╛ "рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ" рдмрдлрд░ рдореЗрдВ рд░рд╣реЗрдЧреА, рддреЛ рдЗрд╕ рд╕реВрддреНрд░ рдХреЛ рдХрд╕рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рд╣реИред

рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдЕрдиреБрд░реЛрдз
 SELECT relpages , (( SELECT count(*) FROM pg_index WHERE indrelid = cl.oid ) + 1) << 13 size_norm --    * current_setting('block_size')::bigint,     ?.. , pg_total_relation_size(oid) size , coalesce(extract('epoch' from (now() - greatest( pg_stat_get_last_vacuum_time(oid) , pg_stat_get_last_autovacuum_time(oid) ))), 1 << 30) vaclag FROM pg_class cl WHERE oid = $1::regclass -- tbl LIMIT 1; 

 relpages | size_norm | size | vaclag ------------------------------------------- 0 | 24576 | 1105920 | 3392.484835 

# 1: рд╡реИрд╕реЗ рднреА


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

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

# 2: рдХреНрдпрд╛ рдХреЛрдИ рдШрд░ рдкрд░ рд╣реИ?


рдЖрдЗрдП рджреЗрдЦреЗрдВ - рдХреНрдпрд╛ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреБрдЫ рднреА рд╣реИ:

 TABLE tbl LIMIT 1; 

рдпрджрд┐ рдПрдХ рднреА рд░рд┐рдХреЙрд░реНрдб рдирд╣реАрдВ рдмрдЪрд╛ рд╣реИ, рддреЛ рд╣рдо рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдмрд╣реБрдд рдХреБрдЫ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВ - рд╕рд┐рд░реНрдл TRUNCATE рдХрд░ рдХреЗ:

рдпрд╣ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЯреЗрдмрд▓ рдХреЗ рд▓рд┐рдП рдмрд┐рдирд╛ рд╢рд░реНрдд DELETE рдХрдорд╛рдВрдб, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рддреЗрдЬ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЯреЗрдмрд▓ рдХреЛ рд╕реНрдХреИрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рддреБрд░рдВрдд рдбрд┐рд╕реНрдХ рд╕реНрдерд╛рди рдХреЛ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдмрд╛рдж рдПрдХ VACUUM рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЪрд╛рд╣реЗ рдЖрдкрдХреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдЕрдиреБрдХреНрд░рдо (RESTART IDENTITY) рдХреЗ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ - рдЕрдкрдиреЗ рд▓рд┐рдП рдирд┐рд░реНрдгрдп рд▓реЗрдВред

# 3: рд╕рдм рдХреБрдЫ - рдмрджрд▓реЗ рдореЗрдВ!


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

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреЗ рд▓реЗрди-рджреЗрди рдХреЗ рд▓рд┐рдП SERIALIZABLE рдЕрд▓рдЧрд╛рд╡ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рд╣рд╛рдВ, рдпрд╣рд╛рдВ рд╣рдо рд▓реЗрдирджреЗрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ) рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ "рдХрд╕рдХрд░" рд▓реЙрдХ рдХрд░реЗрдВ:

 BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; LOCK TABLE tbl IN ACCESS EXCLUSIVE MODE; 

рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рд╕реНрддрд░ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рд╣реИ рдЬреЛ рд╣рдо рдЙрд╕ рдкрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

# 4: рд╣рд┐рддреЛрдВ рдХрд╛ рдЯрдХрд░рд╛рд╡


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

рдРрд╕рд╛ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, "рдЦреБрдж рдХреЛ рдмрд▓рд┐рджрд╛рди рдХрд░реЗрдВ" - рдЕрдЧрд░ рд╣рдо рдЕрднреА рднреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд (рдЕрдиреБрдореЗрдп рдЫреЛрдЯреЗ) рд╕рдордп рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рдкрд╛рдПрдВрдЧреЗ, рддреЛ рд╣рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдПрдХ рдЕрдкрд╡рд╛рдж рдорд┐рд▓реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рд╣рдо рдмрд╛рдХреА рдХреЛ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рддреНрд░ рдЪрд░ lock_timeout (рд╕рдВрд╕реНрдХрд░рдг 9.3+ рдХреЗ рд▓рд┐рдП) рдпрд╛ / рдФрд░ statement_timeout рд╕реЗрдЯ рдХрд░реЗрдВ ред рдпрд╛рдж рд░рдЦрдиреЗ рд╡рд╛рд▓реА рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ statement_time рдХрд╛ рдорд╛рди рдХреЗрд╡рд▓ рдЕрдЧрд▓реЗ рдХрдерди рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН, рдЗрд╕ рддрд░рд╣ gluing рдореЗрдВ, рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ :

 SET statement_timeout = ...;LOCK TABLE ...; 

рдЪрд░ рдХреЗ "рдкреБрд░рд╛рдиреЗ" рдореВрд▓реНрдп рдХреА рдмрд╛рдж рдХреА рдмрд╣рд╛рд▓реА рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рд╣рдо SET LOCAL рдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рджрд╛рдпрд░реЗ рдХреЛ рд╡рд░реНрддрдорд╛рди рд▓реЗрдирджреЗрди рддрдХ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред

рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ statement_timeout рдмрд╛рдж рдХреЗ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд▓реЗрдирджреЗрди рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рд╣реЛрдиреЗ рдкрд░ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рдореВрд▓реНрдпреЛрдВ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХреЗред

# 5: рдХреЙрдкреА рдбреЗрдЯрд╛


рдпрджрд┐ рддрд╛рд▓рд┐рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реБрдИ рд╣реИ, рддреЛ рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣рд╛рдпрдХ рдЕрд╕реНрдерд╛рдпреА рд▓реЗрдмрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд┐рд░ рд╕реЗ рд╕рд╣реЗрдЬрдирд╛ рд╣реЛрдЧрд╛:

 CREATE TEMPORARY TABLE _tmp_swap ON COMMIT DROP AS TABLE tbl; 

ON COMMIT DROP рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЬрд┐рд╕ рд╕рдордп рд▓реЗрди-рджреЗрди рд╕рдорд╛рдкреНрдд рд╣реЛрдЧрд╛, рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧреА, рдФрд░ рдЖрдкрдХреЛ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЪреВрдВрдХрд┐ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ "рд▓рд╛рдЗрд╡" рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдСрдкрд░реЗрд╢рди рдЬрд▓реНрджреА рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рд╣рдо рдЕрдВрддрд┐рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ


рд╣рдо рдРрд╕реЗ "рдЫрджреНрдо рдЕрдЬрдЧрд░" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

 #     stat <- SELECT relpages , (( SELECT count(*) FROM pg_index WHERE indrelid = cl.oid ) + 1) << 13 size_norm , pg_total_relation_size(oid) size , coalesce(extract('epoch' from (now() - greatest( pg_stat_get_last_vacuum_time(oid) , pg_stat_get_last_autovacuum_time(oid) ))), 1 << 30) vaclag FROM pg_class cl WHERE oid = $1::regclass -- table_name LIMIT 1; #      VACUUM   if stat.size > 2 * stat.size_norm and stat.vaclag is None or stat.vaclag > 60: -> VACUUM %table; try: -> BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; #         1s -> SET LOCAL statement_timeout = '1s'; SET LOCAL lock_timeout = '1s'; -> LOCK TABLE %table IN ACCESS EXCLUSIVE MODE; #          row <- TABLE %table LIMIT 1; #       ""  -   ,    - ""      if row is None: -> TRUNCATE TABLE %table RESTART IDENTITY; else: #      - -> CREATE TEMPORARY TABLE _tmp_swap ON COMMIT DROP AS TABLE %table; #      -> TRUNCATE TABLE %table; #         -> INSERT INTO %table TABLE _tmp_swap; -> COMMIT; except Exception as e: #    ,     "" -   if not isinstance(e, InterfaceError): -> ROLLBACK; 

рдФрд░ рдХреНрдпрд╛ рдЖрдк рдбреЗрдЯрд╛ рдХреЛ рджреВрд╕рд░реА рдмрд╛рд░ рдХреЙрдкреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдпрджрд┐ рддрд╛рд▓рд┐рдХрд╛ рдХреА рдУрдб рд╕реНрд╡рдпрдВ рдбреАрдмреА рд╕реЗ рдмреАрдПрд▓ рдкрдХреНрд╖ рдпрд╛ рдПрдлрдХреЗ рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ рдмрдВрдзреЗ рдирд╣реАрдВ рд╣реИ:
 CREATE TABLE _swap_%table(LIKE %table INCLUDING ALL); INSERT INTO _swap_%table TABLE %table; DROP TABLE %table; ALTER TABLE _swap_%table RENAME TO %table; 

рдЪрд▓реЛ рд╕реНрд░реЛрдд рддрд╛рд▓рд┐рдХрд╛ рдкрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ:
 VACUUM tbl; BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; SET LOCAL statement_timeout = '1s'; SET LOCAL lock_timeout = '1s'; LOCK TABLE tbl IN ACCESS EXCLUSIVE MODE; CREATE TEMPORARY TABLE _tmp_swap ON COMMIT DROP AS TABLE tbl; TRUNCATE TABLE tbl; INSERT INTO tbl TABLE _tmp_swap; COMMIT; 

 relpages | size_norm | size | vaclag ------------------------------------------- 0 | 24576 | 49152 | 32.705771 

рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░ рдЧрдпрд╛! рддрд╛рд▓рд┐рдХрд╛ 50 рдЧреБрдирд╛ рд╕рд┐рдХреБрдбрд╝ рдЧрдИ рд╣реИ, рдФрд░ рд╕рднреА рдЕрджреНрдпрддрди рдлрд┐рд░ рд╕реЗ рддреЗрдЬреА рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВред

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


All Articles