DBA: เบชเบฒเบกเบฒเบ”เบˆเบฑเบ”เบฅเบฐเบšเบฝเบš synchronization เปเบฅเบฐเบเบฒเบ™เบ™เปเบฒเป€เบ‚เบปเป‰เบฒ

เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบชเบฐเบฅเบฑเบšเบชเบฑเบšเบŠเป‰เบญเบ™เบ‚เบญเบ‡เบŠเบธเบ”เบ‚เปเป‰เบกเบนเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆ (เปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™ เบ‚เบฐเบšเบงเบ™เบเบฒเบ™ ETL: เบเบฒเบ™เบ™เปเบฒเป€เบ‚เบปเป‰เบฒ, เบเบฒเบ™เปเบ›เบ‡เปเบฅเบฐ synchronization เบเบฑเบšเปเบซเบผเปˆเบ‡เบžเบฒเบเบ™เบญเบ) เบกเบฑเบเบˆเบฐเบกเบตเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™ "เบˆเบทเปˆ" เบŠเบปเปˆเบงเบ„เบฒเบงเปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบขเปˆเบฒเบ‡เป„เบงเบงเบฒ เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡ voluminous.

เบงเบฝเบเบ‡เบฒเบ™เบ—เบปเปˆเบงเป„เบ›เบ‚เบญเบ‡เบ›เบฐเป€เบžเบ”เบ™เบตเป‰เบกเบฑเบเบˆเบฐเบกเบตเบชเบฝเบ‡เบ„เป‰เบฒเบเบ„เบทเบ™เบตเป‰: "เบขเบนเปˆโ€‹เบ—เบตเปˆโ€‹เบ™เบตเป‰ เบžเบฐเปเบ™เบเบšเบฑเบ™เบŠเบต unloaded เบˆเบฒเบเบ—เบฐเบ™เบฒเบ„เบฒเบ™เบฅเบนเบเบ„เป‰เบฒ เบเบฒเบ™เบˆเปˆเบฒเบเป€เบ‡เบดเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบ„เบฑเป‰เบ‡เบชเบธเบ”เบ—เป‰เบฒเบ, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบญเบฑเบšเป‚เบซเบฅเบ”เบžเบงเบเบกเบฑเบ™เบขเปˆเบฒเบ‡เป„เบงเบงเบฒเป„เบ›เบซเบฒเป€เบงเบฑเบšเป„เบŠเบ—เปŒเปเบฅเบฐเป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เบžเบงเบเบกเบฑเบ™เบเบฑเบšเบšเบฑเบ™เบŠเบตเบ‚เบญเบ‡เบ—เปˆเบฒเบ™."

เปเบ•เปˆเป€เบกเบทเปˆเบญเบ›เบฐเบฅเบดเบกเบฒเบ™เบ‚เบญเบ‡ "เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡" เบ™เบตเป‰เป€เบฅเบตเปˆเบกเบงเบฑเบ”เปเบ—เบเป€เบ›เบฑเบ™เบซเบผเบฒเบเบฎเป‰เบญเบ megabytes, เปเบฅเบฐเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ•เป‰เบญเบ‡เบชเบทเบšเบ•เปเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ 24x7, เบœเบปเบ™เบ‚เป‰เบฒเบ‡เบ„เบฝเบ‡เบซเบผเบฒเบเบขเปˆเบฒเบ‡เป€เบเบตเบ”เบ‚เบทเป‰เบ™เบ—เบตเปˆเบˆเบฐเบ—เปเบฒเบฅเบฒเบเบŠเบตเบงเบดเบ”เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ.
DBA: เบชเบฒเบกเบฒเบ”เบˆเบฑเบ”เบฅเบฐเบšเบฝเบš synchronization เปเบฅเบฐเบเบฒเบ™เบ™เปเบฒเป€เบ‚เบปเป‰เบฒ
เป€เบžเบทเปˆเบญเบˆเบฑเบ”เบเบฒเบ™เบเบฑเบšเบžเบงเบเบกเบฑเบ™เปƒเบ™ PostgreSQL (เปเบฅเบฐเบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบขเบนเปˆเปƒเบ™เบ™เบฑเป‰เบ™), เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบธเบ‡เปเบ•เปˆเบ‡เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป„เบ”เป‰เป„เบงเบ‚เบถเป‰เบ™เปเบฅเบฐเบกเบตเบเบฒเบ™เบšเปเบฅเบดเป‚เบžเบเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบซเบ™เป‰เบญเบ.

1. เป„เบ›เบชเบปเปˆเบ‡เบขเบนเปˆเปƒเบช?

เบ—เปเบฒเบญเบดเบ”, เปƒเบซเป‰เป€เบฎเบปเบฒเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบญเบฑเบšเป‚เบซเบฅเบ”เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™ "เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™."

1.1. เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบŠเบปเปˆเบงเบ„เบฒเบง (TEMPORARY TABLE)

เปƒเบ™เบซเบผเบฑเบเบเบฒเบ™, เบชเปเบฒเบฅเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบŠเบปเปˆเบงเบ„เบฒเบง PostgreSQL เปเบกเปˆเบ™เบ„เบทเบเบฑเบ™เบเบฑเบšเบญเบทเปˆเบ™เป†. เป€เบžเบฒเบฐเบชเบฐเบ™เบฑเป‰เบ™, เป‚เบŠเบเบŠเบฐเบ•เบฒเป€เบŠเบฑเปˆเบ™ "เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบกเบตเบขเบนเปˆเปƒเบ™เบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™, เปเบฅเบฐเบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบชเบดเป‰เบ™เบชเบธเบ”เป„เบ”เป‰". เปเบ•เปˆเบเบฑเบ‡เบกเบตเบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡.

"namespace" เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™

เบ–เป‰เบฒเบชเบญเบ‡เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบžเบฐเบเบฒเบเบฒเบกเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™ CREATE TABLE x, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบœเบนเป‰เปƒเบ”เบœเบนเป‰เบซเบ™เบถเปˆเบ‡เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเปเบ™เปˆเบ™เบญเบ™ เบ„เบงเบฒเบกโ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹เบšเปเปˆโ€‹เป€เบ›เบฑเบ™โ€‹เป€เบญโ€‹เบเบฐโ€‹เบฅเบฑเบโ€‹ เบงเบฑเบ”เบ–เบธเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™.

เปเบ•เปˆเบ–เป‰เบฒเบ—เบฑเบ‡เบชเบญเบ‡เบžเบฐเบเบฒเบเบฒเบกเบ›เบฐเบ•เบดเบšเบฑเบ” CREATE TEMPORARY TABLE x, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เบฑเบ‡เบชเบญเบ‡เบˆเบฐเป€เบฎเบฑเบ”เบกเบฑเบ™เป€เบ›เบฑเบ™เบ›เบปเบเบเบฐเบ•เบด, เปเบฅเบฐเบ—เบธเบเบ„เบปเบ™เบˆเบฐเป„เบ”เป‰เบฎเบฑเบš เบชเบณเป€เบ™เบปเบฒเบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ เป‚เบ•เบฐ. เปเบฅเบฐโ€‹เบˆเบฐโ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบซเบเบฑเบ‡โ€‹เบขเบนเปˆโ€‹เปƒเบ™โ€‹เบ—เบปเปˆเบงโ€‹เป„เบ›โ€‹เบฅเบฐโ€‹เบซเบงเปˆเบฒเบ‡โ€‹เป€เบ‚เบปเบฒโ€‹เป€เบˆเบปเป‰เบฒโ€‹.

"เบ—เปเบฒเบฅเบฒเบเบ•เบปเบ™เป€เบญเบ‡" เป€เบกเบทเปˆเบญเบ•เบฑเบ”เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ

เป€เบกเบทเปˆเบญเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ–เบทเบเบ›เบดเบ”, เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบŠเบปเปˆเบงเบ„เบฒเบงเบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฐเบ–เบทเบเบฅเบถเบšเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡ DROP TABLE x เบšเปเปˆเบกเบตเบˆเบธเบ”เปƒเบ”เบเบปเบเป€เบงเบฑเป‰เบ™ ...

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบœเปˆเบฒเบ™ pgbouncer เปƒเบ™เบฎเบนเบšเปเบšเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบเบฑเบ‡เบชเบทเบšเบ•เปเปˆเป€เบŠเบทเปˆเบญเบงเปˆเบฒเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ™เบตเป‰เบเบฑเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆ, เปเบฅเบฐเปƒเบ™เบ™เบฑเป‰เบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบŠเบปเปˆเบงเบ„เบฒเบงเบ™เบตเป‰เบเบฑเบ‡เบกเบตเบขเบนเปˆ.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบฐเบเบฒเบเบฒเบกเบชเป‰เบฒเบ‡เบกเบฑเบ™เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡, เบˆเบฒเบเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบเบฑเบš pgbouncer, เบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบเบตเบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”. เปเบ•เปˆเบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบซเบฅเบตเบเบฅเป‰เบฝเบ‡เป„เบ”เป‰เป‚เบ”เบเบเบฒเบ™เปƒเบŠเป‰ CREATE TEMPORARY TABLE IF NOT EXISTS x.

เปเบ—เป‰เบˆเบดเบ‡เปเบฅเป‰เบง, เบกเบฑเบ™เบเปเปˆเบ”เบตเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเบšเปเปˆเป€เบฎเบฑเบ”เปเบ™เบงเบ™เบตเป‰, เป€เบžเบฒเบฐเบงเปˆเบฒเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ” "เบ—เบฑเบ™เบ—เบตเบ—เบฑเบ™เปƒเบ”" เบŠเบญเบเบซเบฒเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเบˆเบฒเบ "เป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบเปˆเบญเบ™". เปเบ—เบ™เบ—เบตเปˆเบˆเบฐ, เบกเบฑเบ™เบ”เบตเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเบญเปˆเบฒเบ™เบ„เบนเปˆเบกเบทเปเบฅเบฐเป€เบซเบฑเบ™เบงเปˆเบฒเป€เบกเบทเปˆเบญเบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเป€เบžเบตเปˆเบก ON COMMIT DROP - เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เป€เบกเบทเปˆเบญเบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบชเปเบฒเป€เบฅเบฑเบ”, เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบˆเบฐเบ–เบทเบเบฅเบถเบšเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”.

เบšเปเปˆเบกเบตเบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเป€เบ›เบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบชเบฐเป€เบžเบฒเบฐ, เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบŠเบปเปˆเบงเบ„เบฒเบงเบšเปเปˆเป„เบ”เป‰เบ–เบทเบ replicated. เปเบ•เปˆ เบ™เบตเป‰เบเปเบฒเบˆเบฑเบ”เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบšเบฑเบ™เบ—เบถเบเบ‚เปเป‰เบกเบนเบ™เบชเบญเบ‡เป€เบ—เบปเปˆเบฒ เปƒเบ™ heap + WAL, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ INSERT/UPDATE/DELETE เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบกเบฑเบ™เป„เบงเบเบงเปˆเบฒ.

เปเบ•เปˆเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบŠเบปเปˆเบงเบ„เบฒเบงเบเบฑเบ‡เป€เบ›เบฑเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ "เป€เบเบทเบญเบšเบ—เปเบฒเบกเบฐเบ”เบฒ", เบกเบฑเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบขเบนเปˆเปƒเบ™เปเบšเบšเบˆเปเบฒเบฅเบญเบ‡เป„เบ”เป‰. เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบชเปเบฒเบฅเบฑเบšเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒ patch เบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™เป„เบ”เป‰เปเบœเปˆเบฅเบฒเบกเป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™.

1.2. เบšเปเปˆเป„เบ”เป‰เบšเบฑเบ™เบ—เบถเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡

เปเบ•เปˆเบชเบดเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบ„เบงเบ™เป€เบฎเบฑเบ”, เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบตเบ‚เบฐเบšเบงเบ™เบเบฒเบ™ ETL เบ—เบตเปˆเบซเบเบธเป‰เบ‡เบเบฒเบเบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบšเปเปˆเบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰เบžเบฒเบเปƒเบ™เบซเบ™เบถเปˆเบ‡เบ—เบธเบฅเบฐเบเปเบฒ, เปเบ•เปˆเบงเปˆเบฒเบ—เปˆเบฒเบ™เบเบฑเบ‡เบกเบต pgbouncer เปƒเบ™เบฎเบนเบšเปเบšเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒ? ..

เบซเบผเบทเบเบฒเบ™เป„เบซเบผเป€เบ‚เบปเป‰เบฒเบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบกเบตเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ เบšเปเปˆเบกเบตเปเบšเบ™เบงเบดเบ”เบžเบฝเบ‡เบžเปเปƒเบ™เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ”เบฝเบง เบˆเบฒเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ (เบญเปˆเบฒเบ™, เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบซเบ™เบถเปˆเบ‡เบ•เปเปˆ CPU)?..

เบซเบผเบทเบšเบฒเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เปเบกเปˆเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ•เปเปˆเป„เบ› asynchronously เปƒเบ™โ€‹เบเบฒเบ™โ€‹เป€เบŠเบทเปˆเบญเบกโ€‹เบ•เปเปˆโ€‹เบ—เบตเปˆโ€‹เปเบ•เบโ€‹เบ•เปˆเบฒเบ‡โ€‹เบเบฑเบ™โ€‹?..

เบกเบตโ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เบ—เบฒเบ‡โ€‹เป€เบฅเบทเบญเบโ€‹เบ—เบตเปˆโ€‹เบ™เบตเป‰ - เบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™เบŠเบปเปˆเบงเบ„เบฒเบง. Pun, เปเบฅเป‰เบง. เบ™เบฑเป‰เบ™โ€‹เปเบกเปˆเบ™:

  • เบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ "เบ‚เบญเบ‡เบ‚เป‰เบญเบเป€เบญเบ‡" เบ—เบตเปˆเบกเบตเบŠเบทเปˆเปเบšเบšเบชเบธเปˆเบกเบชเบนเบ‡เบชเบธเบ”เป€เบžเบทเปˆเบญเบšเปเปˆเปƒเบซเป‰เบ•เบฑเบ”เบเบฑเบšเปƒเบœ
  • เบชเบฒเบ™เบชเบฐเบเบฑเบ”เบˆเบฒเบ: เบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบˆเบฒเบเปเบซเบผเปˆเบ‡เบžเบฒเบเบ™เบญเบ
  • เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡: เบ›เปˆเบฝเบ™เปƒเบˆเป€เบซเบฅเบทเป‰เบญเบกเปƒเบช, เบ•เบทเปˆเบกเปƒเบชเปˆเปƒเบ™เบŠเปˆเบญเบ‡เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™
  • Load: poured เบ‚เปเป‰เบกเบนเบ™เบžเป‰เบญเบกเบ—เบตเปˆเบˆเบฐเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบ
  • เบฅเบถเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡ "เบ‚เบญเบ‡เบ‚เป‰เบญเบ" เปเบฅเป‰เบง

เปเบฅเบฐเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™ - เปเบกเบ‡เบงเบฑเบ™เปƒเบ™เบขเบฒเบ‚เบตเป‰เป€เบœเบดเป‰เบ‡เป„เบ”เป‰. เปƒเบ™โ€‹เบ„เบงเบฒเบกโ€‹เป€เบ›เบฑเบ™โ€‹เบˆเบดเบ‡, เบเบฒเบ™เบ‚เบฝเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™ PostgreSQL เป€เบเบตเบ”เบ‚เบถเป‰เบ™เบชเบญเบ‡เบ„เบฑเป‰เบ‡ - เบ—เปเบฒเบญเบดเบ”เปƒเบ™ WAL, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ / เบ”เบฑเบ”เบŠเบฐเบ™เบต. เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เปเบกเปˆเบ™เป€เบฎเบฑเบ”เป€เบžเบทเปˆเบญเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ ACID เปเบฅเบฐเบเบฒเบ™เป€เบšเบดเปˆเบ‡เป€เบซเบฑเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบฅเบฐเบซเบงเปˆเบฒเบ‡ COMMIT'nutty เปเบฅเบฐ ROLLBACK'เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒ null.

