рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рд╣рдордиреЗ
рдЕрд▓рдЧрд╛рд╡ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА,
рдирд┐рдореНрди рд╕реНрддрд░ рдкрд░ рдбреЗрдЯрд╛ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдХрд┐рдпрд╛, рдФрд░ рдлрд┐рд░
рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдФрд░
рд╕реНрдиреИрдкрд╢реЙрдЯ рд╕реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ
рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХреАред
рдЖрдЬ рд╣рдо рджреЛ рдирд┐рдХрдЯрддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗ:
рдЗрдВрдЯреНрд░рд╛-рдкреЗрдЬ рд╕рдлрд╛рдИ рдФрд░
рд╣реЙрдЯ-рдЕрдкрдбреЗрдЯ ред рджреЛрдиреЛрдВ рддрдВрддреНрд░реЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рд╡реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд▓рдЧрднрдЧ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВред
рдирд┐рдпрдорд┐рдд рдЕрдкрдбреЗрдЯ рдХреЗ рд╕рд╛рде рдЗрди-рдкреЗрдЬ рд╕рдлрд╛рдИ
рдЬрдм рдПрдХ рдкреГрд╖реНрда рддрдХ рдкрд╣реБрдБрдЪ - рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдФрд░ рдкрдврд╝рддреЗ рд╕рдордп - рддреНрд╡рд░рд┐рдд рдЗрдВрдЯреНрд░рд╛-рдкреГрд╖реНрда рд╕рдлрд╛рдИ рд╣реЛ рд╕рдХрддреА рд╣реИ рдпрджрд┐ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдХреНрдпреВрдПрд▓ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рдкреГрд╖реНрда рдЕрдВрддрд░рд┐рдХреНрд╖ рд╕реЗ рдмрд╛рд╣рд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдпрд╣ рджреЛ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред
- рдЗрд╕ рдкреГрд╖реНрда (UPDATE) рдкрд░ рдкрд╣рд▓реЗ рдХрд┐рдП рдЧрдП рдЕрдкрдбреЗрдЯ рдореЗрдВ рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рдкрдВрдХреНрддрд┐ рдХрд╛ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдерд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреГрд╖реНрда рд╢реАрд░реНрд╖рдХ рдореЗрдВ рдпрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдЧрд▓реА рдмрд╛рд░ рдкреГрд╖реНрда рдХреЛ рд╕рд╛рдлрд╝ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдкреЗрдЬ рдлрд┐рд▓рдлреИрдХреНрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рднрд░рд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдЧрд▓реА рдмрд╛рд░ рджреЗрд░реА рдХрд┐рдП рдмрд┐рдирд╛, рд╕рдлрд╛рдИ рддреБрд░рдВрдд рд╣реЛрддреА рд╣реИред
рдлрд┐рд▓рдлреИрдХреНрдЯреЛрд░ рдПрдХ рд╕реНрдЯреЛрд░реЗрдЬ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ рдЬрд┐рд╕реЗ рдЯреЗрдмрд▓ (рдФрд░ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП) рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред PostgreSQL рдПрдХ рдкреГрд╖реНрда рдкрд░ рдПрдХ рдирдИ рдкрдВрдХреНрддрд┐ (INSERT) рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рдпрд╣ рдкреГрд╖реНрда рдкреВрд░реНрдгрд╛рдВрдХ рднрд░рдиреЗ рд╕реЗ рдХрдо рд╣реЛред рд╢реЗрд╖ рд╕реНрдерд╛рди рдЕрдкрдбреЗрдЯ (UPDATE) рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╣реИред рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди 100 рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╕реНрдерд╛рди рдЖрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ (рдФрд░ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд╛ рдорд╛рди 90 рд╣реИ)ред
рдЗрди-рдкреЗрдЬ рд╕рдлрд╛рдИ рдЙрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрддреА рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рдЫрд╡рд┐ рдореЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддреА рд╣реИрдВ (рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ "рдШрдЯрдирд╛ рдХреНрд╖рд┐рддрд┐рдЬ рд╕реЗ рдкрд░реЗ рд╕реНрдерд┐рдд рд╣реИ, рд╣рдордиреЗ
рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереА), рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдорд╛рди рд╕рд╛рд░рдгреА рдкреГрд╖реНрда рдХреЗ рднреАрддрд░ рд╕рдЦреНрддреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕реНрдХреНрд░рдм рдХрд┐рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдПрдХ рдФрд░ рдкреГрд╖реНрда рд╣реИред рдЗрди-рдкреЗрдЬ рд╕рдлрд╛рдИ рдХрднреА рдПрдХ рд╕рд╛рд░рдгреАрдмрджреНрдз рдкреГрд╖реНрда рд╕реЗ рдЖрдЧреЗ рдирд╣реАрдВ рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИред
рдЙрдиреНрд╣реАрдВ рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдореБрдХреНрдд рд╕реНрдерд╛рди рдХрд╛ рдирдХреНрд╢рд╛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ; рдпрд╣ рдЖрд╡реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рди рднреА рдмрдЪрд╛рддрд╛ рд╣реИред рджреГрд╢реНрдпрддрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рднреА рдЕрджреНрдпрддрди рдирд╣реАрдВ рд╣реИред
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдкреГрд╖реНрда рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рджреМрд░рд╛рди рд╕рд╛рдл тАЛтАЛрдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рдкрдврд╝рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз (SELECT) рдкреГрд╖реНрдареЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдФрд░ рдорд╛рдорд▓рд╛ рд╣реИ, рд╕рдВрдХреЗрдд рдмрд┐рдЯреНрд╕ рдХреЗ рдкрд╣рд▓реЗ рдЖрд╕реНрдердЧрд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдЕрд▓рд╛рд╡рд╛ред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред рджреЛрдиреЛрдВ рдХреЙрд▓рдо рдкрд░ рдПрдХ рдЯреЗрдмрд▓ рдФрд░ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдПрдВред
=> CREATE TABLE hot(id integer, s char(2000)) WITH (fillfactor = 75); => CREATE INDEX hot_id ON hot(id); => CREATE INDEX hot_s ON hot(s);
рдпрджрд┐ рдХреЗрд╡рд▓ рд▓реИрдЯрд┐рди рдЕрдХреНрд╖рд░реЛрдВ рдХреЛ рдХреЙрд▓рдо рдПрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкрдВрдХреНрддрд┐ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ 2004 рдмрд╛рдЗрдЯреНрд╕ рдФрд░ рд╣реЗрдбрд░ рдХреЗ 24 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрдВрдЧреЗред рд╣рдордиреЗ рдлрд┐рд▓рдлреИрдХреНрдЯреЛрд░ рд╕реНрдЯреЛрд░реЗрдЬ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ 75% рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ - рддреАрди рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЧрд╣ рд╣реЛрдЧреАред
рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░рд┐рдЪрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рджреЛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд░рддреЗ рд╣реИрдВ:
=> CREATE FUNCTION heap_page(relname text, pageno integer) RETURNS TABLE(ctid tid, state text, xmin text, xmax text, hhu text, hot text, t_ctid tid) AS $$ SELECT (pageno,lp)::text::tid AS ctid, CASE lp_flags WHEN 0 THEN 'unused' WHEN 1 THEN 'normal' WHEN 2 THEN 'redirect to '||lp_off WHEN 3 THEN 'dead' END AS state, t_xmin || CASE WHEN (t_infomask & 256) > 0 THEN ' (c)' WHEN (t_infomask & 512) > 0 THEN ' (a)' ELSE '' END AS xmin, t_xmax || CASE WHEN (t_infomask & 1024) > 0 THEN ' (c)' WHEN (t_infomask & 2048) > 0 THEN ' (a)' ELSE '' END AS xmax, CASE WHEN (t_infomask2 & 16384) > 0 THEN 't' END AS hhu, CASE WHEN (t_infomask2 & 32768) > 0 THEN 't' END AS hot, t_ctid FROM heap_page_items(get_raw_page(relname,pageno)) ORDER BY lp; $$ LANGUAGE SQL;
рдФрд░ рдЗрдВрдбреЗрдХреНрд╕ рдкреЗрдЬ рдХреЗ рдЕрдВрджрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрдВрдХреНрд╢рди рдмрдирд╛рдПрдВ:
=> CREATE FUNCTION index_page(relname text, pageno integer) RETURNS TABLE(itemoffset smallint, ctid tid) AS $$ SELECT itemoffset, ctid FROM bt_page_items(relname,pageno); $$ LANGUAGE SQL;
рд╣рдо рдпрд╣ рдЬрд╛рдВрдЪреЗрдВрдЧреЗ рдХрд┐ рдЗрдВрдЯреНрд░рд╛-рдкреГрд╖реНрда рд╕рдлрд╛рдИ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкрдВрдХреНрддрд┐ рдбрд╛рд▓реЗрдВ рдФрд░ рдЗрд╕реЗ рдХрдИ рдмрд╛рд░ рдмрджрд▓реЗрдВ:
=> INSERT INTO hot VALUES (1, 'A'); => UPDATE hot SET s = 'B'; => UPDATE hot SET s = 'C'; => UPDATE hot SET s = 'D';
рдкреГрд╖реНрда рдореЗрдВ рдкрдВрдХреНрддрд┐ рдХреЗ рдЪрд╛рд░ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВ:
=> SELECT * FROM heap_page('hot',0);
ctid | state | xmin | xmax | hhu | hot | t_ctid -------+--------+----------+----------+-----+-----+-------- (0,1) | normal | 3979 (c) | 3980 (c) | | | (0,2) (0,2) | normal | 3980 (c) | 3981 (c) | | | (0,3) (0,3) | normal | 3981 (c) | 3982 | | | (0,4) (0,4) | normal | 3982 | 0 (a) | | | (0,4) (4 rows)
рдЬреИрд╕реА рдХрд┐ рдЙрдореНрдореАрдж рдереА, рд╣рдо рдлрд┐рд▓рдлреИрдХреНрдЯрд░ рд╕реАрдорд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЧрдПред рдпрд╣ рдкреГрд╖реНрда рдЖрдХрд╛рд░ рдФрд░ рдКрдкрд░реА рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдпрд╣ рдкреГрд╖реНрда рдЖрдХрд╛рд░ рдХреЗ 75% рдХреА рд╕реАрдорд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдЬреЛ 6144 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред
=> SELECT lower, upper, pagesize FROM page_header(get_raw_page('hot',0));
lower | upper | pagesize -------+-------+---------- 40 | 64 | 8192 (1 row)
рддреЛ, рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рдЖрдк рдкреГрд╖реНрда рддрдХ рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ, рддреЛ рдЗрди-рдкреЗрдЬ рд╕рдлрд╛рдИ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ рджреЗрдЦреЗрдВред
=> UPDATE hot SET s = 'E'; => SELECT * FROM heap_page('hot',0);
ctid | state | xmin | xmax | hhu | hot | t_ctid -------+--------+----------+-------+-----+-----+-------- (0,1) | dead | | | | | (0,2) | dead | | | | | (0,3) | dead | | | | | (0,4) | normal | 3982 (c) | 3983 | | | (0,5) (0,5) | normal | 3983 | 0 (a) | | | (0,5) (5 rows)
рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рднреА рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг (0,1), (0,2) рдФрд░ (0,3) рд╕рд╛рдлрд╝ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ; рдЙрд╕рдХреЗ рдмрд╛рдж, рд▓рд╛рдЗрди рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг (0.5) рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдлрд╛рдИ рдХреЗ рдмрд╛рдж рдмрдЪреА рд╣реБрдИ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд░рд┐рд╖реНрда рдкреЗрдЬ рдХреЗ рдкрддреЗ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕рднреА рдореБрдХреНрдд рд╕реНрдерд╛рди рдПрдХ рдирд┐рд░рдВрддрд░ рдЯреБрдХрдбрд╝реЗ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдП рдЬрд╛рдПрдВред рд╕рдВрдХреЗрдд рдХреЗ рдорд╛рди рддрджрдиреБрд╕рд╛рд░ рдмрджрд▓рддреЗ рд░рд╣рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдкреГрд╖реНрда рдореЗрдВ рдЦрд╛рд▓реА рд╕реНрдерд╛рди рдХреЗ рд╡рд┐рдЦрдВрдбрди рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╣рдЯрд╛рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдореБрдХреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдкреЗрдЬ рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рд╣реИрдВред рдЖрдЗрдП рд╣реЙрдЯ_рдПрд╕ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рдкрд╣рд▓реЗ рдкреГрд╖реНрда рдХреЛ рджреЗрдЦреЗрдВ (рдХреНрдпреЛрдВрдХрд┐ рд╢реВрдиреНрдп рдореЗрдЯрд╛-рд╕реВрдЪрдирд╛ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╕реНрдд рд╣реИ):
=> SELECT * FROM index_page('hot_s',1);
itemoffset | ctid ------------+------- 1 | (0,1) 2 | (0,2) 3 | (0,3) 4 | (0,4) 5 | (0,5) (5 rows)
рд╣рдо рдЙрд╕реА рдЪрд┐рддреНрд░ рдХреЛ рджреВрд╕рд░реЗ рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ:
=> SELECT * FROM index_page('hot_id',1);
itemoffset | ctid ------------+------- 1 | (0,5) 2 | (0,4) 3 | (0,3) 4 | (0,2) 5 | (0,1) (5 rows)
рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдХреЗрдд рдпрд╣рд╛рдБ "рдкреАрдЫреЗ рдХреА рдУрд░" рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рднреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╕рдорд╛рди рдорд╛рди id = 1. рд╣реИ, рд▓реЗрдХрд┐рди рдкрд┐рдЫрд▓реЗ рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ, рдмрд┐рдВрджреБрдУрдВ рдХреЛ s рдорд╛рди рджреНрд╡рд╛рд░рд╛ рдЖрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХрд╛рдлреАред
рдЗрдВрдбреЗрдХреНрд╕ рдПрдХреНрд╕реЗрд╕ рдХреЗ рд╕рд╛рде, PostgreSQL рдХреЛ рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ (0,1), (0,2) рдпрд╛ (0,3) рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рд╡рд╣ рддрд╛рд▓рд┐рдХрд╛ рдкреГрд╖реНрда рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкрдВрдХреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╕реВрдЪрдХ рдХреА рдореГрдд рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╡рд╣ рдкрд╛рдПрдЧрд╛ рдХрд┐ рдРрд╕рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЕрдм рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдЧрд╛ред (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкрд╣рд▓реА рдмрд╛рд░ рдпрд╣ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдХрдореА рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ, PostgreSQL рдЗрдВрдбреЗрдХреНрд╕ рдкреЗрдЬ рдореЗрдВ рдкреЙрдЗрдВрдЯрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рднреА рдмрджрд▓ рджреЗрдЧрд╛ рддрд╛рдХрд┐ рд╡рд╣ рдЯреЗрдмрд▓ рдкреЗрдЬ рдкрд░ рдлрд┐рд░ рд╕реЗ рди рдкрд╣реБрдВрдЪ рд╕рдХреЗред)
рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЗрдВрдЯреНрд░рд╛-рдкреЗрдЬ рд╕рдлрд╛рдИ рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рд░рдгреАрдмрджреНрдз рдкреГрд╖реНрда рдХреЗ рднреАрддрд░ рдХрд╛рдо рдХрд░рддреА рд╣реИ рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдкреГрд╖реНрдареЛрдВ рдХреЛ рд╕рд╛рдл рдирд╣реАрдВ рдХрд░рддреА рд╣реИред
рдЧрд░реНрдо рдЕрдкрдбреЗрдЯ
рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рднреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рд░рдЦрдирд╛ рдмреБрд░рд╛ рдХреНрдпреЛрдВ рд╣реИ?
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХрд┐рд╕реА рднреА рдкрдВрдХреНрддрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЛ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рдЧрдП рд╕рднреА рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛: рдЪреВрдВрдХрд┐ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реИ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдВрдХ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡реЗ рдХреНрд╖реЗрддреНрд░ рдЬреЛ рд╕реВрдЪрдХрд╛рдВрдХ рдкрд░рд┐рд╡рд░реНрддрди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡реА рдирд╣реАрдВ рд╣реИред
рджреВрд╕рд░реЗ, рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рдЬрдорд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рддрдм рд╕реНрд╡рдпрдВ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдл рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рд╣рдо рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, PostgreSQL рдореЗрдВ рдмреА-рдкреЗрдбрд╝ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдпрджрд┐ рдирдИ рдкрдВрдХреНрддрд┐ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдкреГрд╖реНрда рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реИ, рддреЛ рдкреГрд╖реНрда рдХреЛ рджреЛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рдЙрдирдХреЗ рдмреАрдЪ рдкреБрдирд░реНрд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕реЗ рд╕реНрдкреНрд▓рд┐рдЯ рдкреЗрдЬ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛рддреЗ рд╕рдордп, рджреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдкреГрд╖реНрда рдЕрдм "рдПрдХ рд╕рд╛рде" рдЪрд┐рдкрдХрддреЗ рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рдпрджрд┐ рдбреЗрдЯрд╛ рдХрд╛ рдкрд░реНрдпрд╛рдкреНрдд рднрд╛рдЧ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рднреА рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЖрдХрд╛рд░ рдХрдо рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдореЗрдЬ рдкрд░ рдЬрд┐рддрдиреЗ рдЕрдзрд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрддрдиреА рд╣реА рдмрдбрд╝реА рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдХрд┐рд╕реА рд╕реНрддрдВрдн рдХрд╛ рдорд╛рди рдХрд┐рд╕реА рднреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ B- рдЯреНрд░реА рдореЗрдВ рдПрдХ рд╣реА рдХреБрдВрдЬреА рдорд╛рди рд╡рд╛рд▓реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЕрдиреБрдХреВрд▓рди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ HOT рдЕрдкрдбреЗрдЯ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╣реАрдк-рдУрдирд▓реА рдЯрдкрд▓ рдЕрдкрдбреЗрдЯред
рдЗрд╕ рдЕрджреНрдпрддрди рдХреЗ рд╕рд╛рде, рд╕реВрдЪрдХрд╛рдВрдХ рдкреГрд╖реНрда рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣реИ рдЬреЛ рддрд╛рд▓рд┐рдХрд╛ рдкреГрд╖реНрда рдореЗрдВ рдкрдВрдХреНрддрд┐ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреА рд╣реИред рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╕рд╛рд░рдгреАрдмрджреНрдз рдкреГрд╖реНрда рдХреЗ рдЕрдВрджрд░ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЖрдпреЛрдЬрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ:
- рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдФрд░ рдмрджрд▓реЗ рдЧрдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╣реАрдк рд╣реЙрдЯ рдЕрдкрдбреЗрдЯреЗрдб рдмрд┐рдЯ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ;
- рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реАрдк рдУрдирд▓реА рдЯрдкрд▓ рдмрд┐рдЯ (рдЬреЛ рдХрд┐, "рдкрдВрдХреНрддрд┐ рдХрд╛ рдХреЗрд╡рд▓ рд╕рд╛рд░рдгреАрдмрджреНрдз рд╕рдВрд╕реНрдХрд░рдг") рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╣реИ;
- ctid рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдирд┐рдпрдорд┐рдд рд▓рд┐рдВрдХрд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрджрд┐, рдХрд┐рд╕реА рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рд╕реНрдХреИрди рдХрд░рддреЗ рд╕рдордп, PostgreSQL рдПрдХ рд╕рд╛рд░рдгреАрдмрджреНрдз рдкреГрд╖реНрда рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣реАрдк рд╣реЙрдЯ рдЕрдкрдбреЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕рдВрдкреВрд░реНрдг рдЕрджреНрдпрддрди рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рддрд╛рд░реЛрдВ рдХреЗ рд╕рднреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рджреГрд╢реНрдпрддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╡реЗ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВред
HOT рдЕрдкрдбреЗрдЯ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рд╣рдЯрд╛рдПрдВ рдФрд░ рдЯреЗрдмрд▓ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░реЗрдВред
=> DROP INDEX hot_s; => TRUNCATE TABLE hot;
рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдкрдВрдХреНрддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред
=> INSERT INTO hot VALUES (1, 'A'); => UPDATE hot SET s = 'B';
рдпрд╣рд╛рдБ рд╣рдо рдЯреЗрдмрд▓ рдкреЗрдЬ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ:
=> SELECT * FROM heap_page('hot',0);
ctid | state | xmin | xmax | hhu | hot | t_ctid -------+--------+----------+-------+-----+-----+-------- (0,1) | normal | 3986 (c) | 3987 | t | | (0,2) (0,2) | normal | 3987 | 0 (a) | | t | (0,2) (2 rows)
рдкреГрд╖реНрда рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ:
- рд╣реАрдк рд╣реЙрдЯ рдЕрдкрдбреЗрдЯреЗрдб рдзреНрд╡рдЬ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ ctid рд╢реНрд░рдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ,
- рд╣реАрдк рдУрдирд▓реА рдЯрдкрд▓ рдзреНрд╡рдЬ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкрдВрдХреНрддрд┐ рдХреЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХреЛрдИ рдЗрдВрдбреЗрдХреНрд╕ рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реИрдВред
рдФрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде, рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдврд╝реЗрдЧреА (рдкреГрд╖реНрда рдХреЗ рднреАрддрд░):
=> UPDATE hot SET s = 'C'; => UPDATE hot SET s = 'D'; => SELECT * FROM heap_page('hot',0);
ctid | state | xmin | xmax | hhu | hot | t_ctid -------+--------+----------+----------+-----+-----+-------- (0,1) | normal | 3986 (c) | 3987 (c) | t | | (0,2) (0,2) | normal | 3987 (c) | 3988 (c) | t | t | (0,3) (0,3) | normal | 3988 (c) | 3989 | t | t | (0,4) (0,4) | normal | 3989 | 0 (a) | | t | (0,4) (4 rows)
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рдЪреЗрди рдХреЗ "рд╣реЗрдб" рдХрд╛ рдПрдХ рдПрдХрд▓ рд╕рдВрджрд░реНрдн рд╣реИ:
=> SELECT * FROM index_page('hot_id',1);
itemoffset | ctid ------------+------- 1 | (0,1) (1 row)
рд╣рдо рдЬреЛрд░ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдЧрд░ рдЕрджреНрдпрддрди рдлрд╝реАрд▓реНрдб рдХрд┐рд╕реА рднреА рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ HOT-рдЕрдкрдбреЗрдЯ рдХрд╛рд░реНрдпред рдЕрдиреНрдпрдерд╛, рдХреБрдЫ рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рд╕реАрдзреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╣реЛрдЧрд╛, рдЬреЛ рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЦрдВрдбрди рдХрд░рддрд╛ рд╣реИред
рдЕрдиреБрдХреВрд▓рди рдХреЗрд╡рд▓ рдПрдХ рдкреГрд╖реНрда рдХреА рд╕реАрдорд╛ рдХреЗ рднреАрддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рдИрдкрд╛рд╕ рдХреЛ рдЕрдиреНрдп рдкреГрд╖реНрдареЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
HOT рдЕрдкрдбреЗрдЯ рдХреЗ рд╕рд╛рде рдЗрди-рдкреЗрдЬ рд╕рдлрд╛рдИ
HOT рдЕрдкрдбреЗрдЯ рдХреЗ рджреМрд░рд╛рди рдЗрдВрдЯреНрд░рд╛-рдкреЗрдЬ рд╕рдлрд╛рдИ рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд▓реЗрдХрд┐рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рдорд▓рд╛ рд╕рдлрд╛рдИ рд╣реИред
рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХреА рддрд░рд╣, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрд░рд╛рд╡ рдХреА рд╕реАрдорд╛ рдХреЛ рдкрд╛рд░ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЕрдЧрд▓реЗ рдЕрджреНрдпрддрди рдореЗрдВ рдЗрди-рдкреЗрдЬ рд╕рдлрд╛рдИ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдкреЗрдЬ рдореЗрдВ рдЗрд╕ рдмрд╛рд░ рдЕрдкрдбреЗрдЯ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИред рдЗрд╕ рд╣реЙрдЯ рдЪреЗрди рдХрд╛ "рд╣реЗрдб" рд╣рдореЗрд╢рд╛ рдЕрдкрдиреА рдЬрдЧрд╣ рдкрд░ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЗрдВрдбреЗрдХреНрд╕ рдЗрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдмрд╛рдХреА рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдмрд╛рд╣рд░ рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
"рд╕рд┐рд░" рдХреЛ рдЫреВрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдбрдмрд▓ рдПрдбреНрд░реЗрд╕рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рд╕реВрдЪрдХ рдЬрд┐рд╕реЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ (0,1) - "рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди" рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
=> UPDATE hot SET s = 'E'; => SELECT * FROM heap_page('hot',0);
ctid | state | xmin | xmax | hhu | hot | t_ctid -------+---------------+----------+-------+-----+-----+-------- (0,1) | redirect to 4 | | | | | (0,2) | normal | 3990 | 0 (a) | | t | (0,2) (0,3) | unused | | | | | (0,4) | normal | 3989 (c) | 3990 | t | t | (0,2) (4 rows)
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐:
- рд╕рдВрд╕реНрдХрд░рдг (0,1), (0,2) рдФрд░ (0,3) рдХреЛ рдордВрдЬреВрд░реА рджреЗ рджреА рдЧрдИ,
- рд╣реЗрдб рдкреЙрдЗрдВрдЯрд░ (0,1) рдмрдирд╛ рд░рд╣рд╛, рд▓реЗрдХрд┐рди рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХреА,
- рд▓рд╛рдЗрди рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЬрдЧрд╣ (0.2) рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЗрдВрдбреЗрдХреНрд╕ рд╕реЗ рдХреЛрдИ рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреА рдЧрдИ рдереА рдФрд░ рд╕реВрдЪрдХ рдХреЛ рдореБрдХреНрдд (рдЕрдкреНрд░рдпреБрдХреНрдд) рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЕрдкрдбреЗрдЯ рдХреЛ рдХреБрдЫ рдФрд░ рдмрд╛рд░ рдХрд░реЗрдВ:
=> UPDATE hot SET s = 'F'; => UPDATE hot SET s = 'G'; => SELECT * FROM heap_page('hot',0);
ctid | state | xmin | xmax | hhu | hot | t_ctid -------+---------------+----------+----------+-----+-----+-------- (0,1) | redirect to 4 | | | | | (0,2) | normal | 3990 (c) | 3991 (c) | t | t | (0,3) (0,3) | normal | 3991 (c) | 3992 | t | t | (0,5) (0,4) | normal | 3989 (c) | 3990 (c) | t | t | (0,2) (0,5) | normal | 3992 | 0 (a) | | t | (0,5) (5 rows)
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрджреНрдпрддрди рдлрд┐рд░ рд╕реЗ рдЗрдВрдЯреНрд░рд╛-рдкреЗрдЬ рдХреНрд▓реАрдирдЕрдк рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ:
=> UPDATE hot SET s = 'H'; => SELECT * FROM heap_page('hot',0);
ctid | state | xmin | xmax | hhu | hot | t_ctid -------+---------------+----------+-------+-----+-----+-------- (0,1) | redirect to 5 | | | | | (0,2) | normal | 3993 | 0 (a) | | t | (0,2) (0,3) | unused | | | | | (0,4) | unused | | | | | (0,5) | normal | 3992 (c) | 3993 | t | t | (0,2) (5 rows)
рдлрд┐рд░ рд╕реЗ, рдХреБрдЫ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдордВрдЬреВрд░реА рджреЗ рджреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рд╕реВрдЪрдХ рдХреЛ "рд╕рд┐рд░" рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖: рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рдУрдВ рдХреЗ рдмрд╛рд╣рд░ рд╕реНрддрдВрднреЛрдВ рдХреЗ рд▓рдЧрд╛рддрд╛рд░ рдЕрджреНрдпрддрди рдХреЗ рд╕рд╛рде, рдпрд╣ рдЕрджреНрдпрддрди рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрда рдкрд░ рдХреБрдЫ рд╕реНрдерд╛рди рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд░рд╛рд╡ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХрдо рднрд░рд╛ рд╣реБрдЖ, рдЕрдзрд┐рдХ рдЕрд╕рдВрдЧрдд рд╕реНрдерд╛рди рдкреГрд╖реНрда рдкрд░ рдмрдирд╛ рд░рд╣реЗ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рднреМрддрд┐рдХ рдЖрдХрд╛рд░ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИред
рд╣реЙрдЯ рдЪреЗрди рддреЛрдбрд╝
рдпрджрд┐ рдХрд┐рд╕реА рдкрдВрдХреНрддрд┐ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрда рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рдЦрд╛рд▓реА рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реИ, рддреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЯреВрдЯ рдЬрд╛рдПрдЧреАред рджреВрд╕рд░реЗ рдкреГрд╖реНрда рдкрд░ рдкреЛрд╕реНрдЯ рдХреА рдЧрдИ рд▓рд╛рдЗрди рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЗрдВрдбреЗрдХреНрд╕ рд╕реЗ рдПрдХ рдЕрд▓рдЧ рд▓рд┐рдВрдХ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рд▓реЗрдирджреЗрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдбреЗрдЯрд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред
| => BEGIN ISOLATION LEVEL REPEATABLE READ; | => SELECT count(*) FROM hot;
| count | ------- | 1 | (1 row)
рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдкреГрд╖реНрда рдкрд░ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЕрдм рд╣рдо рдкрд╣рд▓реЗ рд╕рддреНрд░ рдореЗрдВ рдЕрджреНрдпрддрди рдХрд░рддреЗ рд╣реИрдВ:
=> UPDATE hot SET s = 'I'; => UPDATE hot SET s = 'J'; => UPDATE hot SET s = 'K'; => SELECT * FROM heap_page('hot',0);
ctid | state | xmin | xmax | hhu | hot | t_ctid -------+---------------+----------+----------+-----+-----+-------- (0,1) | redirect to 2 | | | | | (0,2) | normal | 3993 (c) | 3994 (c) | t | t | (0,3) (0,3) | normal | 3994 (c) | 3995 (c) | t | t | (0,4) (0,4) | normal | 3995 (c) | 3996 | t | t | (0,5) (0,5) | normal | 3996 | 0 (a) | | t | (0,5) (5 rows)
рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рдкреГрд╖реНрда рддрд╛рдЬрд╝рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреГрд╖реНрда рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЗрди-рдкреЗрдЬ рд╕рдлрд╛рдИ рдХреБрдЫ рднреА рдореБрдХреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИ:
=> UPDATE hot SET s = 'L';
| => COMMIT;
=> SELECT * FROM heap_page('hot',0);
ctid | state | xmin | xmax | hhu | hot | t_ctid -------+---------------+----------+----------+-----+-----+-------- (0,1) | redirect to 2 | | | | | (0,2) | normal | 3993 (c) | 3994 (c) | t | t | (0,3) (0,3) | normal | 3994 (c) | 3995 (c) | t | t | (0,4) (0,4) | normal | 3995 (c) | 3996 (c) | t | t | (0,5) (0,5) | normal | 3996 (c) | 3997 | | t | (1,1) (5 rows)
рд╕рдВрд╕реНрдХрд░рдг (0.5) рдореЗрдВ рд╣рдо рдПрдХ рд▓рд┐рдВрдХ (1.1) рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреЛ рдкреЗрдЬ 1 рдкрд░ рдЬрд╛рддрд╛ рд╣реИред
=> SELECT * FROM heap_page('hot',1);
ctid | state | xmin | xmax | hhu | hot | t_ctid -------+--------+------+-------+-----+-----+-------- (1,1) | normal | 3997 | 0 (a) | | | (1,1) (1 row)
рдЕрдм рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рджреЛ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЗрд╕рдХреА рдЧрд░реНрдо рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреА рд╣реИ:
=> SELECT * FROM index_page('hot_id',1);
itemoffset | ctid ------------+------- 1 | (1,1) 2 | (0,1) (2 rows)
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрди-рдкреЗрдЬ рд╕рдлрд╛рдИ рдФрд░ HOT-рдЕрдкрдбреЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИ, рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рд╕рдЪреНрдЪрд╛рдИ рдХреА рддрд▓рд╛рд╢ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдореИрдВ README.HOT рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ ред
рдЬрд╛рд░реА рд░рдЦрд╛ рдЬрд╛рдП ред