PostgreSQL-8 рдореЗрдВ MVCCред рдардВрдб

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

рдлрд┐рд░ рд╣рдордиреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдлрд╛рдИ рдХреА рдЬрд╛рдВрдЪ рдХреА: рдЗрдВрдЯреНрд░рд╛-рдкреЗрдЬ (HOT-рдЕрдкрдбреЗрдЯ рдХреЗ рд╕рд╛рде), рдирд┐рдпрдорд┐рдд рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд ред

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

рд▓реЗрди-рджреЗрди рдХрд╛рдЙрдВрдЯрд░ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣


PostgreSQL рдореЗрдВ рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП 32 рдмрд┐рдЯреНрд╕ рдЖрдмрдВрдЯрд┐рдд рд╣реИрдВред рдпрд╣ рдПрдХ рдХрд╛рдлреА рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ (рд▓рдЧрднрдЧ 4 рдмрд┐рд▓рд┐рдпрди) рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд░ рдХреЗ рд╕рдХреНрд░рд┐рдп рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд╛рде, рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 1000 рд▓реЗрди-рджреЗрди рдХреЗ рд▓реЛрдб рдкрд░, рдпрд╣ рдХреЗрд╡рд▓ рдбреЗрдврд╝ рдорд╣реАрдиреЗ рдФрд░ рдирд┐рд░рдВрддрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмрд╛рдж рд╣реЛрдЧрд╛ред

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



рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ рдХрд┐ рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП 64 рдмрд┐рдЯреНрд╕ рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВ - рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧреА? рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ (рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ) рд▓рд╛рдЗрди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╣реЗрдбрд░ рдореЗрдВ рджреЛ рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛ - рдПрдХреНрд╕рдорд┐рди рдФрд░ рдПрдХреНрд╕рдореИрдХреНрд╕ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред рд╣реЗрдбрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо 23 рдмрд╛рдЗрдЯреНрд╕, рдФрд░ рдмрд┐рдЯ рдЧрд╣рд░рд╛рдИ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╕реЗ рдЗрд╕рдХреЗ 8 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрдЧреАред рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИред

рд╣рдорд╛рд░реА рдХрдВрдкрдиреА рдХреЗ рдЙрддреНрдкрд╛рдж рдореЗрдВ 64-рдмрд┐рдЯ рд▓реЗрдирджреЗрди рдирдВрдмрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, рдкреНрд░реЛ рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬ рдХреЛ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд╣рд╛рдВ рднреА рдИрдорд╛рдирджрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ: xmin рдФрд░ xmax 32-bit рд░рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдкреГрд╖реНрда рдХреА рд╣реЗрдбрд┐рдВрдЧ рдореЗрдВ рдПрдХ рдЖрдо рддреМрд░ рдкрд░ "рдПрдХ рдпреБрдЧ рдХреА рд╢реБрд░реБрдЖрдд" рдкреЗрдЬ рдЪреМрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдХрд░реЗрдВ? рдПрдХ рд░реИрдЦрд┐рдХ рдЖрд░реЗрдЦ рдХреЗ рдмрдЬрд╛рдп, рд╕рднреА рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд▓реВрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рд▓реЗрди-рджреЗрди рдХреЗ рд▓рд┐рдП, "рд╡рд╛рдорд╛рд╡рд░реНрдд" рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдЖрдзреЗ рдХреЛ рдЕрддреАрдд рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рдЖрдзрд╛ "рджрдХреНрд╖рд┐рдгрд╛рд╡рд░реНрдд"ред

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



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



рд╕рдВрд╕реНрдХрд░рдг рдмрд░реНрдлрд╝реАрд▓реА рдФрд░ рджреГрд╢реНрдпрддрд╛ рдирд┐рдпрдо


рдЕрддреАрдд рд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдРрд╕реА "рдпрд╛рддреНрд░рд╛" рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдлрд╛рдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рд╕реНрдерд╛рди рдЦрд╛рд▓реА рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛) рдПрдХ рдФрд░ рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИред рд╡рд╣ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдкреБрд░рд╛рдиреЗ ("рдардВрдбреЗ") рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдкрд╛рддрд╛ рд╣реИ (рдЬреЛ рд╕рднреА рдЪрд┐рддреНрд░реЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ) рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ - рдЙрдиреНрд╣реЗрдВ "рдЬрдорд╛ рджреЗрддрд╛ рд╣реИ"ред рдкрдВрдХреНрддрд┐ рдХрд╛ рдЬрдореЗ рд╣реБрдП рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХрд┐рд╕реА рднреА рдирд┐рдпрдорд┐рдд рдбреЗрдЯрд╛ рд╕реЗ рдкреБрд░рд╛рдирд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрд╢рд╛ рд╕рднреА рдбреЗрдЯрд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓реЗрди-рджреЗрди рд╕рдВрдЦреНрдпрд╛ xmin рдХреЛ рджреЗрдЦрдирд╛ рдЕрдм рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рддрд╛рд░реЛрдВ рдХреЗ рдЬрдореЗ рд╣реБрдП рд╕рдВрд╕реНрдХрд░рдг рд╣рдореЗрд╢рд╛ рдЕрддреАрдд рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВред



рдЬрдореЗ рд╣реБрдП рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛ xmin рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреЛрдиреЛрдВ рд╕рдВрдХреЗрдд рдмрд┐рдЯреНрд╕ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ - рдХрдорд┐рдЯ рдмрд┐рдЯ рдФрд░ рд░рджреНрдж рдмрд┐рдЯред

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

рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВред рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рднрд░рд╛рд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдкрд░ рдХреЗрд╡рд▓ рджреЛ рд▓рд╛рдЗрдиреЗрдВ рдлрд┐рдЯ рд╣реЛрдВ - рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рджреЗрдЦрдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдФрд░ рд╕рдлрд╛рдИ рдХреЗ рд╕рдордп рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рди рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдВред

=> CREATE TABLE tfreeze( id integer, s char(300) ) WITH (fillfactor = 10, autovacuum_enabled = off); 

рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрдИ рд╡реЗрд░рд┐рдПрдВрдЯ рдмрдирд╛рдП рд╣реИрдВ, рдЬреЛ рдкреЗрдЬрд┐рдиреНрд╕рдкреЗрдХреНрдЯ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдкреЗрдЬ рдкрд░ рдореМрдЬреВрдж рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдм рд╣рдо рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рджреВрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдПрдВрдЧреЗ: рдЕрдм рдпрд╣ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдХрдИ рдкреЗрдЬ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ xmin рд▓реЗрдирджреЗрди рдХреА рдЖрдпреБ рджрд┐рдЦрд╛рдПрдЧрд╛ (рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рдЖрдпреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):

 => CREATE FUNCTION heap_page(relname text, pageno_from integer, pageno_to integer) RETURNS TABLE(ctid tid, state text, xmin text, xmin_age integer, xmax 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+512) = 256+512 THEN ' (f)' WHEN (t_infomask & 256) > 0 THEN ' (c)' WHEN (t_infomask & 512) > 0 THEN ' (a)' ELSE '' END AS xmin, age(t_xmin) xmin_age, t_xmax || CASE WHEN (t_infomask & 1024) > 0 THEN ' (c)' WHEN (t_infomask & 2048) > 0 THEN ' (a)' ELSE '' END AS xmax, t_ctid FROM generate_series(pageno_from, pageno_to) p(pageno), heap_page_items(get_raw_page(relname, pageno)) ORDER BY pageno, lp; $$ LANGUAGE SQL; 

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдардВрдб рдХрд╛ рд╕рдВрдХреЗрдд (рдЬреЛ рд╣рдо рдХреЛрд╖реНрдардХ рдореЗрдВ рдЕрдХреНрд╖рд░ f рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ) рдкреНрд░рддрд┐рдмрджреНрдз рдФрд░ рдирд┐рд░рд╕реНрдд рд╕рдВрдХреЗрддреЛрдВ рдХреА рдПрдХ рд╕рд╛рде рд╕реНрдерд╛рдкрдирд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрдИ рд╕реНрд░реЛрддреЛрдВ (рдкреНрд░рд▓реЗрдЦрди рд╕рд╣рд┐рдд) рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдЦреНрдпрд╛ рдлреНрд░реЛрдЬрдирдЯреНрд░рд╛рдВрд╕рдЖрдИрдб = 2 рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ, рдЬреЛ рдЬрдореЗ рд╣реБрдП рд▓реЗрдирджреЗрди рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИред рдРрд╕реА рдкреНрд░рдгрд╛рд▓реА рд╕рдВрд╕реНрдХрд░рдг 9.4 рддрдХ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдЗрд╕реЗ рдЯреВрд▓рдЯрд┐рдк рдмрд┐рдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдпрд╣ рдЖрдкрдХреЛ рд▓рд╛рдЗрди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдореВрд▓ рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рд╕рдорд░реНрдерди рдФрд░ рдбреАрдмрдЧрд┐рдВрдЧ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирдВрдмрд░ 2 рдХреЗ рд╕рд╛рде рд▓реЗрдирджреЗрди рдЕрднреА рднреА рдкреБрд░рд╛рдиреЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рднреА рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╣рдореЗрдВ pg_visibility рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рджреГрд╢реНрдпрддрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

 => CREATE EXTENSION pg_visibility; 

PostgreSQL 9.6 рд╕реЗ рдкрд╣рд▓реЗ, рджреГрд╢реНрдпрддрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдкреНрд░рддрд┐ рдкреГрд╖реНрда рдПрдХ рдмрд┐рдЯ рд╢рд╛рдорд┐рд▓ рдерд╛; рдпрд╣ рдЙрди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдХреЗрд╡рд▓ "рдХрд╛рдлреА рдкреБрд░рд╛рдиреЗ" рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╡рд╛рд▓реЗ рдкреГрд╖реНрдареЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА рдЪрд┐рддреНрд░реЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИрдВред рдпрд╣рд╛рдВ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдкреГрд╖реНрда рджреГрд╢реНрдпрддрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИ, рддреЛ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдЗрд╕рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рджреГрд╢реНрдпрддрд╛ рдирд┐рдпрдореЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд╕рдВрд╕реНрдХрд░рдг 9.6 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рдПрдХ рдлрд╝реНрд░реАрдЬрд╝ рдореИрдк рдПрдХ рд╣реА рдкрд░рдд рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ - рдкреНрд░рддрд┐ рдкреГрд╖реНрда рдПрдХ рдФрд░ рдмрд┐рдЯред рдлрд╝реНрд░реАрдЬрд╝ рдореИрдк рдЙрди рдкреГрд╖реНрдареЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рди рдкрд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рднреА рд╕рдВрд╕реНрдХрд░рдг рдЬрдореЗ рд╣реБрдП рд╣реИрдВред

рд╣рдо рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХрдИ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреГрд╢реНрдпрддрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреБрд░рдВрдд рд╕рдлрд╛рдИ рдХрд░рддреЗ рд╣реИрдВ:

 => INSERT INTO tfreeze(id, s) SELECT g.id, 'FOO' FROM generate_series(1,100) g(id); => VACUUM tfreeze; 

рдФрд░ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рджреЛрдиреЛрдВ рдкреГрд╖реНрда рдЕрдм рджреГрд╢реНрдпрддрд╛ рдорд╛рдирдЪрд┐рддреНрд░ (all_v рдЕрджреГрд╢реНрдп) рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдЬрдореЗ рд╣реБрдП рдирд╣реАрдВ рд╣реИрдВ (all_frozen):

 => SELECT * FROM generate_series(0,1) g(blkno), pg_visibility_map('tfreeze',g.blkno) ORDER BY g.blkno; 
  blkno | all_visible | all_frozen -------+-------------+------------ 0 | t | f 1 | t | f (2 rows) 

рд▓реЗрди-рджреЗрди рдХреА рдЖрдпреБ рдЬрд┐рд╕рдиреЗ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдпрд╛ (xmin_age) 1 рд╣реИ - рдпрд╣ рдЕрдВрддрд┐рдо рд▓реЗрдирджреЗрди рд╣реИ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

 => SELECT * FROM heap_page('tfreeze',0,1); 
  ctid | state | xmin | xmin_age | xmax | t_ctid -------+--------+---------+----------+-------+-------- (0,1) | normal | 697 (c) | 1 | 0 (a) | (0,1) (0,2) | normal | 697 (c) | 1 | 0 (a) | (0,2) (1,1) | normal | 697 (c) | 1 | 0 (a) | (1,1) (1,2) | normal | 697 (c) | 1 | 0 (a) | (1,2) (4 rows) 

рдардВрдб рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдЖрдпреБ


рддреАрди рдореБрдЦреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдардВрдб рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдмрджрд▓реЗ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

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

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

 => SHOW vacuum_freeze_min_age; 
  vacuum_freeze_min_age ----------------------- 50000000 (1 row) 

рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдардВрдб рдХреИрд╕реЗ рд╣реЛрддреА рд╣реИ, рд╣рдо рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдПрдХрддрд╛ рдореЗрдВ рдХрдо рдХрд░ рджреЗрддреЗ рд╣реИрдВред

 => ALTER SYSTEM SET vacuum_freeze_min_age = 1; => SELECT pg_reload_conf(); 

рдФрд░ рд╣рдо рд╢реВрдиреНрдп рдкреГрд╖реНрда рдкрд░ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗред рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЫреЛрдЯреЗ рдлрд┐рд▓рдлреИрдХреНрдЯрд░ рдорд╛рди рдХреЗ рдХрд╛рд░рдг рдЙрд╕реА рдкреГрд╖реНрда рдкрд░ рдкрд╣реБрдВрдЪ рдЬрд╛рдПрдЧрд╛ред

 => UPDATE tfreeze SET s = 'BAR' WHERE id = 1; 

рдпрд╣рд╛рдБ рдЕрдм рд╣рдо рдбреЗрдЯрд╛ рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ:

 => SELECT * FROM heap_page('tfreeze',0,1); 
  ctid | state | xmin | xmin_age | xmax | t_ctid -------+--------+---------+----------+-------+-------- (0,1) | normal | 697 (c) | 2 | 698 | (0,3) (0,2) | normal | 697 (c) | 2 | 0 (a) | (0,2) (0,3) | normal | 698 | 1 | 0 (a) | (0,3) (1,1) | normal | 697 (c) | 2 | 0 (a) | (1,1) (1,2) | normal | 697 (c) | 2 | 0 (a) | (1,2) (5 rows) 

рдЕрдм рд╡реИрдХреНрдпреВрдо_рдлреНрд░реАрдЬ_рдорд┐рди_рдПрдЬ = 1 рд╕реЗ рдкреБрд░рд╛рдиреА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдлреНрд░реАрдЬ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рджреГрд╢реНрдпрддрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рд╢реВрдиреНрдп рд░реЗрдЦрд╛ рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рд╣реИ (рдмрд┐рдЯ рдХреЛ UPDATE рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рд░реАрд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рд╕реЗ рдкреГрд╖реНрда рдмрджрд▓ рдЧрдпрд╛ рдерд╛), рдФрд░ рдкрд╣рд▓реЗ рд╡рд╛рд▓рд╛ рдЪреЗрдХ рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ:

 => SELECT * FROM generate_series(0,1) g(blkno), pg_visibility_map('tfreeze',g.blkno) ORDER BY g.blkno; 
  blkno | all_visible | all_frozen -------+-------------+------------ 0 | f | f 1 | t | f (2 rows) 

рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рд╣реИ рдХрд┐ рд╕рдлрд╛рдИ рдХреЗрд╡рд▓ рдЙрди рдкреГрд╖реНрдареЛрдВ рдХреЛ рд╕реНрдХреИрди рдХрд░рддреА рд╣реИ рдЬреЛ рджреГрд╢реНрдпрддрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ:

 => VACUUM tfreeze; => SELECT * FROM heap_page('tfreeze',0,1); 
  ctid | state | xmin | xmin_age | xmax | t_ctid -------+---------------+---------+----------+-------+-------- (0,1) | redirect to 3 | | | | (0,2) | normal | 697 (f) | 2 | 0 (a) | (0,2) (0,3) | normal | 698 (c) | 1 | 0 (a) | (0,3) (1,1) | normal | 697 (c) | 2 | 0 (a) | (1,1) (1,2) | normal | 697 (c) | 2 | 0 (a) | (1,2) (5 rows) 

рд╢реВрдиреНрдп рдкреГрд╖реНрда рдкрд░, рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдЬрдореЗ рд╣реБрдП рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдкреГрд╖реНрда рдиреЗ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдлрд╛рдИ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рдкреГрд╖реНрда рдкрд░ рдХреЗрд╡рд▓ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдмрдЪреЗ рд╣реИрдВ, рддреЛ рд╕рдлрд╛рдИ рдРрд╕реЗ рдкреГрд╖реНрда рдкрд░ рдирд╣реАрдВ рдЖрдПрдЧреА рдФрд░ рдЙрдиреНрд╣реЗрдВ рдлреНрд░реАрдЬ рдирд╣реАрдВ рдХрд░реЗрдЧреАред

 => SELECT * FROM generate_series(0,1) g(blkno), pg_visibility_map('tfreeze',g.blkno) ORDER BY g.blkno; 
  blkno | all_visible | all_frozen -------+-------------+------------ 0 | t | f 1 | t | f (2 rows) 

рдкреВрд░реА рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдлреНрд░реАрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдпреБ


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

рдкреНрд░рддреНрдпреЗрдХ рддрд╛рд▓рд┐рдХрд╛ рдПрдХ рд▓реЗрди-рджреЗрди рд╕рдВрдЦреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рд╕рднреА рдкреБрд░рд╛рдиреЗ рд▓реЗрдирджреЗрди рдЬрдореЗ рд╣реБрдП рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ (pg_class.relfrozenxid)ред рдЗрд╕ рдпрд╛рдж рдХрд┐рдП рдЧрдП рд▓реЗрдирджреЗрди рдХреА рдЙрдореНрд░ рдХреЗ рд╕рд╛рде, рд╡реИрдХреНрдпреВрдо_рдлреНрд░реАрдЬ_рдЯреЗрдмрд▓_рдПрдЬ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдореВрд▓реНрдп рдХреА рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ ред

 => SELECT relfrozenxid, age(relfrozenxid) FROM pg_class WHERE relname = 'tfreeze'; 
  relfrozenxid | age --------------+----- 694 | 5 (1 row) 

PostgreSQL 9.6 рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рднреА рдкреГрд╖реНрда рдХреНрд░реЙрд▓ рдХрд┐рдП рдЧрдП рдереЗ, рдХреНрд▓реАрдирдЕрдк рдиреЗ рдПрдХ рдкреВрд░реНрдг рддрд╛рд▓рд┐рдХрд╛ рд╕реНрдХреИрди рдХрд┐рдпрд╛ред рдмрдбрд╝реА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдСрдкрд░реЗрд╢рди рд▓рдВрдмрд╛ рдФрд░ рджреБрдЦрдж рдерд╛ред рдорд╛рдорд▓рд╛ рдЗрд╕ рддрдереНрдп рд╕реЗ рдмрдврд╝ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдпрджрд┐ рд╕рдлрд╛рдИ рдЕрдВрдд рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣реА (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрдзреАрд░ рдкреНрд░рд╢рд╛рд╕рдХ рдиреЗ рдПрдХ рдХрдорд╛рдВрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд┐рдпрд╛), рддреЛ рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рд╢реБрд░реВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред

рд╕рдВрд╕реНрдХрд░рдг 9.6 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рдлрд╝реНрд░реАрдЬрд╝ рдореИрдк рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж (рдЬрд┐рд╕реЗ рд╣рдо pg_visibility_map рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ all_frozen рдХреЙрд▓рдо рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ), рдХреЗрд╡рд▓ рдЙрди рдкреГрд╖реНрдареЛрдВ рдХреЛ рдмрд╛рдЗрдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рди рдХреЗрд╡рд▓ рдмрд╣реБрдд рдЫреЛрдЯреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХрд╛рдо рд╣реИ, рдмрд▓реНрдХрд┐ рд░реБрдХрд╛рд╡рдЯреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдкреНрд░рддрд┐рд░реЛрдз рд╣реИ: рдпрджрд┐ рд╕рдлрд╛рдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд░реЛрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЙрди рдкреГрд╖реНрдареЛрдВ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╡рд╣ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдардВрдб рдХреЗ рдирдХреНрд╢реЗ рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ рдереЗред

рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп, рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рднреА рдкреГрд╖реНрда рдПрдХ рдмрд╛рд░ ( рд╡реИрдХреНрдпреВрдо_рдлреНрд░реАрдЬ_рдЯреЗрдмрд▓_рдЬреИрд╕реЗ - рд╡реИрдХреНрдпреВрдо_рдлреНрд░реАрдЬ_рдорд┐рди_рдЬреЗрдЬ ) рд▓реЗрдирджреЗрди рдореЗрдВ рдЬрдореЗ рд╣реБрдП рд╣реИрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде, рдпрд╣ рдкреНрд░рддрд┐ рдорд┐рд▓рд┐рдпрди рд▓реЗрдирджреЗрди рдПрдХ рдмрд╛рд░ рд╣реЛрддрд╛ рд╣реИ:

 => SHOW vacuum_freeze_table_age; 
  vacuum_freeze_table_age ------------------------- 150000000 (1 row) 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡реИрдХреНрдпреВрдо_рдлреНрд░реАрдЬ_рдорд┐рди_рдЬреЗрдЬ рдХреЛ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдУрд╡рд░рд╣реЗрдб рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдмрдврд╝рд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдкреВрд░реА рдореЗрдЬ рдХреИрд╕реЗ рдЬрдореА рд╣реБрдИ рд╣реИ, рдФрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡реИрдХреНрдпреВрдо_рдлреНрд░реАрдЬ_рдЯреЗрдмрд▓_рдкреЗрдЬ рдХреЛ 5 рддрдХ рдХрдо рдХрд░реЗрдВ рддрд╛рдХрд┐ рдардВрдб рдХреА рд╕реНрдерд┐рддрд┐ рдкреВрд░реА рд╣реЛ рд╕рдХреЗред

 => ALTER SYSTEM SET vacuum_freeze_table_age = 5; => SELECT pg_reload_conf(); 

рд╕рд╛рдл рдХрд░рддреЗ рд╣реИрдВ:

 => VACUUM tfreeze; 

рдЕрдм, рдЪреВрдВрдХрд┐ рдкреВрд░реА рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреА рдЧрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдореЗ рд╣реБрдП рд▓реЗрдирджреЗрди рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ - рд╣рдореЗрдВ рдпрдХреАрди рд╣реИ рдХрд┐ рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рдкреБрд░рд╛рдирд╛, рдЕрдкреНрд░рдЪрд▓рд┐рдд рд▓реЗрдирджреЗрди рдирд╣реАрдВ рд╣реИред

 => SELECT relfrozenxid, age(relfrozenxid) FROM pg_class WHERE relname = 'tfreeze'; 
  relfrozenxid | age --------------+----- 698 | 1 (1 row) 

рдЕрдм рдкрд╣рд▓реЗ рдкреГрд╖реНрда рдХреА рд╕рднреА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬрдореА рд╣реБрдИ рд╣реИрдВ:

 => SELECT * FROM heap_page('tfreeze',0,1); 
  ctid | state | xmin | xmin_age | xmax | t_ctid -------+---------------+---------+----------+-------+-------- (0,1) | redirect to 3 | | | | (0,2) | normal | 697 (f) | 2 | 0 (a) | (0,2) (0,3) | normal | 698 (c) | 1 | 0 (a) | (0,3) (1,1) | normal | 697 (f) | 2 | 0 (a) | (1,1) (1,2) | normal | 697 (f) | 2 | 0 (a) | (1,2) (5 rows) 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╣рд▓рд╛ рдкреГрд╖реНрда рдлреНрд░реАрдЬрд╝ рдореИрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 => SELECT * FROM generate_series(0,1) g(blkno), pg_visibility_map('tfreeze',g.blkno) ORDER BY g.blkno; 
  blkno | all_visible | all_frozen -------+-------------+------------ 0 | t | f 1 | t | t (2 rows) 

"рдЖрдХреНрд░рд╛рдордХ" рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЖрдпреБ


рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рд╕рдордп рдкрд░ рдлреНрд░реАрдЬ рд╣реЛ рдЬрд╛рдПрдВред рдпрджрд┐ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рд▓реЗрдирджреЗрди рдЬреЛ рдЕрднреА рддрдХ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдореЗ рд╣реБрдП рдЬреЛрдЦрд┐рдо рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП PostgreSQL рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдЗрд╕рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░рдг рд╣реИрдВред

  • рдСрдЯреЛ рд╕рдлрд╛рдИ рдХреЛ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдирд┐рдпрдорд┐рдд рд╕рдлрд╛рдИ рднреА рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдХрд╣ рдЪреБрдХреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдпрд╣ рд╕рдВрднрд╡ рд╣реИред
  • рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╢рд╛рдорд┐рд▓ рдСрдЯреЛ-рд╕рдлрд╛рдИ рдЙрди рдбреЗрдЯрд╛рдмреЗрд╕реЛрдВ рдореЗрдВ рдирд╣реАрдВ рдЖрддреА рд╣реИ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ( рдЯреНрд░реИрдХ_рдХрд╛рдЙрдВрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ0 рдбреЗрдЯрд╛рдмреЗрд╕ рдпрд╛рдж рд░рдЦреЗрдВ)ред
  • рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рджреЗрдЦрд╛ рдерд╛ , рд╕реНрдХрд┐рдб рдЯреЗрдмрд▓ рдХреЛ рд╕рд╛рдл рдХрд░рдирд╛ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗрд╡рд▓ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдЯрд╛рдпрд╛ рдпрд╛ рдмрджрд▓рд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИред

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

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореВрд▓реНрдп рдмрд╣реБрдд рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╣реИ:

 => SHOW autovacuum_freeze_max_age; 
  autovacuum_freeze_max_age --------------------------- 200000000 (1 row) 

рдСрдЯреЛрд╡реИрдХреНрдпреВрдо_рдлреНрд░реАрдЬ_рдореИрдХреНрд╕_рдПрдЬ рдХреА рд╕реАрдорд╛ 2 рдмрд┐рд▓рд┐рдпрди рд▓реЗрдирджреЗрди рд╣реИ, рдФрд░ 10 рдЧреБрдирд╛ рдЫреЛрдЯреЗ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ: рдореВрд▓реНрдп рдмрдврд╝рд╛рдиреЗ рд╕реЗ рд╣рдо рдЬреЛрдЦрд┐рдо рдмрдврд╝рд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╢реЗрд╖ рд╕рдордп рдХреЗ рд▓рд┐рдП, рдСрдЯреЛ-рд╕рдлрд╛рдИ рдореЗрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдлреНрд░реАрдЬ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

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

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

рдСрдЯреЛрд╡реИрдХреНрдпреВрдо_рдлреНрд░реАрдЬ_рдореИрдХреНрд╕_рдПрдЬ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдКрдкрд░ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рднрдВрдбрд╛рд░рдг рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд╕реНрддрд░ рдкрд░ рднреА рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдХреЗрд╡рд▓ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЬрдм рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рджреЗрдЦрднрд╛рд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЯреЗрдмрд▓ рд╕реНрддрд░ рдкрд░ (рдФрд░ рдЙрд╕реА рд╕рдордп рд╕рд╛рдорд╛рдиреНрдп рднрд░рд╛рд╡ рдХреЛ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ) рдкрд░ рдСрдЯреЛрд╡реИрдХреНрдпреВрдо_рдлреНрд░реАрдЬ_рдореИрдХреНрд╕_рдПрдЬ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдиреНрдпреВрдирддрдо рд╕рдВрднрд╡ рдореВрд▓реНрдп 100,000 рд╣реИ:

 => ALTER TABLE tfreeze SET (autovacuum_freeze_max_age = 100000, fillfactor = 100); 

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 100,000 рд▓реЗрдирджреЗрди рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╣рдореЗрдВ рд░реБрдЪрддреА рд╣реИред рд▓реЗрдХрд┐рди, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдХрдо рдореВрд▓реНрдп рд╣реИред

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

 => CREATE PROCEDURE foo(id integer) AS $$ BEGIN INSERT INTO tfreeze VALUES (id, 'FOO'); COMMIT; END; $$ LANGUAGE plpgsql; => DO $$ BEGIN FOR i IN 101 .. 100100 LOOP CALL foo(i); END LOOP; END; $$; 

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЕрдВрддрд┐рдо рдЬрдореЗ рд╣реБрдП рд▓реЗрдирджреЗрди рдХреА рдЖрдпреБ рд╕реАрдорд╛ рдореВрд▓реНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЧрдИ рд╣реИ:

 => SELECT relfrozenxid, age(relfrozenxid) FROM pg_class WHERE relname = 'tfreeze'; 
  relfrozenxid | age --------------+-------- 698 | 100006 (1 row) 

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

 => SELECT relfrozenxid, age(relfrozenxid) FROM pg_class WHERE relname = 'tfreeze'; 
  relfrozenxid | age --------------+----- 100703 | 3 (1 row) 

рдмрд╣реБ-рд▓реЗрди-рджреЗрди рдХреЛ рдлреНрд░реАрдЬрд╝ рдХрд░рдиреЗ рдЬреИрд╕реА рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдЕрднреА рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХреА рд╣реИ - рд╣рдо рдЗрд╕реЗ рддрдм рддрдХ рдХреЗ рд▓рд┐рдП рд╕реНрдердЧрд┐рдд рдХрд░ рджреЗрдВрдЧреЗ рдЬрдм рддрдХ рд╣рдо рддрд╛рд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдЦреБрдж рд╕реЗ рдЖрдЧреЗ рди рдирд┐рдХрд▓ рд╕рдХреЗрдВред

рдореИрдиреБрдЕрд▓ рдардВрдб


рдХрднреА-рдХрднреА рдСрдЯреЛ-рд╕рдлрд╛рдИ рдХреЗ рдЖрдЧрдорди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдлреНрд░реАрдЬ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрддрд╛ рд╣реИред

рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ VACUUM FREEZE рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХрдорд╛рдВрдб рдХреЛ рдлреНрд░реАрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд▓реЗрди-рджреЗрди рдХреА рдЙрдореНрд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рднреА рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рдЬрдореЗ рд╣реБрдП рд╣реЛрдВрдЧреЗ (рдЬреИрд╕реЗ рдХрд┐ рдСрдЯреЛрд╡реИрдХреНрдпреВрдо_рдлреНрд░реАрдЬ_рдорд┐рди_рдЬ = 0 рдкреИрд░рд╛рдореАрдЯрд░)ред рдЬрдм рдПрдХ рддрд╛рд▓рд┐рдХрд╛ VACUUM FULL рдпрд╛ CLUSTER рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╕рднреА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рднреА рдЬрдореА рд╣реБрдИ рд╣реЛрддреА рд╣реИрдВред

рд╕рднреА рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдлреНрд░реАрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 vacuumdb --all --freeze 

FREEZE рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ COPY рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдбреЗрдЯрд╛ рдХреЛ рднреА рдлреНрд░реАрдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЙрд╕реА рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╛ TRUNCATE рдХрдорд╛рдВрдб рд╕реЗ рдЦрд╛рд▓реА рдХрд┐рдпрд╛ рдЧрдпрд╛)
COPY рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдирджреЗрдиред

рдЪреВрдВрдХрд┐ рдЬрдореЗ рд╣реБрдП рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рджреГрд╢реНрдпрддрд╛ рдирд┐рдпрдо рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдРрд╕реА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╕рд╛рдорд╛рдиреНрдп рдЕрд▓рдЧрд╛рд╡ рдирд┐рдпрдореЛрдВ рдХреЗ рдЙрд▓реНрд▓рдВрдШрди рдореЗрдВ рдЕрдиреНрдп рд▓реЗрдирджреЗрди рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕реНрдиреИрдкрд╢реЙрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреА (рдпрд╣ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкрдврд╝рдиреЗ рдпрд╛ рд╕реАрд░рд┐рдпрд▓ рд╕реНрддрд░ рдХреЗ рд╕рд╛рде рд▓реЗрдирджреЗрди рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ)ред

рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░реЗ рд╕рддреНрд░ рдореЗрдВ, рджреЛрд╣рд░рд╛рдиреЗ рдпреЛрдЧреНрдп рдЕрд▓рдЧрд╛рд╡ рд╕реНрддрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд▓реЗрдирджреЗрди рд╢реБрд░реВ рдХрд░реЗрдВ:

 | => BEGIN ISOLATION LEVEL REPEATABLE READ; | => SELECT txid_current(); 

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

 => BEGIN; => TRUNCATE tfreeze; => COPY tfreeze FROM stdin WITH FREEZE; 
 1 FOO 2 BAR 3 BAZ \. 
 => COMMIT; 

рдЕрдм рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рд▓реЗрдирджреЗрди рдирдпрд╛ рдбреЗрдЯрд╛ рджреЗрдЦрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрд▓рдЧрд╛рд╡ рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ:

 | => SELECT count(*) FROM tfreeze; 
 | count | ------- | 3 | (1 row) 
 | => COMMIT; 

рд▓реЗрдХрд┐рди, рдЪреВрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

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

рдирд┐рд╖реНрдХрд░реНрд╖


рдпрд╣ PostgreSQL рдЕрд▓рдЧрд╛рд╡ рдФрд░ рдорд▓реНрдЯреАрд╡реЛрд░реНрд╕ рдкрд░ рд▓реЗрдЦреЛрдВ рдХреА рдореЗрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж - рд╡реЗ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдХреНрд╕рд░ рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореЗрд░реЗ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рд╕рд╛рде рдмрдиреЗ рд░рд╣реЗрдВ!

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


All Articles