เปเบ•เปˆโ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบšเปเปˆโ€‹เบˆเปเบฒโ€‹เป€เบ›เบฑเบ™โ€‹เบ•เป‰เบญเบ‡โ€‹เบ™เบตเป‰โ€‹! เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ” เบกเบฑเบ™เบ›เบฐเบชเบปเบšเบœเบปเบ™ เบชเบณ เป€เบฅเบฑเบ”เบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™เบซเบผเบทเบšเปเปˆ.. เบกเบฑเบ™เบšเปเปˆเบชเปเบฒเบ„เบฑเบ™เบงเปˆเบฒเบˆเบฐเบกเบตเบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ‡เบซเบผเบฒเบเบ›เบฒเบ™เปƒเบ” - เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบชเบปเบ™เปƒเบˆ "เบชเบทเบšเบ•เปเปˆเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบˆเบฒเบเบเบฒเบ‡", เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบกเบฑเบ™เบšเปเปˆเบŠเบฑเบ”เป€เบˆเบ™เบงเปˆเบฒเบกเบฑเบ™เบขเบนเปˆเปƒเบช.

เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ PostgreSQL, เบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™เปƒเบ™เบฎเบธเปˆเบ™ 9.1, เป„เบ”เป‰เบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเป€เบŠเบฑเปˆเบ™: เบšเปเปˆเป„เบ”เป‰เบšเบฑเบ™เบ—เบถเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡:

เบ”เป‰เบงเบเบ•เบปเบงเบŠเบตเป‰เบšเบญเบเบ™เบตเป‰, เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ–เบทเบเบชเป‰เบฒเบ‡เป€เบ›เบฑเบ™ unlogged. เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ—เบตเปˆโ€‹เบ‚เบฝเบ™โ€‹เปƒเบชเปˆโ€‹เบ•เบฒโ€‹เบ•เบฐโ€‹เบฅเบฒเบ‡โ€‹เบ—เบตเปˆโ€‹เบšเปเปˆโ€‹เบ–เบทเบโ€‹เบšเบฑเบ™โ€‹เบ—เบถเบโ€‹เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เบœเปˆเบฒเบ™โ€‹เบšเบฑเบ™โ€‹เบ—เบถเบโ€‹เบเบฒเบ™โ€‹เบ‚เบฝเบ™โ€‹เบฅเปˆเบงเบ‡โ€‹เบซเบ™เป‰เบฒ (เป€เบšเบดเปˆเบ‡โ€‹เบšเบปเบ”โ€‹เบ—เบต 29โ€‹)โ€‹, เป€เบฎเบฑเบ”โ€‹เปƒเบซเป‰โ€‹เบ•เบฒโ€‹เบ•เบฐโ€‹เบฅเบฒเบ‡โ€‹เบ”เบฑเปˆเบ‡โ€‹เบเปˆเบฒเบงโ€‹เป€เบ›เบฑเบ™โ€‹. เป€เบฎเบฑเบ”เบงเบฝเบเป„เบงเบเบงเปˆเบฒเบ›เบปเบเบเบฐเบ•เบด. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบžเบงเบเป€เบ‚เบปเบฒเบšเปเปˆเบกเบตเบžเบนเบกเบ•เป‰เบฒเบ™เบ—เบฒเบ™เบเบฑเบšเบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบผเบง; เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เป€เบŠเบตเบšเป€เบงเบตเบฅเบปเป‰เบกเป€เบซเบฅเบงเบซเบผเบทเบ›เบดเบ”เบชเบธเบเป€เบชเบตเบ™, เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบš เบ•เบฑเบ”เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ unlogged เบšเปเปˆเป„เบ”เป‰เบชเบณเป€เบ™เบปเบฒ เป€เบžเบทเปˆเบญเบฎเบฑเบšเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ. เบ”เบฑเบ”เบชเบฐเบ™เบตเปƒเบ”เบ™เบถเปˆเบ‡เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเบˆเบฐเบ–เบทเบเบเบปเบเป€เบฅเบตเบเป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”.

เปƒเบ™เบชเบฑเป‰เบ™ เบกเบฑเบ™เบˆเบฐเป„เบงเบ‚เบถเป‰เบ™เบซเบผเบฒเบ, เปเบ•เปˆเบ–เป‰เบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ "เบ•เบปเบ", เบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบšเปเปˆเบžเปเปƒเบˆ. เปเบ•เปˆเบกเบฑเบ™เป€เบเบตเบ”เบ‚เบถเป‰เบ™เป€เบฅเบทเป‰เบญเบเป†เป€เบ—เบปเปˆเบฒเปƒเบ”, เปเบฅเบฐเบ‚เบฐเบšเบงเบ™เบเบฒเบ™ ETL เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบฎเบนเป‰เบงเบดเบ—เบตเบ—เบตเปˆเบˆเบฐเปเบเป‰เป„เบ‚เบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡ "เบˆเบฒเบเบเบฒเบ‡" เบซเบผเบฑเบ‡เบˆเบฒเบ "เบŸเบทเป‰เบ™เบŸเบน" เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบšเป?

เบ–เป‰เบฒเบšเปเปˆ, เปเบฅเบฐเบเปเบฅเบฐเบ™เบตเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เปเบกเปˆเบ™เบ„เป‰เบฒเบเบ„เบทเบเบฑเบšเบ‚เบญเบ‡เบ—เปˆเบฒเบ™, เปƒเบซเป‰เปƒเบŠเป‰ UNLOGGEDเปเบ•เปˆเบšเปเปˆเป€เบ„เบตเบ เบขเปˆเบฒเป€เบ›เบตเบ”เปƒเบŠเป‰เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ™เบตเป‰เบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡, เบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบ—เบตเปˆเบฎเบฑเบเปเบžเบ‡เบเบฑเบšเบ—เปˆเบฒเบ™.

1.3. ON COMMIT { Delete ROWS | เบซเบผเบธเบ”}

เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบ™เบตเป‰เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบžเบถเบ”เบ•เบดเบเปเบฒเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบชเปเบฒเป€เบฅเบฑเบ”เปƒเบ™เป€เบงเบฅเบฒเบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡.

เบเปˆเบฝเบงเบเบฑเบš ON COMMIT DROP เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ‚เบฝเบ™เปเบฅเป‰เบงเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เบกเบฑเบ™เบชเป‰เบฒเบ‡ DROP TABLE, เปเบ•เปˆเบกเบต ON COMMIT DELETE ROWS เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เปเบกเปˆเบ™เบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบซเบผเบฒเบ - เบกเบฑเบ™เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰ TRUNCATE TABLE.

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบ meta เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบŠเบปเปˆเบงเบ„เบฒเบงเปเบกเปˆเบ™เบ„เบทเบเบฑเบ™เบเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ›เบปเบเบเบฐเบ•เบด, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™. เบเบฒเบ™เบชเป‰เบฒเบ‡เปเบฅเบฐเบเบฒเบ™เบฅเบถเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบŠเบปเปˆเบงเบ„เบฒเบงเบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰ "เบญเบฒเบเบฒเบ™เบšเบงเบก" เบฎเป‰เบฒเบเปเบฎเบ‡เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบฅเบฐเบšเบปเบš pg_class, pg_attribute, pg_attrdef, pg_depend,โ€ฆ

เบ•เบญเบ™เบ™เบตเป‰เบˆเบดเบ™เบ•เบฐเบ™เบฒเบเบฒเบ™เบงเปˆเบฒเบ—เปˆเบฒเบ™เบกเบตเบžเบฐเบ™เบฑเบเบ‡เบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป‚เบ”เบเบเบปเบ‡เบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เป€เบŠเบดเปˆเบ‡เป€เบ›เบตเบ”เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเปƒเบซเบกเปˆเปƒเบ™เบ—เบธเบเป†เบงเบดเบ™เบฒเบ—เบต, เบชเป‰เบฒเบ‡, เบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™, เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปเบฅเบฐเบฅเบถเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบŠเบปเปˆเบงเบ„เบฒเบง ... เบˆเบฐเบกเบตเบ‚เบตเป‰เป€เบซเบเบทเป‰เบญเบซเบผเบฒเบเป€เบเบตเบ™เบ—เบตเปˆเบชเบฐเบชเบปเบกเบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบฅเบฐเบšเบปเบš, เปเบฅเบฐ. เบ™เบตเป‰เบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบเบตเบ”เบเบฒเบ™เบซเป‰เบฒเบกเบฅเปเป‰เบžเบดเป€เบชเบ”เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™.

เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เบขเปˆเบฒเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰! เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบ™เบตเป‰, เบกเบฑเบ™เบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบซเบผเบฒเบ CREATE TEMPORARY TABLE x ... ON COMMIT DELETE ROWS เป€เบญเบปเบฒเบกเบฑเบ™เบญเบญเบเบˆเบฒเบเบงเบปเบ‡เบˆเบญเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒ - เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เปƒเบ™เบ•เบญเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐเบ—เบธเบฅเบฐเบเปเบฒเปƒเบซเบกเปˆ, เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบกเปˆเบ™เปเบฅเป‰เบง เบˆเบฐเบกเบตเบขเบนเปˆ (เบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เป‚เบ— CREATE), เปเบ•เปˆ เบˆเบฐเบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ, เบ‚เปเบ‚เบญเบšเปƒเบˆเบเบฑเบš TRUNCATE (เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เป‚เบ—เบ‚เบญเบ‡เบกเบฑเบ™) เป€เบกเบทเปˆเบญเป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ.

1.4. เบกเบฑเบ...เบฅเบงเบกเบ—เบฑเบ‡...

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบเปˆเบฒเบงเป€เบ–เบดเบ‡เปƒเบ™เบ•เบญเบ™เบ•เบปเป‰เบ™เบงเปˆเบฒเบซเบ™เบถเปˆเบ‡เปƒเบ™เบเปเบฅเบฐเบ™เบตเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ›เบปเบเบเบฐเบ•เบดเบชเปเบฒเบฅเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบŠเบปเปˆเบงเบ„เบฒเบงเปเบกเปˆเบ™เบเบฒเบ™เบ™เปเบฒเป€เบ‚เบปเป‰เบฒเบ›เบฐเป€เบžเบ”เบ•เปˆเบฒเบ‡เป† - เปเบฅเบฐเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเป€เบกเบทเปˆเบญเบเบฅเป‰เบฒเป†เบ„เบฑเบ”เบฅเบญเบเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเป€เบ‚เบปเป‰เบฒเปƒเบ™เบเบฒเบ™เบ›เบฐเบเบฒเบ”เบŠเบปเปˆเบงเบ„เบฒเบงเบ‚เบญเบ‡เบฅเบฒเบง ...

เปเบ•เปˆเบ„เบงเบฒเบกเบ‚เบตเป‰เบ„เป‰เบฒเบ™เปเบกเปˆเบ™เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบเบ‚เบญเบ‡เบ„เบงเบฒเบกเบ„เบทเบšเบซเบ™เป‰เบฒ! เบ™เบฑเป‰เบ™เบ„เบทเป€เบซเบ”เบœเบปเบ™ เบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบซเบกเปˆ "เบญเบตเบ‡เปƒเบชเปˆเบ•เบปเบงเบขเปˆเบฒเบ‡" เบกเบฑเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบˆเบฐโ€‹เบ‡เปˆเบฒเบโ€‹เบ”เบฒเบโ€‹เบซเบผเบฒเบโ€‹:

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- flow เปเบ—เบ™ "เบŠเบญเบ‡โ€‹" INSERT, เบเบฒเบ™เป€เบฅเบฑเปˆเบ‡เป€เบงเบฅเบฒ. เป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เป‚เบ”เบเบเบปเบ‡เบˆเบฒเบเป„เบŸเบฅเปŒเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบเปˆเบญเบ™.

3. เบงเบดเบ—เบตเบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡?

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เปƒเบซเป‰ intro เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบšเบดเปˆเบ‡เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰:

  • เบ—เปˆเบฒเบ™เบกเบตเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบกเบตเบ‚เปเป‰เบกเบนเบ™เบฅเบนเบเบ„เป‰เบฒเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป„เบงเป‰เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™ 1M เบšเบฑเบ™เบ—เบถเบ
  • เบ—เบธเบเป†เบกเบทเป‰เบฅเบนเบเบ„เป‰เบฒเบชเบปเปˆเบ‡เบญเบฑเบ™เปƒเบซเบกเปˆเปƒเบซเป‰เบ—เปˆเบฒเบ™ "เบฎเบนเบšเบžเบฒเบš" เป€เบ•เบฑเบก
  • เบˆเบฒเบเบ›เบฐเบชเบปเบšเบเบฒเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบฎเบนเป‰เบงเปˆเบฒเป€เบ›เบฑเบ™เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบ„เบฒเบง เบšเปเปˆเป€เบเบตเบ™ 10K เบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ„เบฅเบฒเบชเบชเบดเบเบ‚เบญเบ‡เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเปเบกเปˆเบ™ เบ–เบฒเบ™ KLADR โ€” เบกเบตโ€‹เบ—เบตเปˆโ€‹เบขเบนเปˆโ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบซเบผเบฒเบโ€‹เปƒเบ™โ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹, เปเบ•เปˆโ€‹เบงเปˆเบฒโ€‹เปƒเบ™โ€‹เบเบฒเบ™โ€‹เบญเบฑเบšโ€‹เป‚เบซเบผเบ”โ€‹เปเบ•เปˆโ€‹เบฅเบฐโ€‹เบญเบฒโ€‹เบ—เบดเบ”โ€‹เบกเบตโ€‹เบเบฒเบ™โ€‹เบ›เปˆเบฝเบ™โ€‹เปเบ›เบ‡โ€‹เบšเปเปˆโ€‹เบซเบผเบฒเบโ€‹เบ›เบฒเบ™โ€‹เปƒเบ” (เบเบฒเบ™โ€‹เบ›เปˆเบฝเบ™โ€‹เบŠเบทเปˆโ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ–เบดเปˆเบ™โ€‹เบ–เบฒเบ™โ€‹, เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบชเบปเบกโ€‹เบ–เบฐโ€‹เบซเบ™เบปเบ™โ€‹เบซเบปเบ™โ€‹เบ—เบฒเบ‡โ€‹, เบฎเบนเบšโ€‹เบฅเบฑเบโ€‹เบชเบฐโ€‹เบ™เบฐโ€‹เบ‚เบญเบ‡โ€‹เป€เบฎเบทเบญเบ™โ€‹เปƒเบซเบกเปˆโ€‹) เป€เบ–เบดเบ‡โ€‹เปเบกเปˆเบ™โ€‹เบงเปˆเบฒโ€‹เปƒเบ™โ€‹เบฅเบฐโ€‹เบ”เบฑเบšโ€‹เบŠเบฒเบ”โ€‹.

3.1. เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบเบฒเบ™เบŠเบดเป‰เบ‡เบ‚เปเป‰เบกเบนเบ™เป€เบ•เบฑเบกเบฎเบนเบšเปเบšเบš

เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบ‡เปˆเบฒเบเบ”เบฒเบ, เปƒเบซเป‰เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบ—เปˆเบฒเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ›เบฑเบšเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™ - เบžเบฝเบ‡เปเบ•เปˆเป€เบญเบปเบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฎเบนเบšเปเบšเบšเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™:

  • เป€เบญเบปเบฒเบญเบญเบ เบ—เบธเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเบšเปเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง
  • เบญเบฑเบšเป€เบ”เบ” เบ—เบธเบโ€‹เบชเบดเปˆเบ‡โ€‹เบ—เบธเบโ€‹เบขเปˆเบฒเบ‡โ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบขเบนเปˆโ€‹เปเบฅเป‰เบงโ€‹เปเบฅเบฐโ€‹เบˆเปเบฒโ€‹เป€เบ›เบฑเบ™โ€‹เบ•เป‰เบญเบ‡โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ›เบฑเบšโ€‹เบ›เบธเบ‡โ€‹
  • เปƒเบชเปˆ เบ—เบธเบโ€‹เบชเบดเปˆเบ‡โ€‹เบ—เบธเบโ€‹เบขเปˆเบฒเบ‡โ€‹เบ—เบตเปˆโ€‹เบเบฑเบ‡โ€‹เบšเปเปˆโ€‹เบ—เบฑเบ™โ€‹เป„เบ”เป‰โ€‹เป€เบเบตเบ”โ€‹เบ‚เบถเป‰เบ™โ€‹

เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เบ„เบงเบ™เป€เบฎเบฑเบ”เปƒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ™เบตเป‰? เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฐเบซเบ™เบฒเบ”เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบˆเบฐเบ‚เบฐเบซเบเบฒเบเบ•เบปเบงเบซเบ™เป‰เบญเบเบ—เบตเปˆเบชเบธเบ” (เบˆเบทเปˆ MVCC!).

เบฅเบถเบšเบญเบญเบเบˆเบฒเบ dst

เบšเปเปˆ, เปเบ™เปˆเบ™เบญเบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป„เบ›เป„เบ”เป‰เป‚เบ”เบเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบชเบญเบ‡เบขเปˆเบฒเบ‡:

  • เป€เบญเบปเบฒเบญเบญเบ (DELETE) เบ—เบธเบโ€‹เบชเบดเปˆเบ‡โ€‹เบ—เบธเบโ€‹เบขเปˆเบฒเบ‡โ€‹เป‚เบ”เบโ€‹เบ—เบปเปˆเบงโ€‹เป„เบ›โ€‹
  • เปƒเบชเปˆ เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เบˆเบฒเบโ€‹เบฎเบนเบšโ€‹เบžเบฒเบšโ€‹เปƒเบซเบกเปˆโ€‹

เปเบ•เปˆเปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™, เบ‚เบญเบšเปƒเบˆ MVCC, เบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบˆเบฐเป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™เปเบ™เปˆเบ™เบญเบ™เบชเบญเบ‡เป€เบ—เบปเปˆเบฒ! เบเบฒเบ™เป„เบ”เป‰เบฎเบฑเบš +1M เบฎเบนเบšเบžเบฒเบšเบ‚เบญเบ‡เบšเบฑเบ™เบ—เบถเบเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เบญเบฑเบšเป€เบ”เบ” 10K เปเบกเปˆเบ™เบŠเป‰เปเบฒเบŠเป‰เบญเบ™เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ ...

เบ•เบฑเบ” dst

เบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒเบ—เบตเปˆเบกเบตเบ›เบฐเบชเบปเบšเบเบฒเบ™เบซเบผเบฒเบเบฎเบนเป‰เบงเปˆเบฒเปเบ—เบฑเบšเป€เบฅเบฑเบ”เบ—เบฑเบ‡เบซเบกเบปเบ”เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบ„เบงเบฒเบกเบชเบฐเบญเบฒเบ”เป„เบ”เป‰เบฅเบฒเบ„เบฒเบ–เบทเบ:

  • เบˆเบฐเปเบˆเป‰เบ‡ (TRUNCATE) เบ•เบฒโ€‹เบ•เบฐโ€‹เบฅเบฒเบ‡โ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹
  • เปƒเบชเปˆ เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เบˆเบฒเบโ€‹เบฎเบนเบšโ€‹เบžเบฒเบšโ€‹เปƒเบซเบกเปˆโ€‹

เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เปเบกเปˆเบ™โ€‹เบ›เบฐโ€‹เบชเบดเบ”โ€‹เบ—เบดโ€‹เบœเบปเบ™โ€‹, เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบเปเปˆเปƒเบŠเป‰เป„เบ”เป‰เบซเบผเบฒเบ, เปเบ•เปˆเบกเบตเบšเบฑเบ™เบซเบฒ ... เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบžเบตเปˆเบกเบšเบฑเบ™เบ—เบถเบ 1M เป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบ”เบปเบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบชเบฒเบกเบฒเบ”เบ—เบตเปˆเบˆเบฐเบ›เปˆเบญเบเปƒเบซเป‰เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒเบชเปเบฒเบฅเบฑเบšเป€เบงเบฅเบฒเบ™เบตเป‰ (เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบšเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบซเปเปˆเบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบ—เบธเบฅเบฐเบเปเบฒเบ”เบฝเบง).

เบซเบกเบฒเบโ€‹เบ„เบงเบฒเบกโ€‹เบงเปˆเบฒ:

  • เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบ—เบตเปˆเบเบฒเบงเบ™เบฒเบ™
  • TRUNCATE เบšเบฑเบ‡เบ„เบฑเบš เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบชเบฐเป€เบžเบฒเบฐ- เบชเบฐเบเบฑเบ”
  • เบžเบงเบเป€เบฎเบปเบฒเป€เบฎเบฑเบ”เบเบฒเบ™เปเบŠเบเบชเปเบฒเบฅเบฑเบšเป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™, เปเบฅเบฐเบ—เบธเบเบ„เบปเบ™เบญเบทเปˆเบ™เป†เปƒเบ™เป€เบงเบฅเบฒเบ™เบตเป‰ เบšเปเปˆเบชเบฒเบกเบฒเบ”เปเบกเป‰เปเบ•เปˆ SELECT

เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบšเปเปˆเบ”เบต ...

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡... เปเบ—เบ™เบŠเบทเปˆ... / เบงเบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡...

เบ—เบฒเบ‡เป€เบฅเบทเบญเบเปเบกเปˆเบ™เบเบฒเบ™เบ•เบทเปˆเบกเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบซเบกเปˆเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบฝเบ‡เปเบ•เปˆเบ›เปˆเบฝเบ™เบŠเบทเปˆเบกเบฑเบ™เปเบ—เบ™เบ—เบตเปˆเป€เบเบปเปˆเบฒ. เบชเบญเบ‡โ€‹เบชเบฒเบกโ€‹เบชเบดเปˆเบ‡โ€‹เป€เบฅเบฑเบโ€‹เบ™เป‰เบญเบโ€‹เบ—เบตเปˆโ€‹เบซเบ™เป‰เบฒโ€‹เบเบฝเบ”โ€‹:

  • เบเบฑเบ‡เบ„เบทเบเบฑเบ™ เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบชเบฐเป€เบžเบฒเบฐ, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบ™เป‰เบญเบเบฅเบปเบ‡เบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบ
  • เปเบœเบ™โ€‹เบเบฒเบ™โ€‹เบชเบญเบšโ€‹เบ–เบฒเบกโ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ” / เบชเบฐโ€‹เบ–เบดโ€‹เบ•เบดโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบ•เบฒโ€‹เบ•เบฐโ€‹เบฅเบฒเบ‡โ€‹เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เบ›เบฑเบšโ€‹เปƒเบซเบกเปˆโ€‹, เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ ANALYZE
  • เบเบฐเปเบˆเบ•เปˆเบฒเบ‡เบ›เบฐเป€เบ—เบ”เบ—เบฑเบ‡เปเบปเบ”เบ–เบทเบเปเบ•เบ (FK) เบเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡

เบกเบตเปเบœเปˆเบ™เปเบž WIP เบˆเบฒเบ Simon Riggs เบ—เบตเปˆเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เป€เบฎเบฑเบ” 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;

3.2. เบ™เปเบฒเป€เบ‚เบปเป‰เบฒเบซเบผเบฑเบ‡เบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡

เปƒเบ™ KLADR เบ”เบฝเบงเบเบฑเบ™, เบšเบฑเบ™เบ—เบถเบเบ—เบตเปˆเบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฐเบ•เป‰เบญเบ‡เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบซเบฅเบฑเบ‡ - เบ›เบปเบเบเบฐเบ•เบด, เป€เบ™เบฑเป‰เบ™เปƒเบชเปˆเบ„เปเบฒเบซเบฅเบฑเบ, เปเบฅเบฐเบซเบผเบธเบ”เบฅเบปเบ‡เปƒเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰. เปเบ•เปˆโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบฎเบนเป‰โ€‹เป„เบ”เป‰โ€‹เปเบ™เบงโ€‹เปƒเบ” - เบชเบดเปˆเบ‡เบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™ complicating เบฅเบฐเบซเบฑเบ” synchronization, เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบชเปเบฒเบœเบฑเบ”เบเบฑเบšเบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”?

เบ–เป‰เบฒเบžเบฝเบ‡เปเบ•เปˆเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบกเบตเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบเบฒเบ™เบ‚เบฝเบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆ synchronization, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰ trigger เบ—เบตเปˆเบˆเบฐเป€เบเบฑเบšเบเปเบฒเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบฎเบปเบฒ:

-- ั†ะตะปะตะฒั‹ะต ั‚ะฐะฑะปะธั†ั‹
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;

เบ•เบญเบ™เบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบ™เบณเปƒเบŠเป‰ triggers เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเป€เบฅเบตเปˆเบก synchronization (เบซเบผเบทเป€เบ›เบตเบ”เปƒเบŠเป‰เบžเบงเบเบกเบฑเบ™เบœเปˆเบฒเบ™ 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();

เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบ„เปˆเบญเบเป†เบชเบฐเบเบฑเบ”เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบšเบฑเบ™เบ—เบถเบเปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบœเปˆเบฒเบ™เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบก.

3.3. เบเบฒเบ™เบ™เปเบฒเป€เบ‚เบปเป‰เบฒเบŠเบธเบ”เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ

เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบเปเบฅเบฐเบ™เบตเป€เบกเบทเปˆเบญเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เปเบซเบผเปˆเบ‡เปเบฅเบฐเบ›เบฒเบเบ—เบฒเบ‡เปเบกเปˆเบ™เบ„เบทเบเบฑเบ™. เปเบ•เปˆเบˆเบฐเป€เบ›เบฑเบ™เปเบ™เบงเปƒเบ”เบ–เป‰เบฒเบเบฒเบ™เบญเบฑเบšเป‚เบซเบฅเบ”เบˆเบฒเบเบฅเบฐเบšเบปเบšเบžเบฒเบเบ™เบญเบเบกเบตเบฎเบนเบšเปเบšเบšเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบˆเบฒเบเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ?

เปƒเบซเป‰เป€เบญเบปเบฒเป€เบ›เบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เบญเบ‡เบฅเบนเบเบ„เป‰เบฒเปเบฅเบฐเบšเบฑเบ™เบŠเบตเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ, เบ—เบฒเบ‡เป€เบฅเบทเบญเบ "เบซเบผเบฒเบเบ•เปเปˆเบซเบ™เบถเปˆเบ‡" เปเบšเบšเบ„เบฅเบฒเบชเบชเบดเบ:

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;

เป€เบžเบทเปˆเบญเป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เบšเบฑเบ™เบŠเบตเบเบฑเบš ID เบฅเบนเบเบ„เป‰เบฒเบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡, เบเปˆเบญเบ™เบญเบทเปˆเบ™เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบŠเบญเบเบซเบฒ เบซเบผเบทเบชเป‰เบฒเบ‡เบ•เบปเบงเบฅเบฐเบšเบธเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰. เปƒเบซเป‰เป€เบžเบตเปˆเบกเบŠเปˆเบญเบ‡เปƒเบชเปˆเบžเบฒเบเปƒเบ•เป‰เบžเบงเบเบกเบฑเบ™:

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

เปƒเบซเป‰เปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™ synchronization เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบ”เป‰เบงเบเบเบฒเบ™เบ”เบฑเบ”เปเบเป‰เป€เบฅเบฑเบเบ™เป‰เบญเบ - เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบšเปเปˆเบ›เบฑเบšเบ›เบธเบ‡เบซเบผเบทเบฅเบถเบšเบชเบดเปˆเบ‡เปƒเบ”เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบ, เป€เบžเบฒเบฐเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบ™เปเบฒเป€เบ‚เบปเป‰เบฒเบฅเบนเบเบ„เป‰เบฒ "append-only":

-- ะฟั€ะพัั‚ะฐะฒะปัะตะผ ะฒ ั‚ะฐะฑะปะธั†ะต ะธะผะฟะพั€ั‚ะฐ 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

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™