DBA: рд╕рдХреНрд╖рдо рд░реВрдкрдорд╛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬреЗрд╕рди рд░ рдЖрдпрд╛рддрд╣рд░реВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрдиреБрд╣реЛрд╕реН

рдареВрд▓рд╛ рдбрд╛рдЯрд╛ рд╕реЗрдЯрд╣рд░реВрдХреЛ рдЬрдЯрд┐рд▓ рдкреНрд░рд╢реЛрдзрдирдХреЛ рд▓рд╛рдЧрд┐ (рднрд┐рдиреНрди ETL рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ: рдЖрдпрд╛рдд, рд░реВрдкрд╛рдиреНрддрд░рдг рд░ рдмрд╛рд╣реНрдп рд╕реНрд░реЛрддрд╕рдБрдЧ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬреЗрд╕рди) рдЕрдХреНрд╕рд░ рддреНрдпрд╣рд╛рдБ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЫ рдЕрд╕реНрдерд╛рдпреА рд░реВрдкрдорд╛ "рд╕рдореНрдЭрдирд╛" рд░ рддреБрд░реБрдиреНрддреИ рдЫрд┐рдЯреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд╣рд┐ рдареВрд▓реЛред

рдпрд╕ рдкреНрд░рдХрд╛рд░рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдпреЛ рдЬрд╕реНрддреИ рдХреЗрд╣рд┐ рд╕реБрдирд┐рдиреНрдЫ: "рдареНрдпрд╛рдХреНрдХ рдпрд╣рд╛рдБ рдЧреНрд░рд╛рд╣рдХ рдмреИрдВрдХрдмрд╛рдЯ рд▓реЗрдЦрд╛ рд╡рд┐рднрд╛рдЧ рдЕрдирд▓реЛрдб рдЧрд░рд┐рдпреЛ рдЕрдиреНрддрд┐рдо рдкреНрд░рд╛рдкреНрдд рднреБрдХреНрддрд╛рдиреАрд╣рд░реВ, рддрдкрд╛рдИрдВрд▓реЗ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдЫрд┐рдЯреЛ рд╡реЗрдмрд╕рд╛рдЗрдЯрдорд╛ рдЕрдкрд▓реЛрдб рдЧрд░реНрди рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рддрдкрд╛рдИрдВрдХреЛ рдЦрд╛рддрд╛рд╣рд░реВрдорд╛ рд▓рд┐рдЩреНрдХ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред"

рддрд░ рдЬрдм рдпреЛ "рдХреЗрд╣рд┐" рдХреЛ рднреЛрд▓реНрдпреБрдо рд╕рдпреМрдВ рдореЗрдЧрд╛рдмрд╛рдЗрдЯрдорд╛ рдорд╛рдкрди рдЧрд░реНрди рдерд╛рд▓реНрдЫ, рд░ рд╕реЗрд╡рд╛рд▓реЗ рдбрд╛рдЯрд╛рдмреЗрд╕ 24x7 рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди рдЬрд╛рд░реА рд░рд╛рдЦреНрдиреБрдкрд░реНрдЫ, рдзреЗрд░реИ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯрд╣рд░реВ рдЙрддреНрдкрдиреНрди рд╣реБрдиреНрдЫрдиреН рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрдХреЛ рдЬреАрд╡рдирд▓рд╛рдИ рдмрд░реНрдмрд╛рдж рдЧрд░реНрдиреЗрдЫред
DBA: рд╕рдХреНрд╖рдо рд░реВрдкрдорд╛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬреЗрд╕рди рд░ рдЖрдпрд╛рддрд╣рд░реВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрдиреБрд╣реЛрд╕реН
PostgreSQL рдорд╛ рддрд┐рдиреАрд╣рд░реВрд╕рдБрдЧ рд╕рдореНрдЭреМрддрд╛ рдЧрд░реНрди (рд░ рдпрд╕рдорд╛ рдорд╛рддреНрд░ рд╣реЛрдЗрди), рддрдкрд╛рдИрдВрд▓реЗ рдХреЗрд╣реА рдЕрдкреНрдЯрд┐рдорд╛рдЗрдЬреЗрд╕рдирд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рд╕рдмреИ рдХреБрд░рд╛рд▓рд╛рдИ рдЫрд┐рдЯреЛ рд░ рдХрдо рд╕реНрд░реЛрдд рдЦрдкрддрдХреЛ рд╕рд╛рде рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреЗрдЫред

1. рдХрд╣рд╛рдБ рдкрдард╛рдЙрдиреЗ?

рдкрд╣рд┐рд▓реЗ, рд╣рд╛рдореАрд▓реЗ "рдкреНрд░рдХреНрд░рд┐рдпрд╛" рдЧрд░реНрди рдЪрд╛рд╣реЗрдХреЛ рдбрд╛рдЯрд╛ рдХрд╣рд╛рдБ рдЕрдкрд▓реЛрдб рдЧрд░реНрдиреЗ рднрдиреНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реМрдВред

рез.резред рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ (рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛)

рд╕рд┐рджреНрдзрд╛рдиреНрддрдорд╛, PostgreSQL рдХреЛ рд▓рд╛рдЧрд┐ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ рдХреБрдиреИ рдкрдирд┐ рдЕрдиреНрдп рдЬрд╕реНрддреИ рдЫрдиреНред рддреНрдпрд╕реИрд▓реЗ рдЕрдиреНрдзрд╡рд┐рд╢реНрд╡рд╛рд╕ рдорди рдкрд░реНрдЫрдиреН "рддреНрдпрд╣рд╛рдБ рд╕рдмреИ рдХреБрд░рд╛ рдореЗрдореЛрд░реАрдорд╛ рдорд╛рддреНрд░ рднрдгреНрдбрд╛рд░ рдЧрд░рд┐рдПрдХреЛ рдЫ, рд░ рдпреЛ рд╕рдорд╛рдкреНрдд рд╣реБрди рд╕рдХреНрдЫ"ред рддрд░ рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рднрд┐рдиреНрдирддрд╛рд╣рд░реВ рдкрдирд┐ рдЫрдиреНред

рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рдкреНрд░рддреНрдпреЗрдХ рдЬрдбрд╛рдирдХреЛ рд▓рд╛рдЧрд┐ рддрдкрд╛рдИрдВрдХреЛ рдЖрдлреНрдиреИ "рдиреЗрдорд╕реНрдкреЗрд╕"

рдпрджрд┐ рджреБрдИ рдЬрдбрд╛рдирд╣рд░реВ рдПрдХреИ рд╕рдордпрдорд╛ рдЬрдбрд╛рди рдЧрд░реНрди рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреБрд╣реЛрд╕реН CREATE TABLE x, рддрдм рдХрд╕реИрд▓реЗ рдкрдХреНрдХреИ рдкрд╛рдЙрдиреЗрдЫ рдЧреИрд░-рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рддреНрд░реБрдЯрд┐ рдбрд╛рдЯрд╛рдмреЗрд╕ рд╡рд╕реНрддреБрд╣рд░реВред

рддрд░ рджреБрд╡реИрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реЗрдорд╛ CREATE TEMPORARY TABLE x, рддреНрдпрд╕рдкрдЫрд┐ рджреБрдмреИрд▓реЗ рдпрд╕рд▓рд╛рдИ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдкрдорд╛ рдЧрд░реНрдиреЗрдЫрдиреН, рд░ рд╕рдмреИрд▓реЗ рдкрд╛рдЙрдиреЗрдЫрдиреН рддрдкрд╛рдИрдВрдХреЛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВред рд░ рддрд┐рдиреАрд╣рд░реВ рдмреАрдЪрдорд╛ рдХреЗрд╣рд┐ рд╕рдорд╛рди рд╣реБрдиреЗрдЫреИрдиред

рд╡рд┐рдЪреНрдЫреЗрдж рдЧрд░реНрджрд╛ "рдЖрддреНрдо-рд╡рд┐рдирд╛рд╢"

рдЬрдм рдЬрдбрд╛рди рдмрдиреНрдж рд╣реБрдиреНрдЫ, рд╕рдмреИ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдореЗрдЯрд╛рдЗрдиреНрдЫ, рддреНрдпрд╕реИрд▓реЗ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ DROP TABLE x рдмрд╛рд╣реЗрдХ рдХреБрдиреИ рдмрд┐рдиреНрджреБ рдЫреИрди ...

рдпрджрд┐ рддрдкрд╛рдИрдВ рдорд╛рд░реНрдлрдд рдХрд╛рдо рдЧрд░реНрджреИ рд╣реБрдиреБрд╣реБрдиреНрдЫ рд▓реЗрдирджреЗрди рдореЛрдбрдорд╛ pgbouncer, рддрдм рдбрд╛рдЯрд╛рдмреЗрд╕рд▓реЗ рдпреЛ рдЬрдбрд╛рди рдЕрдЭреИ рд╕рдХреНрд░рд┐рдп рдЫ рднрдиреНрдиреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдЧрд░реНрди рдЬрд╛рд░реА рд░рд╛рдЦреНрдЫ, рд░ рдпрд╕рдорд╛ рдпреЛ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдЕрдЭреИ рдЕрд╡рд╕реНрдерд┐рдд рдЫред

рддреНрдпрд╕рдХрд╛рд░рдг, pgbouncer рдорд╛ рдлрд░рдХ рдЬрдбрд╛рдирдмрд╛рдЯ рдпрд╕рд▓рд╛рдИ рдкреБрди: рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрджрд╛, рддреНрд░реБрдЯрд┐ рд╣реБрдиреЗрдЫред рддрд░ рдпрд╕рд▓рд╛рдИ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд░реЛрдХреНрди рд╕рдХрд┐рдиреНрдЫ CREATE TEMPORARY TABLE IF NOT EXISTS x.

рд╕рд╛рдБрдЪреЛ, рдпреЛ рдЬреЗ рднрдП рдкрдирд┐ рдпреЛ рдирдЧрд░реНрдиреБ рд░рд╛рдореНрд░реЛ рдЫ, рдХрд┐рдирдХрд┐ рддреНрдпрд╕рдкрдЫрд┐ рддрдкрд╛рдЗрдБ "рдЕрдЪрд╛рдирдХ" рддреНрдпрд╣рд╛рдБ "рдЕрдШрд┐рд▓реНрд▓реЛ рдорд╛рд▓рд┐рдХ" рдмрд╛рдЯ рдмрд╛рдБрдХреА рдбрд╛рдЯрд╛ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдпрд╕рдХреЛ рд╕рдЯреНрдЯрд╛, рдпреЛ рдореНрдпрд╛рдиреБрдЕрд▓ рдкрдвреНрди рдзреЗрд░реИ рд░рд╛рдореНрд░реЛ рдЫ рд░ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ рддрд╛рд▓рд┐рдХрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрд╛ рдпреЛ рдердкреНрди рд╕рдореНрднрд╡ рдЫ ON COMMIT DROP - рддреНрдпреЛ рд╣реЛ, рдЬрдм рд▓реЗрдирджреЗрди рдкреВрд░рд╛ рд╣реБрдиреНрдЫ, рддрд╛рд▓рд┐рдХрд╛ рд╕реНрд╡рддрдГ рдореЗрдЯрд┐рдиреЗрдЫред

рдЧреИрд░-рдкреНрд░рддрд┐рдХреГрддрд┐

рдХрд┐рдирднрдиреЗ рддрд┐рдиреАрд╣рд░реВ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЬрдбрд╛рдирд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЫрдиреН, рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ рдкреНрд░рддрд┐рдХреГрддрд┐ рдЫреИрдирдиреНред рддрд░ рдпрд╕рд▓реЗ рдбрд╛рдЯрд╛рдХреЛ рджреЛрд╣реЛрд░реЛ рд░реЗрдХрд░реНрдбрд┐рдЩрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛рд▓рд╛рдИ рд╣рдЯрд╛рдЙрдБрдЫ рд╣рд┐рдк + WAL рдорд╛, рддреНрдпрд╕реИрд▓реЗ рдпрд╕рдорд╛ INSERT/UPDATE/DELETE рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рд░реВрдкрдорд╛ рдЫрд┐рдЯреЛ рдЫред

рддрд░ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдЕрдЭреИ рдкрдирд┐ "рд▓рдЧрднрдЧ рд╕рд╛рдзрд╛рд░рдг" рддрд╛рд▓рд┐рдХрд╛ рднрдПрдХреЛрд▓реЗ, рдпрд╕рд▓рд╛рдИ рдкреНрд░рддрд┐рдХреГрддрд┐рдорд╛ рдкрдирд┐ рдмрдирд╛рдЙрди рд╕рдХрд┐рдБрджреИрдиред рдХрдореНрддрд┐рдорд╛ рдЕрд╣рд┐рд▓реЗрдХреЛ рд▓рд╛рдЧрд┐, рдпрджреНрдпрдкрд┐ рд╕рдореНрдмрдиреНрдзрд┐рдд рдкреНрдпрд╛рдЪ рд▓рд╛рдореЛ рд╕рдордпрджреЗрдЦрд┐ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдЫред

рез.реиред рдЕрдирд▓рдЧ рдЧрд░рд┐рдПрдХреЛ рддрд╛рд▓рд┐рдХрд╛

рддрд░ рддрдкрд╛рдИрд▓реЗ рдХреЗ рдЧрд░реНрдиреБ рдкрд░реНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпрджрд┐ рддрдкрд╛рдЗрдБрд╕рдБрдЧ рдХреЗрд╣рд┐ рдкреНрд░рдХрд╛рд░рдХреЛ рдмреЛрдЭрд┐рд▓ ETL рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЫ рдЬреБрди рдПрдХ рд▓реЗрдирджреЗрди рднрд┐рддреНрд░ рд▓рд╛рдЧреВ рдЧрд░реНрди рд╕рдХрд┐рдБрджреИрди, рддрд░ рддрдкрд╛рдЗрдБрд╕рдБрдЧ рдЕрдЭреИ рдЫред рд▓реЗрдирджреЗрди рдореЛрдбрдорд╛ pgbouncer? ..

рд╡рд╛ рдбрд╛рдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рдпрддрд┐ рдареВрд▓реЛ рдЫ рдХрд┐ рдПрдЙрдЯрд╛ рдЬрдбрд╛рдирдорд╛ рдкрд░реНрдпрд╛рдкреНрдд рдмреНрдпрд╛рдиреНрдбрд╡рд┐рде рдЫреИрди рдбрд╛рдЯрд╛рдмреЗрд╕рдмрд╛рдЯ (рдкрдвреНрдиреБрд╣реЛрд╕реН, рдкреНрд░рддрд┐ CPU рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛)?..

рд╡рд╛ рдХреЗрд╣реА рдЕрдкрд░реЗрд╢рдирд╣рд░реВ рднрдЗрд░рд╣реЗрдХрд╛ рдЫрдиреН рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рд░реВрдкрдорд╛ рд╡рд┐рднрд┐рдиреНрди рд╕рдореНрдмрдиреНрдзрдорд╛?..

рдпрд╣рд╛рдБ рдПрдХ рдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рдЫ - рдЕрд╕реНрдерд╛рдпреА рд░реВрдкрдорд╛ рдЧреИрд░-рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдкреБрди, рд╣реЛред рддреНрдпреЛ рд╣реЛ:

  • "рдореЗрд░реЛ рдЖрдлреНрдиреИ" рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ рдЕрдзрд┐рдХрддрдо рдЕрдирд┐рдпрдорд┐рдд рдирд╛рдорд╣рд░реВрдХреЛ рд╕рд╛рде рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдпреЛ рддрд╛рдХрд┐ рдХрд╕реИрд╕рдБрдЧ рдирдорд┐рд▓реЛрд╕реН
  • рдирд┐рдХрд╛рд▓реНрдиреБрд╣реЛрд╕реН: рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдмрд╛рд╣реНрдп рд╕реНрд░реЛрддрдмрд╛рдЯ рдбрд╛рдЯрд╛ рднрд░рд┐рдпреЛ
  • рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрдиреБрд╣реЛрд╕реН: рд░реВрдкрд╛рдиреНрддрд░рд┐рдд, рдХреБрдЮреНрдЬреА рд▓рд┐рдЩреНрдХрд┐рдЩ рдХреНрд╖реЗрддреНрд░рд╣рд░реВрдорд╛ рднрд░рд┐рдПрдХреЛ
  • рд▓реЛрдб: рд▓рдХреНрд╖рд┐рдд рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВрдорд╛ рддрдпрд╛рд░ рдбрд╛рдЯрд╛ рдЦрдиреНрдпрд╛рдЗрдпреЛ
  • "рдореЗрд░реЛ" рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ рд╣рдЯрд╛рдЗрдпреЛ

рд░ рдЕрдм - рдорд▓рдо рдорд╛ рдПрдХ рдлреНрд▓рд╛рдИред рд╡рд╛рд╕реНрддрдмрдорд╛, PostgreSQL рдорд╛ рд╕рдмреИ рд▓реЗрдЦ рджреБрдИ рдкрдЯрдХ рд╣реБрдиреНрдЫ - WAL рдорд╛ рдкрд╣рд┐рд▓реЛ, рддреНрдпрд╕рдкрдЫрд┐ рддрд╛рд▓рд┐рдХрд╛/рд╕реВрдЪрдХрд╛рдВрдХ рдирд┐рдХрд╛рдпрд╣рд░реВрдорд╛ред рдпреЛ рд╕рдмреИ ACID рд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрди рд░ рдмреАрдЪрдХреЛ рдбрд╛рдЯрд╛ рджреГрд╢реНрдпрддрд╛ рд╕рд╣реА рдЧрд░реНрди рдЧрд░рд┐рдиреНрдЫ COMMIT'рдЕрдЦрд░реЛрдЯ рд░ ROLLBACK'рд╢реВрдиреНрдп рд▓реЗрдирджреЗрдиред

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

рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, PostgreSQL рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВ, рд╕рдВрд╕реНрдХрд░рдг 9.1 рдорд╛ рдлрд┐рд░реНрддрд╛, рдпрд╕реНрддреЛ рдЪреАрдЬ рдкреЗрд╢ рдЧрд░реЗ рдЬрд╕реНрддреИ рдЕрдирд▓рдЧ рдЧрд░рд┐рдПрдХрд╛ рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ:

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

рдЫреЛрдЯрдХрд░реАрдорд╛ рдпреЛ рдзреЗрд░реИ рдЫрд┐рдЯреЛ рд╣реБрдиреЗрдЫ, рддрд░ рдпрджрд┐ рдбрд╛рдЯрд╛рдмреЗрд╕ рд╕рд░реНрднрд░ "рдЭрд░реНрдЫ", рдпреЛ рдЕрдкреНрд░рд┐рдп рд╣реБрдиреЗрдЫред рддрд░ рдпреЛ рдХрддрд┐ рдкрдЯрдХ рд╣реБрдиреНрдЫ, рд░ рдХреЗ рддрдкрд╛рдЗрдБрдХреЛ ETL рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓реЗ рдбрд╛рдЯрд╛рдмреЗрд╕рд▓рд╛рдИ "рдкреБрдирд░реБрддреНрдерд╛рди" рдкрдЫрд┐ рдпрд╕рд▓рд╛рдИ "рдмрд┐рдЪрдмрд╛рдЯ" рд╕рд╣реА рд░реВрдкрдорд╛ рдХрд╕рд░реА рд╕рдЪреНрдпрд╛рдЙрдиреЗ рднрдиреЗрд░ рдерд╛рд╣рд╛ рдЫ?...

рдпрджрд┐ рд╣реЛрдЗрди рднрдиреЗ, рд░ рдорд╛рдерд┐рдХреЛ рдХреЗрд╕ рддрдкрд╛рдИрдВрдХреЛ рдЬрд╕реНрддреИ рдЫ, рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН UNLOGGEDрддрд░ рдХрд╣рд┐рд▓реНрдпреИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВрдорд╛ рдпреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рдХреНрд╖рдо рдирдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЬреБрди рдбрд╛рдЯрд╛ рддрдкрд╛рдИрд▓рд╛рдИ рдкреНрд░рд┐рдп рдЫред

рез.рейред рдХрдорд┐рдЯрдорд╛ { рдкрдЩреНрдХреНрддрд┐рд╣рд░реВ рд╣рдЯрд╛рдЙрдиреБрд╣реЛрд╕реН | рдбреНрд░рдк}

рдпреЛ рд╕рдВрд░рдЪрдирд╛рд▓реЗ рддрд╛рд▓рд┐рдХрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрд╛ рд▓реЗрдирджреЗрди рдкреВрд░рд╛ рд╣реБрдБрджрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред

рдмрд╛рд░реЗрдорд╛ ON COMMIT DROP рдореИрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рдорд╛рдерд┐ рд▓реЗрдЦреЗрдХреЛ рдЫреБ, рдпрд╕рд▓реЗ рдЙрддреНрдкрдиреНрди рдЧрд░реНрджрдЫ DROP TABLE, рддрд░ рд╕рдВрдЧ ON COMMIT DELETE ROWS рд╕реНрдерд┐рддрд┐ рдердк рд░реЛрдЪрдХ рдЫ - рдпреЛ рдпрд╣рд╛рдБ рдЙрддреНрдкрдиреНрди рднрдПрдХреЛ рдЫ TRUNCATE TABLE.

рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛рдХреЛ рдореЗрдЯрд╛-рд╡рд┐рд╡рд░рдг рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╕рдореНрдкреВрд░реНрдг рдкреВрд░реНрд╡рд╛рдзрд╛рд░ рдирд┐рдпрдорд┐рдд рддрд╛рд▓рд┐рдХрд╛рдХреЛ рдЬрд╕реНрддреИ рд╣реЛ, рддреНрдпрд╕рдкрдЫрд┐ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВрдХреЛ рдирд┐рд░рдиреНрддрд░ рд╕рд┐рд░реНрдЬрдирд╛ рд░ рдореЗрдЯрд╛рдЗрд▓реЗ рдкреНрд░рдгрд╛рд▓реА рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВрдХреЛ рдЧрдореНрднреАрд░ "рд╕реБрдЬрди" рдирд┐рдореНрддреНрдпрд╛рдЙрдБрдЫ pg_class, pg_attribute, pg_attrdef, pg_depend,тАж

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

рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдпреЛ рдирдЧрд░реНрдиреБрд╣реЛрд╕реН! рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, рдпреЛ рдзреЗрд░реИ рдкреНрд░рднрд╛рд╡рдХрд╛рд░реА рдЫ CREATE TEMPORARY TABLE x ... ON COMMIT DELETE ROWS рдпрд╕рд▓рд╛рдИ рд▓реЗрдирджреЗрди рдЪрдХреНрд░рдмрд╛рдЯ рдмрд╛рд╣рд┐рд░ рдирд┐рдХрд╛рд▓реНрдиреБрд╣реЛрд╕реН - рддреНрдпрд╕рдкрдЫрд┐ рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛рдБ рд▓реЗрдирджреЗрдирдХреЛ рд╕реБрд░реБрдорд╛ рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ рдкрд╣рд┐рд▓реЗ рдиреИ рдЫрдиреН рдЕрд╡рд╕реНрдерд┐рдд рд╣реБрдиреЗрдЫ (рдХрд▓ рдмрдЪрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН CREATE), рддрд░ рдЦрд╛рд▓реА рд╣реБрдиреЗрдЫ, рдзрдиреНрдпрд╡рд╛рдж TRUNCATE (рд╣рд╛рдореАрд▓реЗ рдпрд╕рдХреЛ рдХрд▓ рдкрдирд┐ рд╕реБрд░рдХреНрд╖рд┐рдд рдЧрд░реНрдпреМрдВ) рдЕрдШрд┐рд▓реНрд▓реЛ рдХрд╛рд░реЛрдмрд╛рд░ рдкреВрд░рд╛ рдЧрд░реНрджрд╛ред

рез.рекред рдЬрд╕реНрддреИ... рд╕рд╣рд┐рдд...

рдореИрд▓реЗ рд╕реБрд░реБрдорд╛ рдЙрд▓реНрд▓реЗрдЦ рдЧрд░реЗрдВ рдХрд┐ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЧ рдХреЗрд╕рд╣рд░реВ рдордзреНрдпреЗ рдПрдХ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░рдХрд╛ рдЖрдпрд╛рддрд╣рд░реВ рд╣реБрдиреН - рд░ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд▓реЗ рдердХрд┐рдд рд░реВрдкрдорд╛ рд▓рдХреНрд╖реНрдп рддрд╛рд▓рд┐рдХрд╛рдХреЛ рдлрд┐рд▓реНрдбрд╣рд░реВрдХреЛ рд╕реВрдЪреАрд▓рд╛рдИ рдЖрдлреНрдиреЛ рдЕрд╕реНрдерд╛рдпреА рдШреЛрд╖рдгрд╛рдорд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЯрд╛рдБрд╕реНрджрдЫ ...

рддрд░ рдЖрд▓рд╕реНрдп рдкреНрд░рдЧрддрд┐рдХреЛ рдЗрдиреНрдЬрд┐рди рд╣реЛ! рддреНрдпрд╕реИрд▓реЗ рд╣реЛрд▓рд╛ "рдирдореВрдирд╛рдорд╛ рдЖрдзрд╛рд░рд┐рдд" рдирдпрд╛рдБ рддрд╛рд▓рд┐рдХрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдпреЛ рдзреЗрд░реИ рд╕рд░рд▓ рд╣реБрди рд╕рдХреНрдЫ:

CREATE TEMPORARY TABLE import_table(
  LIKE target_table
);

рдпрд╕ рддрд╛рд▓рд┐рдХрд╛рдорд╛ рддрдкрд╛рдИрд▓реЗ рдзреЗрд░реИ рдбрд╛рдЯрд╛ рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рд╕рдХреНрдиреБ рднрдПрдХреЛрд▓реЗ, рдпрд╕рдХреЛ рдорд╛рдзреНрдпрдордмрд╛рдЯ рдЦреЛрдЬреА рдХрд╣рд┐рд▓реНрдпреИ рдЫрд┐рдЯреЛ рд╣реБрдиреЗрдЫреИрдиред рддрд░ рддреНрдпрд╣рд╛рдБ рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐ рдкрд░рдореНрдкрд░рд╛рдЧрдд рд╕рдорд╛рдзрд╛рди рдЫ - рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВ! рд░, рд╣реЛ, рдПрдХ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдкрдирд┐ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╣реБрди рд╕рдХреНрдЫ.

рдХрд┐рдирдХрд┐, рдЕрдХреНрд╕рд░, рдЖрд╡рд╢реНрдпрдХ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВ рд▓рдХреНрд╖реНрдп рддрд╛рд▓рд┐рдХрд╛рдХреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╕рдБрдЧ рдореЗрд▓ рдЦрд╛рдиреНрдЫ, рддрдкрд╛рдИрдВ рд╕рдЬрд┐рд▓реИ рд▓реЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ LIKE target_table INCLUDING INDEXES.

рдпрджрд┐ рддрдкрд╛рдИрд▓рд╛рдИ рдкрдирд┐ рдЪрд╛рд╣рд┐рдиреНрдЫ рднрдиреЗ DEFAULT-values тАЛтАЛ(рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдЮреНрдЬреА рдорд╛рдирд╣рд░реВ рднрд░реНрди), рддрдкрд╛рдЗрдБ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ LIKE target_table INCLUDING DEFAULTSред рд╡рд╛ рд╕рд░рд▓ - LIKE target_table INCLUDING ALL - рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреНрд░рддрд┐рд▓рд┐рдкрд┐рд╣рд░реВ, рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВ, рдЕрд╡рд░реЛрдзрд╣рд░реВ,...

рддрд░ рдпрд╣рд╛рдБ рддрдкрд╛рдИрдВрд▓реЗ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрднрдпреЛ рднрдиреЗ рдмреБрдЭреНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рдХреЛ рд╕рд╛рде рддреБрд░реБрдиреНрддреИ рддрд╛рд▓рд┐рдХрд╛ рдЖрдпрд╛рдд рдЧрд░реНрдиреБрд╣реЛрд╕реН, рддреНрдпрд╕рдкрдЫрд┐ рдбрд╛рдЯрд╛ рд▓реЛрдб рд╣реБрди рд▓рд╛рдореЛ рд╕рдордп рд▓рд╛рдЧреНрдиреЗрдЫрдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдкрд╣рд┐рд▓реЗ рд╕рдмреИ рдХреБрд░рд╛ рднрд░реНрдиреБрднрдпреЛ рднрдиреЗ, рд░ рддреНрдпрд╕рдкрдЫрд┐ рдорд╛рддреНрд░ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВ рд░реЛрд▓ рдЧрд░реНрдиреБрд╣реЛрд╕реН - рдЙрджрд╛рд╣рд░рдгрдХреЛ рд░реВрдкрдорд╛ рдпреЛ рдХрд╕рд░реА рдЧрд░реНрдЫ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реНред pg_dump.

рд╕рд╛рдорд╛рдиреНрдпрдорд╛ RTFM рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореАрдХреНрд╖рд╛рдПрдБ, рдкрд░реАрдХреНрд╖рдг рд░ рд░рд╛рдп!

2. рдХрд╕рд░реА рд▓реЗрдЦреНрдиреЗ?

рдорд▓рд╛рдИ рдорд╛рддреНрд░ рднрдиреНрди рджрд┐рдиреБрд╣реЛрд╕реН - рдпрд╕рд▓рд╛рдИ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН COPY- "рдкреНрдпрд╛рдХ" рдХреЛ рд╕рдЯреНрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ INSERT, рдкрдЯрдХ рдкрдЯрдХ рдЧрддрд┐ред рддрдкрд╛рдЗрдБ рд╕рд┐рдзреИ рдкреВрд░реНрд╡-рдЙрддреНрдкрдиреНрди рдлрд╛рдЗрд▓рдмрд╛рдЯ рдкрдирд┐ рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

3. рдХрд╕рд░реА рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрдиреЗ?

рддреНрдпрд╕реЛрднрдП, рд╣рд╛рдореНрд░реЛ рдкрд░рд┐рдЪрдпрд▓рд╛рдИ рдпрд╕рд░реА рд╣реЗрд░реМрдВ:

  • рддрдкрд╛рдЗрдБрд╕рдБрдЧ рддрдкрд╛рдЗрдБрдХреЛ рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░рд┐рдПрдХреЛ рдХреНрд▓рд╛рдЗрдиреНрдЯ рдбрд╛рдЯрд╛рдХреЛ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдЫ 1M рд░реЗрдХрд░реНрдб
  • рд╣рд░реЗрдХ рджрд┐рди рдЧреНрд░рд╛рд╣рдХрд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдирдпрд╛рдБ рдкрдард╛рдЙрдБрдЫрдиреН рдкреВрд░реНрдг "рдЫрд╡рд┐"
  • рдЕрдиреБрднрд╡рдмрд╛рдЯ рддрдкрд╛рдИрд▓рд╛рдИ рд╕рдордп рд╕рдордпрдорд╛ рдерд╛рд╣рд╛ рдЫ 10K рднрдиреНрджрд╛ рдмрдвреА рд░реЗрдХрд░реНрдбрд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдБрджреИрдирдиреН

рдпрд╕реНрддреЛ рдЕрд╡рд╕реНрдерд╛рдХреЛ рдЙрддреНрдХреГрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд╣реЛ KLADR рдЖрдзрд╛рд░ тАФ рдХреБрд▓рдорд╛ рдзреЗрд░реИ рдареЗрдЧрд╛рдирд╛рд╣рд░реВ рдЫрдиреН, рддрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рдкреНрддрд╛рд╣рд┐рдХ рдЕрдкрд▓реЛрдбрдорд╛ рд░рд╛рд╖реНрдЯреНрд░рд┐рдп рд╕реНрддрд░рдорд╛ рдкрдирд┐ рдзреЗрд░реИ рдереЛрд░реИ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдЫрдиреН (рдмрд╕реНрддреАрд╣рд░реВрдХреЛ рдирд╛рдо рдкрд░рд┐рд╡рд░реНрддрди, рд╕рдбрдХ рд╕рдВрдпреЛрдЬрди, рдирдпрд╛рдБ рдШрд░рд╣рд░реВрдХреЛ рдЙрдкрд╕реНрдерд┐рддрд┐)ред

рей.резред рдкреВрд░реНрдг рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬреЗрд╕рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо

рд╕рд░рд▓рддрд╛рдХреЛ рд▓рд╛рдЧрд┐, рдорд╛рдиреМрдВ рдХрд┐ рддрдкрд╛рдИрд▓реЗ рдбреЗрдЯрд╛рд▓рд╛рдИ рдкреБрдирд░реНрд╕рдВрд░рдЪрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджреИрди - рдХреЗрд╡рд▓ рддрд╛рд▓рд┐рдХрд╛рд▓рд╛рдИ рдЗрдЪреНрдЫрд┐рдд рдлрд╛рд░рдордорд╛ рд▓реНрдпрд╛рдЙрдиреБрд╣реЛрд╕реН, рддреНрдпреЛ рд╣реЛ:

  • рд╣рдЯрд╛рдЙрдиреБрд╣реЛрд╕реН рд╕рдмреИ рдХреБрд░рд╛ рдЬреБрди рдЕрдм рдЕрд╡рд╕реНрдерд┐рдд рдЫреИрди
  • рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдкрд╣рд┐рд▓реЗ рдиреИ рдЕрд╡рд╕реНрдерд┐рдд рд░ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рд╕рдмреИ рдХреБрд░рд╛
  • рдШреБрд╕рд╛рдЙрдиреБрд╣реЛрд╕реН рд╕рдмреИ рдХреБрд░рд╛ рдЬреБрди рдЕрд╣рд┐рд▓реЗрд╕рдореНрдо рднрдПрдХреЛ рдЫреИрди

рдХрд┐рди рдпреЛ рдХреНрд░рдо рдорд╛ рд╕рдЮреНрдЪрд╛рд▓рди рдЧрд░реНрдиреБрдкрд░реНрдЫ? рдХрд┐рдирднрдиреЗ рдпрд╕рд░реА рддрд╛рд▓рд┐рдХрд╛рдХреЛ рдЖрдХрд╛рд░ рдиреНрдпреВрдирддрдо рд░реВрдкрдорд╛ рдмрдвреНрдиреЗрдЫ (MVCC рд╕рдореНрдЭрдиреБрд╣реЛрд╕реН!).

dst рдмрд╛рдЯ рдореЗрдЯрд╛рдЙрдиреБрд╣реЛрд╕реН

рд╣реЛрдЗрди, рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣ рддрдкрд╛рдИрд▓реЗ рдХреЗрд╡рд▓ рджреБрдИ рдЕрдкрд░реЗрд╢рдирдХреЛ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ:

  • рд╣рдЯрд╛рдЙрдиреБрд╣реЛрд╕реН (DELETE) рд╕рдмреИ рд╕рд╛рдорд╛рдиреНрдп рдорд╛
  • рдШреБрд╕рд╛рдЙрдиреБрд╣реЛрд╕реН рд╕рдмреИ рдирдпрд╛рдБ рдЫрд╡рд┐рдмрд╛рдЯ

рддрд░ рдПрдХреИ рд╕рдордпрдорд╛, MVCC рд▓рд╛рдИ рдзрдиреНрдпрд╡рд╛рдж, рддрд╛рд▓рд┐рдХрд╛рдХреЛ рдЖрдХрд╛рд░ рдареАрдХ рджреБрдИ рдкрдЯрдХ рдмрдвреНрдиреЗрдЫ! 1K рдЕрджреНрдпрд╛рд╡рдзрд┐рдХрдХреЛ рдХрд╛рд░рдгрд▓реЗ рдЧрд░реНрджрд╛ рддрд╛рд▓рд┐рдХрд╛рдорд╛ рд░реЗрдХрд░реНрдбрд╣рд░реВрдХреЛ +10M рдЫрд╡рд┐рд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБ рдзреЗрд░реИ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЫ...

TRUNCATE dst

рдПрдХ рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡реА рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ рдХрд┐ рд╕рдореНрдкреВрд░реНрдг рдЯреНрдпрд╛рдмреНрд▓реЗрдЯ рд╕рд╕реНрддреЛрдорд╛ рд╕рдлрд╛ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ:

  • рд╕реНрдкрд╖реНрдЯ (TRUNCATE) рд╕рдореНрдкреВрд░реНрдг рддрд╛рд▓рд┐рдХрд╛
  • рдШреБрд╕рд╛рдЙрдиреБрд╣реЛрд╕реН рд╕рдмреИ рдирдпрд╛рдБ рдЫрд╡рд┐рдмрд╛рдЯ

рд╡рд┐рдзрд┐ рдкреНрд░рднрд╛рд╡рдХрд╛рд░реА рдЫ, рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдБ рдПрдХрджрдо рд▓рд╛рдЧреВ рд╣реБрдиреНрдЫ, рддрд░ рддреНрдпрд╣рд╛рдБ рдПрдЙрдЯрд╛ рд╕рдорд╕реНрдпрд╛ рдЫ... рд╣рд╛рдореА рд▓рд╛рдореЛ рд╕рдордпрдХреЛ рд▓рд╛рдЧрд┐ 1M рд░реЗрдХрд░реНрдбрд╣рд░реВ рдердкреНрджреИрдЫреМрдВ, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореА рдпрддрд┐ рд╕рдордпрдХреЛ рд▓рд╛рдЧрд┐ рддрд╛рд▓рд┐рдХрд╛рд▓рд╛рдИ рдЦрд╛рд▓реА рдЫреЛрдбреНрди рд╕рдХреНрджреИрдиреМрдВ (рдПрдЙрдЯреИ рд▓реЗрдирджреЗрдирдорд╛ рд░реНтАНрдпрд╛рдк рдирдЧрд░рд┐рдХрди рд╣реБрдиреЗрдЫ)ред

рддреНрдпрд╕реНрдХреЛ рдорддрд▓рдм:

  • рд╣рд╛рдореА рд╕реБрд░реБ рдЧрд░реНрджреИрдЫреМрдВ рд▓рд╛рдореЛ рд╕рдордп рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рд▓реЗрдирджреЗрди
  • TRUNCATE рд▓рдЧрд╛рдЙрдБрдЫ рдкрд╣реБрдБрдЪ рд╡рд┐рд╢реЗрд╖- рдЕрд╡рд░реБрджреНрдз
  • рд╣рд╛рдореА рд▓рд╛рдореЛ рд╕рдордп рд╕рдореНрдо рд╕рдореНрдорд┐рд▓рди рдЧрд░реНрдЫреМрдВ, рд░ рдпрд╕ рд╕рдордпрдорд╛ рд╕рдмреИрдЬрдирд╛ рдкрдирд┐ рд╕рдХреНрджреИрди SELECT

рдХреЗрд╣рд┐ рд░рд╛рдореНрд░реЛ рднрдЗрд░рд╣реЗрдХреЛ рдЫреИрди ...

рддрд╛рд▓рд┐рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреБрд╣реЛрд╕реН... рдкреБрди: рдирд╛рдордХрд░рдг рдЧрд░реНрдиреБрд╣реЛрд╕реН... / рддрд╛рд▓рд┐рдХрд╛ рдЫреЛрдбреНрдиреБрд╣реЛрд╕реН...

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

  • рдЕрдЭреИ рдкрдирд┐ рдкрд╣реБрдБрдЪ рд╡рд┐рд╢реЗрд╖, рдпрджреНрдпрдкрд┐ рдзреЗрд░реИ рдХрдо рд╕рдордп
  • рдпрд╕ рддрд╛рд▓рд┐рдХрд╛рдХрд╛ рд▓рд╛рдЧрд┐ рд╕рдмреИ рдХреНрд╡реЗрд░реА рдпреЛрдЬрдирд╛/рдЕрдВрдХрд╣рд░реВ рд░рд┐рд╕реЗрдЯ рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреН, ANALYZE рдЪрд▓рд╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЫ
  • рд╕рдмреИ рд╡рд┐рджреЗрд╢реА рдХреБрдЮреНрдЬреАрд╣рд░реВ рднрд╛рдБрдЪрд┐рдПрдХрд╛ рдЫрдиреН (FK) рдЯреЗрдмрд▓рдорд╛

рддреНрдпрд╣рд╛рдБ рд╕рд╛рдЗрдорди рд░рд┐рдЧреНрд╕рдмрд╛рдЯ WIP рдкреНрдпрд╛рдЪ рдерд┐рдпреЛ рдЬрд╕рд▓реЗ рдмрдирд╛рдЙрди рд╕реБрдЭрд╛рд╡ рджрд┐рдпреЛ ALTER- рддрдереНрдпрд╛рдЩреНрдХ рд░ FK рдирдЫреЛрдЗрдХрди рдлрд╛рдЗрд▓ рд╕реНрддрд░рдорд╛ рддрд╛рд▓рд┐рдХрд╛рдХреЛ рдмрдбреА рдмрджрд▓реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдЕрдкрд░реЗрд╕рди, рддрд░ рдХреЛрд░рдо рд╕рдЩреНрдХрд▓рди рднрдПрдиред

рдореЗрдЯрд╛рдЙрдиреБрд╣реЛрд╕реН, рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рд╕рдореНрдорд┐рд▓рд┐рдд рдЧрд░реНрдиреБрд╣реЛрд╕реН

рддреНрдпрд╕реЛрднрдП, рд╣рд╛рдореА рддреАрдирд╡рдЯрд╛ рдЕрдкрд░реЗрд╢рдирд╣рд░реВрдХреЛ рдЧреИрд░-рдмреНрд▓рдХрд┐рдЩ рд╡рд┐рдХрд▓реНрдкрдорд╛ рдмрд╕реНрдЫреМрдВред рд▓рдЧрднрдЧ рддреАрди... рдпреЛ рдХрд╕рд░реА рд╕рдмреИрднрдиреНрджрд╛ рдкреНрд░рднрд╛рд╡рдХрд╛рд░реА рд░реВрдкрдорд╛ рдЧрд░реНрдиреЗ?

-- ╨▓╤Б╨╡ ╨┤╨╡╨╗╨░╨╡╨╝ ╨▓ ╤А╨░╨╝╨║╨░╤Е ╤В╤А╨░╨╜╨╖╨░╨║╤Ж╨╕╨╕, ╤З╤В╨╛╨▒╤Л ╨╜╨╕╨║╤В╨╛ ╨╜╨╡ ╨▓╨╕╨┤╨╡╨╗ "╨┐╤А╨╛╨╝╨╡╨╢╤Г╤В╨╛╤З╨╜╤Л╤Е" ╤Б╨╛╤Б╤В╨╛╤П╨╜╨╕╨╣
BEGIN;

-- ╤Б╨╛╨╖╨┤╨░╨╡╨╝ ╨▓╤А╨╡╨╝╨╡╨╜╨╜╤Г╤О ╤В╨░╨▒╨╗╨╕╤Ж╤Г ╤Б ╨╕╨╝╨┐╨╛╤А╤В╨╕╤А╤Г╨╡╨╝╤Л╨╝╨╕ ╨┤╨░╨╜╨╜╤Л╨╝╨╕
CREATE TEMPORARY TABLE tmp(
  LIKE dst INCLUDING INDEXES -- ╨┐╨╛ ╨╛╨▒╤А╨░╨╖╤Г ╨╕ ╨┐╨╛╨┤╨╛╨▒╨╕╤О, ╨▓╨╝╨╡╤Б╤В╨╡ ╤Б ╨╕╨╜╨┤╨╡╨║╤Б╨░╨╝╨╕
) ON COMMIT DROP; -- ╨╖╨░ ╤А╨░╨╝╨║╨░╨╝╨╕ ╤В╤А╨░╨╜╨╖╨░╨║╤Ж╨╕╨╕ ╨╛╨╜╨░ ╨╜╨░╨╝ ╨╜╨╡ ╨╜╤Г╨╢╨╜╨░

-- ╨▒╤Л╤Б╤В╤А╨╛-╨▒╤Л╤Б╤В╤А╨╛ ╨▓╨╗╨╕╨▓╨░╨╡╨╝ ╨╜╨╛╨▓╤Л╨╣ ╨╛╨▒╤А╨░╨╖ ╤З╨╡╤А╨╡╨╖ COPY
COPY tmp FROM STDIN;
-- ...
-- .

-- ╤Г╨┤╨░╨╗╤П╨╡╨╝ ╨╛╤В╤Б╤Г╤В╤Б╤В╨▓╤Г╤О╤Й╨╕╨╡
DELETE FROM
  dst D
USING
  dst X
LEFT JOIN
  tmp Y
    USING(pk1, pk2) -- ╨┐╨╛╨╗╤П ╨┐╨╡╤А╨▓╨╕╤З╨╜╨╛╨│╨╛ ╨║╨╗╤О╤З╨░
WHERE
  (D.pk1, D.pk2) = (X.pk1, X.pk2) AND
  Y IS NOT DISTINCT FROM NULL; -- "╨░╨╜╤В╨╕╨┤╨╢╨╛╨╣╨╜"

-- ╨╛╨▒╨╜╨╛╨▓╨╗╤П╨╡╨╝ ╨╛╤Б╤В╨░╨▓╤И╨╕╨╡╤Б╤П
UPDATE
  dst D
SET
  (f1, f2, f3) = (T.f1, T.f2, T.f3)
FROM
  tmp T
WHERE
  (D.pk1, D.pk2) = (T.pk1, T.pk2) AND
  (D.f1, D.f2, D.f3) IS DISTINCT FROM (T.f1, T.f2, T.f3); -- ╨╜╨╡╨╖╨░╤З╨╡╨╝ ╨╛╨▒╨╜╨╛╨▓╨╗╤П╤В╤М ╤Б╨╛╨▓╨┐╨░╨┤╨░╤О╤Й╨╕╨╡

-- ╨▓╤Б╤В╨░╨▓╨╗╤П╨╡╨╝ ╨╛╤В╤Б╤Г╤В╤Б╤В╨▓╤Г╤О╤Й╨╕╨╡
INSERT INTO
  dst
SELECT
  T.*
FROM
  tmp T
LEFT JOIN
  dst D
    USING(pk1, pk2)
WHERE
  D IS NOT DISTINCT FROM NULL;

COMMIT;

рей.реиред рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ рдЖрдпрд╛рдд рдЧрд░реНрдиреБрд╣реЛрд╕реН

рдЙрд╣реА KLADR рдорд╛, рд╕рдмреИ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░рд┐рдПрдХрд╛ рд░реЗрдХрд░реНрдбрд╣рд░реВ рдердк рд░реВрдкрдорд╛ рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ рдорд╛рд░реНрдлрдд рдЪрд▓рд╛рдЗрдиреБрдкрд░реНрдЫ - рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд, рдХрд┐рд╡рд░реНрдбрд╣рд░реВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдЧрд░рд┐рдПрдХреЛ, рд░ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд░рдЪрдирд╛рд╣рд░реВрдорд╛ рдШрдЯрд╛рдЗрдпреЛред рддрд░ рддрдкрд╛рдИрд▓рд╛рдИ рдХрд╕рд░реА рдерд╛рд╣рд╛ рдЫ - рд╡рд╛рд╕реНрддрд╡рдорд╛ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рднрдпреЛрд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬреЗрд╕рди рдХреЛрдбрд▓рд╛рдИ рдЬрдЯрд┐рд▓ рдирдЧрд░реА, рдЖрджрд░реНрд╢ рд░реВрдкрдорд╛ рдпрд╕рд▓рд╛рдИ рдЫреБрдиреЗ рдмрд┐рдирд╛?

рдпрджрд┐ рд╕рд┐рдЩреНрдХреНрд░реЛрдирд╛рдЗрдЬреЗрд╕рдирдХреЛ рд╕рдордпрдорд╛ рдорд╛рддреНрд░ рддрдкрд╛рдЗрдБрдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдорд╛ рд▓реЗрдЦреНрдиреЗ рдкрд╣реБрдБрдЪ рдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБ рд╣рд╛рдореНрд░реЛ рд▓рд╛рдЧрд┐ рд╕рдмреИ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдиреЗ рдЯреНрд░рд┐рдЧрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ:

-- ╤Ж╨╡╨╗╨╡╨▓╤Л╨╡ ╤В╨░╨▒╨╗╨╕╤Ж╤Л
CREATE TABLE kladr(...);
CREATE TABLE kladr_house(...);

-- ╤В╨░╨▒╨╗╨╕╤Ж╤Л ╤Б ╨╕╤Б╤В╨╛╤А╨╕╨╡╨╣ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╨╣
CREATE TABLE kladr$log(
  ro kladr, -- ╤В╤Г╤В ╨╗╨╡╨╢╨░╤В ╤Ж╨╡╨╗╤Л╨╡ ╨╛╨▒╤А╨░╨╖╤Л ╨╖╨░╨┐╨╕╤Б╨╡╨╣ ╤Б╤В╨░╤А╨╛╨╣/╨╜╨╛╨▓╨╛╨╣
  rn kladr
);

CREATE TABLE kladr_house$log(
  ro kladr_house,
  rn kladr_house
);

-- ╨╛╨▒╤Й╨░╤П ╤Д╤Г╨╜╨║╤Ж╨╕╤П ╨╗╨╛╨│╨╕╤А╨╛╨▓╨░╨╜╨╕╤П ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╨╣
CREATE OR REPLACE FUNCTION diff$log() RETURNS trigger AS $$
DECLARE
  dst varchar = TG_TABLE_NAME || '$log';
  stmt text = '';
BEGIN
  -- ╨┐╤А╨╛╨▓╨╡╤А╤П╨╡╨╝ ╨╜╨╡╨╛╨▒╤Е╨╛╨┤╨╕╨╝╨╛╤Б╤В╤М ╨╗╨╛╨│╨│╨╕╤А╨╛╨▓╨░╨╜╨╕╤П ╨┐╤А╨╕ ╨╛╨▒╨╜╨╛╨▓╨╗╨╡╨╜╨╕╨╕ ╨╖╨░╨┐╨╕╤Б╨╕
  IF TG_OP = 'UPDATE' THEN
    IF NEW IS NOT DISTINCT FROM OLD THEN
      RETURN NEW;
    END IF;
  END IF;
  -- ╤Б╨╛╨╖╨┤╨░╨╡╨╝ ╨╖╨░╨┐╨╕╤Б╤М ╨╗╨╛╨│╨░
  stmt = 'INSERT INTO ' || dst::text || '(ro,rn)VALUES(';
  CASE TG_OP
    WHEN 'INSERT' THEN
      EXECUTE stmt || 'NULL,$1)' USING NEW;
    WHEN 'UPDATE' THEN
      EXECUTE stmt || '$1,$2)' USING OLD, NEW;
    WHEN 'DELETE' THEN
      EXECUTE stmt || '$1,NULL)' USING OLD;
  END CASE;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

рдЕрдм рд╣рд╛рдореА рд╕рд┐рдЩреНрдХреНрд░реЛрдирд╛рдЗрдЬреЗрд╕рди рд╕реБрд░реБ рдЧрд░реНрдиреБ рдЕрдШрд┐ рдЯреНрд░рд┐рдЧрд░рд╣рд░реВ рд▓рд╛рдЧреВ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ (рд╡рд╛ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдорд╛рд░реНрдлрдд рд╕рдХреНрд╖рдо рдЧрд░реНрдиреБрд╣реЛрд╕реН ALTER TABLE ... ENABLE TRIGGER ...):

CREATE TRIGGER log
  AFTER INSERT OR UPDATE OR DELETE
  ON kladr
    FOR EACH ROW
      EXECUTE PROCEDURE diff$log();

CREATE TRIGGER log
  AFTER INSERT OR UPDATE OR DELETE
  ON kladr_house
    FOR EACH ROW
      EXECUTE PROCEDURE diff$log();

рд░ рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА рд╢рд╛рдиреНрддрдкреВрд░реНрд╡рдХ рд▓рдЧ рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВрдмрд╛рдЯ рдЖрд╡рд╢реНрдпрдХ рд╕рдмреИ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдирд┐рдХрд╛рд▓реНрдЫреМрдВ рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реНрдпрд╛рдиреНрдбрд▓рд░рд╣рд░реВ рдорд╛рд░реНрдлрдд рдЪрд▓рд╛рдЙрдБрдЫреМрдВред

рей.рейред рд▓рд┐рдЩреНрдХ рдЧрд░рд┐рдПрдХрд╛ рд╕реЗрдЯрд╣рд░реВ рдЖрдпрд╛рдд рдЧрд░реНрджреИ

рдорд╛рдерд┐ рд╣рд╛рдореАрд▓реЗ рд╕реНрд░реЛрдд рд░ рдЧрдиреНрддрд╡реНрдпрдХреЛ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рд╣рд░реВ рд╕рдорд╛рди рд╣реБрдБрджрд╛ рдХреЗрд╕рд╣рд░реВ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрдпреМрдВред рддрд░ рдХреЗ рд╣реБрдиреНрдЫ рдпрджрд┐ рдмрд╛рд╣реНрдп рдкреНрд░рдгрд╛рд▓реАрдмрд╛рдЯ рдЕрдкрд▓реЛрдбрдХреЛ рдврд╛рдБрдЪрд╛ рд╣рд╛рдореНрд░реЛ рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рднрдгреНрдбрд╛рд░рдг рд╕рдВрд░рдЪрдирд╛ рднрдиреНрджрд╛ рдлрд░рдХ рдЫ?

рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд░реВрдкрдорд╛ рдЧреНрд░рд╛рд╣рдХрд╣рд░реВрдХреЛ рднрдгреНрдбрд╛рд░рдг рд░ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдЦрд╛рддрд╛рд╣рд░реВ рд▓рд┐рдиреБрд╣реЛрд╕реН, рдХреНрд▓рд╛рд╕рд┐рдХ "рдзреЗрд░реИ-рджреЗрдЦрд┐-рдПрдХ" рд╡рд┐рдХрд▓реНрдк:

CREATE TABLE client(
  client_id
    serial
      PRIMARY KEY
, inn
    varchar
      UNIQUE
, name
    varchar
);

CREATE TABLE invoice(
  invoice_id
    serial
      PRIMARY KEY
, client_id
    integer
      REFERENCES client(client_id)
, number
    varchar
, dt
    date
, sum
    numeric(32,2)
);

рддрд░ рдмрд╛рд╣реНрдп рд╕реНрд░реЛрддрдмрд╛рдЯ рдбрд╛рдЙрдирд▓реЛрдб рд╣рд╛рдореАрд▓рд╛рдИ "рд╕рдмреИрдорд╛ рдПрдХ" рдХреЛ рд░реВрдкрдорд╛ рдЖрдЙрдБрдЫ:

CREATE TEMPORARY TABLE invoice_import(
  client_inn
    varchar
, client_name
    varchar
, invoice_number
    varchar
, invoice_dt
    date
, invoice_sum
    numeric(32,2)
);

рдЬрд╛рд╣рд┐рд░ рдЫ, рдЧреНрд░рд╛рд╣рдХ рдбреЗрдЯрд╛ рдпрд╕ рд╕рдВрд╕реНрдХрд░рдгрдорд╛ рдирдХреНрдХрд▓ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рд░ рдореБрдЦреНрдп рд░реЗрдХрд░реНрдб "рдЦрд╛рддрд╛" рд╣реЛ:

0123456789;╨Т╨░╤Б╤П;A-01;2020-03-16;1000.00
9876543210;╨Я╨╡╤В╤П;A-02;2020-03-16;666.00
0123456789;╨Т╨░╤Б╤П;B-03;2020-03-16;9999.00

рдореЛрдбреЗрд▓рдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА рдХреЗрд╡рд▓ рд╣рд╛рдореНрд░реЛ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рдЧрд░реНрдиреЗрдЫреМрдВ, рддрд░ рд╕рдореНрдЭрдиреБрд╣реЛрд╕реН - COPY рдЕрдзрд┐рдХ рдХреБрд╢рд▓!

INSERT INTO invoice_import
VALUES
  ('0123456789', '╨Т╨░╤Б╤П', 'A-01', '2020-03-16', 1000.00)
, ('9876543210', '╨Я╨╡╤В╤П', 'A-02', '2020-03-16', 666.00)
, ('0123456789', '╨Т╨░╤Б╤П', 'B-03', '2020-03-16', 9999.00);

рдкрд╣рд┐рд▓реЗ, рддреА "рдХрдЯрд╣рд░реВ" рд▓рд╛рдИ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдЧрд░реМрдВ рдЬрд╕рд▓рд╛рдИ рд╣рд╛рдореНрд░реЛ "рддрдереНрдпрд╣рд░реВ" рд▓реЗ рд╕рдиреНрджрд░реНрдн рдЧрд░реНрджрдЫред рд╣рд╛рдореНрд░реЛ рдЕрд╡рд╕реНрдерд╛рдорд╛, рдмреАрдЬрдХрд╣рд░реВрд▓реЗ рдЧреНрд░рд╛рд╣рдХрд╣рд░реВрд▓рд╛рдИ рд╕рдиреНрджрд░реНрдн рдЧрд░реНрджрдЫ:

CREATE TEMPORARY TABLE client_import AS
SELECT DISTINCT ON(client_inn)
-- ╨╝╨╛╨╢╨╜╨╛ ╨┐╤А╨╛╤Б╤В╨╛ SELECT DISTINCT, ╨╡╤Б╨╗╨╕ ╨┤╨░╨╜╨╜╤Л╨╡ ╨╖╨░╨▓╨╡╨┤╨╛╨╝╨╛ ╨╜╨╡╨┐╤А╨╛╤В╨╕╨▓╨╛╤А╨╡╤З╨╕╨▓╤Л
  client_inn inn
, client_name "name"
FROM
  invoice_import;

рдЧреНрд░рд╛рд╣рдХ рдЖрдИрдбреАрд╣рд░реВрд╕рдБрдЧ рдЦрд╛рддрд╛рд╣рд░реВ рд╕рд╣реА рд░реВрдкрдорд╛ рд╕рдореНрдмрджреНрдз рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓реЗ рдкрд╣рд┐рд▓реЗ рдпреА рдкрд╣рд┐рдЪрд╛рдирдХрд░реНрддрд╛рд╣рд░реВ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрди рд╡рд╛ рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рддрд┐рдиреАрд╣рд░реВ рдЕрдиреНрддрд░реНрдЧрдд рдХреНрд╖реЗрддреНрд░рд╣рд░реВ рдердкреМрдВ:

ALTER TABLE invoice_import ADD COLUMN client_id integer;
ALTER TABLE client_import ADD COLUMN client_id integer;

рдПрдЙрдЯрд╛ рд╕рд╛рдиреЛ рдкрд░рд┐рдорд╛рд░реНрдЬрдирдХреЛ рд╕рд╛рде рдорд╛рдерд┐ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рддрд╛рд▓рд┐рдХрд╛ рд╕рд┐рдЩреНрдХреНрд░реЛрдирд╛рдЗрдЬреЗрд╕рди рд╡рд┐рдзрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реМрдВ - рд╣рд╛рдореА рд▓рдХреНрд╖реНрдп рддрд╛рд▓рд┐рдХрд╛рдорд╛ рдХреЗрд╣рд┐ рдкрдирд┐ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рд╡рд╛ рдореЗрдЯрд╛рдЙрдиреЗ рдЫреИрдиреМрдВ, рдХрд┐рдирднрдиреЗ рд╣рд╛рдореА рдХреНрд▓рд╛рдЗрдиреНрдЯрд╣рд░реВ "рдкрд░рд┐рд╢рд┐рд╖реНрдЯ-рдорд╛рддреНрд░" рдЖрдпрд╛рдд рдЧрд░реНрдЫреМрдВ:

-- ╨┐╤А╨╛╤Б╤В╨░╨▓╨╗╤П╨╡╨╝ ╨▓ ╤В╨░╨▒╨╗╨╕╤Ж╨╡ ╨╕╨╝╨┐╨╛╤А╤В╨░ ID ╤Г╨╢╨╡ ╤Б╤Г╤Й╨╡╤Б╤В╨▓╤Г╤О╤Й╨╕╤Е ╨╖╨░╨┐╨╕╤Б╨╡╨╣
UPDATE
  client_import T
SET
  client_id = D.client_id
FROM
  client D
WHERE
  T.inn = D.inn; -- unique key

-- ╨▓╤Б╤В╨░╨▓╨╗╤П╨╡╨╝ ╨╛╤В╤Б╤Г╤В╤Б╤В╨▓╨╛╨▓╨░╨▓╤И╨╕╨╡ ╨╖╨░╨┐╨╕╤Б╨╕ ╨╕ ╨┐╤А╨╛╤Б╤В╨░╨▓╨╗╤П╨╡╨╝ ╨╕╤Е ID
WITH ins AS (
  INSERT INTO client(
    inn
  , name
  )
  SELECT
    inn
  , name
  FROM
    client_import
  WHERE
    client_id IS NULL -- ╨╡╤Б╨╗╨╕ ID ╨╜╨╡ ╨┐╤А╨╛╤Б╤В╨░╨▓╨╕╨╗╤Б╤П
  RETURNING *
)
UPDATE
  client_import T
SET
  client_id = D.client_id
FROM
  ins D
WHERE
  T.inn = D.inn; -- unique key

-- ╨┐╤А╨╛╤Б╤В╨░╨▓╨╗╤П╨╡╨╝ ID ╨║╨╗╨╕╨╡╨╜╤В╨╛╨▓ ╤Г ╨╖╨░╨┐╨╕╤Б╨╡╨╣ ╤Б╤З╨╡╤В╨╛╨▓
UPDATE
  invoice_import T
SET
  client_id = D.client_id
FROM
  client_import D
WHERE
  T.client_inn = D.inn; -- ╨┐╤А╨╕╨║╨╗╨░╨┤╨╜╨╛╨╣ ╨║╨╗╤О╤З

рд╡рд╛рд╕реНрддрд╡рдорд╛, рд╕рдмреИ рдХреБрд░рд╛ рднрд┐рддреНрд░ рдЫ invoice_import рдЕрдм рд╣рд╛рдореАрд╕рдБрдЧ рд╕рдореНрдкрд░реНрдХ рдлрд┐рд▓реНрдб рднрд░рд┐рдПрдХреЛ рдЫ client_id, рдЬрд╕рдХреЛ рд╕рд╛рде рд╣рд╛рдореА рдЗрдирднреНрд╡рд╛рдЗрд╕ рд╕рдореНрдорд┐рд▓рд┐рдд рдЧрд░реНрдиреЗрдЫреМрдВред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди