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 - рдореНрд╣рдгрдЬреЗ, рд╡реНрдпрд╡рд╣рд╛рд░ рдкреВрд░реНрдг рдЭрд╛рд▓реНрдпрд╛рд╡рд░, рдЯреЗрдмрд▓ рдЖрдкреЛрдЖрдк рд╣рдЯрд╡рд▓реЗ рдЬрд╛рдИрд▓.

рди-рдкреНрд░рддрд┐рдХреГрддреА

рдХрд╛рд░рдг рддреЗ рдлрдХреНрдд рдПрдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдиреЗрдХреНрд╢рдирд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗрдд, рддрд╛рддреНрдкреБрд░рддреНрдпрд╛ рдЯреЗрдмрд▓реНрд╕рдЪреА рдкреНрд░рддрд┐рдХреГрддреА рдмрдирд╡рд▓реА рдЬрд╛рдд рдирд╛рд╣реА. рдкрд░рдВрддреБ рдпрд╛рдореБрд│реЗ рдбреЗрдЯрд╛рдЪреНрдпрд╛ рджреБрд╣реЗрд░реА рд░реЗрдХреЙрд░реНрдбрд┐рдВрдЧрдЪреА рдЧрд░рдЬ рдирд╛рд╣реАрд╢реА рд╣реЛрддреЗ heap + 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.

рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ рдЖрд░рдЯреАрдПрдлрдПрдо!

2. рдХрд╕реЗ рд▓рд┐рд╣рд╛рдпрдЪреЗ?

рдорд▓рд╛ рдлрдХреНрдд рдореНрд╣рдгреВ рджреНрдпрд╛ - рд╡рд╛рдкрд░рд╛ COPY- "рдкреЕрдХ" рдРрд╡рдЬреА рдкреНрд░рд╡рд╛рд╣ INSERT, рдХрд╛рд╣реА рд╡реЗрд│рд╛ рдкреНрд░рд╡реЗрдЧ. рдЖрдкрдг рдереЗрдЯ рдкреВрд░реНрд╡-рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдлрд╛рдИрд▓рдордзреВрди рджреЗрдЦреАрд▓ рдХрд░реВ рд╢рдХрддрд╛.

3. рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╢реА рдХрд░рд╛рд╡реА?

рдЪрд▓рд╛ рддрд░ рдордЧ, рдЖрдкрд▓рд╛ рдкрд░рд┐рдЪрдп рдЕрд╕рд╛ рдХрд╛рд╣реАрд╕рд╛ рдкрд╛рд╣реВ рдпрд╛:

  • рддреБрдордЪреНрдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рдХреНрд▓рд╛рдпрдВрдЯрдЪреНрдпрд╛ рдбреЗрдЯрд╛рд╕рд╣ рдПрдХ рдЯреЗрдмрд▓ рдЖрд╣реЗ 1M рд░реЗрдХреЙрд░реНрдб
  • рджрд░рд░реЛрдЬ рдПрдХ рдХреНрд▓рд╛рдпрдВрдЯ рддреБрдореНрд╣рд╛рд▓рд╛ рдирд╡реАрди рдкрд╛рдард╡рддреЛ рдкреВрд░реНрдг "рдкреНрд░рддрд┐рдорд╛"
  • рдЕрдиреБрднрд╡рд╛рд╡рд░реВрди рддреБрдореНрд╣рд╛рд▓рд╛ рддреЗ рд╡реЗрд│реЛрд╡реЗрд│реА рдХрд│рддреЗ 10K рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рд░реЗрдХреЙрд░реНрдб рдмрджрд▓рд▓реЗ рдЬрд╛рдд рдирд╛рд╣реАрдд

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

рей.рез. рдкреВрд░реНрдг рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЭреЗрд╢рди рдЕрд▓реНрдЧреЛрд░рд┐рджрдо

рд╕рд╛рдзреЗрдкрдгрд╛рд╕рд╛рдареА, рдЖрдкрдг рдЕрд╕реЗ рдореНрд╣рдгреВ рдХреА рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдбреЗрдЯрд╛рдЪреА рдкреБрдирд░реНрд░рдЪрдирд╛ рдХрд░рдгреНрдпрд╛рдЪреА рджреЗрдЦреАрд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА - рдлрдХреНрдд рдЯреЗрдмрд▓рд▓рд╛ рдЗрдЪреНрдЫрд┐рдд рдлреЙрд░реНрдордордзреНрдпреЗ рдЖрдгрд╛, рдореНрд╣рдгрдЬреЗ:

  • рдХрд╛рдврд╛ рд╕рд░реНрд╡рдХрд╛рд╣реА рдЬреЗ рдпрд╛рдкреБрдвреЗ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдирд╛рд╣реА
  • рдЕрджреНрдпрддрдирд┐рдд рдХрд░рд╛ рдЬреЗ рдЖрдзреАрдкрд╛рд╕реВрди рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЖрд╣реЗ рдЖрдгрд┐ рдЕрдкрдбреЗрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ
  • рдШрд╛рд▓рд╛ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдЬреЗ рдЕрджреНрдпрд╛рдк рдЭрд╛рд▓реЗ рдирд╛рд╣реА

рдпрд╛ рдХреНрд░рдорд╛рдиреЗ рдСрдкрд░реЗрд╢рдиреНрд╕ рдХрд╛ рдХреЗрд▓реНрдпрд╛ рдкрд╛рд╣рд┐рдЬреЗрдд? рдХрд╛рд░рдг рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдЯреЗрдмрд▓рдЪрд╛ рдЖрдХрд╛рд░ рдХрдореАрдд рдХрдореА рд╡рд╛рдвреЗрд▓ (MVCC рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛!).

dst рдордзреВрди рд╣рдЯрд╡рд╛

рдирд╛рд╣реА, рдЕрд░реНрдерд╛рддрдЪ рддреБрдореНрд╣реА рдлрдХреНрдд рджреЛрди рдСрдкрд░реЗрд╢рдиреНрд╕ рдХрд░реВрди рдорд┐рд│рд╡реВ рд╢рдХрддрд╛:

  • рдХрд╛рдврд╛ (DELETE) рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ рд╕рд░реНрд╡рдХрд╛рд╣реА
  • рдШрд╛рд▓рд╛ рд╕рд░реНрд╡ рдирд╡реАрди рдкреНрд░рддрд┐рдореЗрддреВрди

рдкрдг рддреНрдпрд╛рдЪ рд╡реЗрд│реА, MVCC рдЪреЗ рдЖрднрд╛рд░, рдЯреЗрдмрд▓рдЪрд╛ рдЖрдХрд╛рд░ рдирдХреНрдХреА рджреБрдкреНрдкрдЯ рд╡рд╛рдвреЗрд▓! 1K рдЕрджреНрдпрддрдирд╛рдореБрд│реЗ рд╕рд╛рд░рдгреАрдордзреНрдпреЗ рд░реЗрдХреЙрд░реНрдбрдЪреНрдпрд╛ +10M рдкреНрд░рддрд┐рдорд╛ рдорд┐рд│рд╡рдгреЗ рдЦреВрдк рд░рд┐рдбрдВрдбрдВрд╕реА рдЖрд╣реЗ...

TRUNCATE dst

рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡реА рд╡рд┐рдХрд╕рдХрд╛рд▓рд╛ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ рдХреА рд╕рдВрдкреВрд░реНрдг рдЯреЕрдмреНрд▓реЗрдЯ рд╕реНрд╡рд╕реНрддрд╛рдд рд╕рд╛рдл рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ:

  • рд╕реНрдкрд╖реНрдЯ (TRUNCATE) рд╕рдВрдкреВрд░реНрдг рдЯреЗрдмрд▓
  • рдШрд╛рд▓рд╛ рд╕рд░реНрд╡ рдирд╡реАрди рдкреНрд░рддрд┐рдореЗрддреВрди

рдкрджреНрдзрдд рдкреНрд░рднрд╛рд╡реА рдЖрд╣реЗ, рдХрдзреА рдХрдзреА рдЬреЛрд░рджрд╛рд░ рд▓рд╛рдЧреВ, рдкрдг рдПрдХ рд╕рдорд╕реНрдпрд╛ рдЖрд╣реЗ... рдЖрдореНрд╣реА 1M рд░реЗрдХреЙрд░реНрдб рдмрд░реНрдпрд╛рдЪ рдХрд╛рд│рд╛рд╕рд╛рдареА рдЬреЛрдбрдд рдЖрд╣реЛрдд, рддреНрдпрд╛рдореБрд│реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдЯреЗрдмрд▓ рд░рд┐рдХрд╛рдореЗ рдареЗрд╡рддрд╛ рдпреЗрдгрд╛рд░ рдирд╛рд╣реА (рдЬрд╕реЗ рддреЗ рдПрдХрд╛рдЪ рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдд рдЧреБрдВрдбрд╛рд│рд▓реНрдпрд╛рд╢рд┐рд╡рд╛рдп рд╣реЛрдИрд▓).

рдЬреНрдпрд╛рдЪрд╛ рдЕрд░реНрде рд╣реЛрддреЛ:

  • рдЖрдореНрд╣реА рд╕реБрд░реВ рдХрд░рдд рдЖрд╣реЛрдд рджреАрд░реНрдШрдХрд╛рд│ рдЪрд╛рд▓рдгрд╛рд░рд╛ рд╡реНрдпрд╡рд╣рд╛рд░
  • TRUNCATE рд▓рд╛рджрддреЛ рдЕрдирдиреНрдп рдкреНрд░рд╡реЗрд╢- рдЕрд╡рд░реЛрдзрд┐рдд рдХрд░рдгреЗ
  • рдЖрдореНрд╣реА рдмрд░реНрдпрд╛рдЪ рдХрд╛рд│рд╛рд╕рд╛рдареА рдЖрдгрд┐ рдЗрддрд░ рдкреНрд░рддреНрдпреЗрдХрдЬрдг рдпрд╛ рд╡реЗрд│реА рдЕрдВрддрд░реНрднреВрдд рдХрд░рддреЛ рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА SELECT

рдХрд╛рд╣реА рдареАрдХ рд╣реЛрдд рдирд╛рд╣реАрдпреЗ...

рд╕рд╛рд░рдгреА рдмрджрд▓рд╛... рдкреБрдирд░реНрдирд╛рдорд┐рдд рдХрд░рд╛... / рдЯреЗрдмрд▓ рдбреНрд░реЙрдк рдХрд░рд╛...

рдПрдХ рдкрд░реНрдпрд╛рдп рдореНрд╣рдгрдЬреЗ рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд╖реНрдЯ рд╡реЗрдЧрд│реНрдпрд╛ рдирд╡реАрди рдЯреЗрдмрд▓рдордзреНрдпреЗ рднрд░рдгреЗ, рдЖрдгрд┐ рдирдВрддрд░ рдЬреБрдиреНрдпрд╛рдЪреНрдпрд╛ рдЬрд╛рдЧреА рддреНрдпрд╛рдЪреЗ рдирд╛рд╡ рдмрджрд▓рдгреЗ. рдХрд╛рд╣реА рдУрдВрдЧрд│ рд▓рд╣рд╛рди рдЧреЛрд╖реНрдЯреА:

  • рдЕрдЬреВрдирд╣реА рдЦреВрдк рдЕрдирдиреНрдп рдкреНрд░рд╡реЗрд╢, рдЬрд░реА рд▓рдХреНрд╖рдгреАрдп рдХрдореА рд╡реЗрд│
  • рдпрд╛ рд╕рд╛рд░рдгреАрд╕рд╛рдареА рд╕рд░реНрд╡ рдХреНрд╡реЗрд░реА рдпреЛрдЬрдирд╛/рдЖрдХрдбреЗрд╡рд╛рд░реА рд░реАрд╕реЗрдЯ рдХреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд, ANALYZE рдЪрд╛рд▓рд╡рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ
  • рд╕рд░реНрд╡ рдкрд░рджреЗрд╢реА рдХрд│рд╛ рддреБрдЯрд▓реЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд (рдПрдлрдХреЗ) рдЯреЗрдмрд▓рд╡рд░

рд╕рд╛рдпрдорди рд░рд┐рдЧреНрд╕рдЪрд╛ рдПрдХ 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