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

рд╣рдордиреЗ рдПрдХ рд░реЗрдХ рдлреИрд▓рд╛рдпрд╛
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЬрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рдо рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рдХреИрд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИред
рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рд╕реНрдерд┐рддрд┐
рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЫреЛрдЯреА рдореЗрдЬ рдкрд░ рд╣реЛрддреА рд╣реИ , рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ
рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмрджрд▓рд╛рд╡ рд╣реЛрддреЗ рд╣реИрдВ ред рдЖрдорддреМрд░ рдкрд░, рдпреЗ рдпрд╛ рддреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ
рдХрд╛рдЙрдВрдЯрд░ / рдПрдЧреНрд░реАрдЧреЗрдЯ / рд░реЗрдЯрд┐рдВрдЧ рд╣реЛрддреЗ рд╣реИрдВ , рдЬрд┐рди рдкрд░ UPDATE рдХреЛ рдЕрдХреНрд╕рд░-рдЕрдХреНрд╕рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреА рд▓рдЧрд╛рддрд╛рд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ
рдмрдлрд░ рдХрддрд╛рд░ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рд╣рдореЗрд╢рд╛ INSERT / DELETE рд╣реЛрддреЗ рд╣реИрдВред
рдЖрдЗрдП рд░реЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдк рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
CREATE TABLE tbl(k text PRIMARY KEY, v integer); CREATE INDEX ON tbl(v DESC);
рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ, рдПрдХ рдЕрд▓рдЧ рдХрдиреЗрдХреНрд╢рди рдореЗрдВ, рдПрдХ рд▓рдВрдмреА-рд▓рдВрдмреА рдХреНрд╡реЗрд░реА рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдХреБрдЫ рдЬрдЯрд┐рд▓ рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди
рд╣рдорд╛рд░реА рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ :
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
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 рдХреЛ рдЪрд▓рд╛рдирд╛ рдпрд╛рдж рд░рдЦреЗрдВред
рд╣рдо рдЕрдВрддрд┐рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ
рд╣рдо рдРрд╕реЗ "рдЫрджреНрдо рдЕрдЬрдЧрд░" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
рдФрд░ рдХреНрдпрд╛ рдЖрдк рдбреЗрдЯрд╛ рдХреЛ рджреВрд╕рд░реА рдмрд╛рд░ рдХреЙрдкреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдпрджрд┐ рддрд╛рд▓рд┐рдХрд╛ рдХреА рдУрдб рд╕реНрд╡рдпрдВ рдбреАрдмреА рд╕реЗ рдмреАрдПрд▓ рдкрдХреНрд╖ рдпрд╛ рдПрдлрдХреЗ рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ рдмрдВрдзреЗ рдирд╣реАрдВ рд╣реИ:
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 рдЧреБрдирд╛ рд╕рд┐рдХреБрдбрд╝ рдЧрдИ рд╣реИ, рдФрд░ рд╕рднреА рдЕрджреНрдпрддрди рдлрд┐рд░ рд╕реЗ рддреЗрдЬреА рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВред