{"id":74953,"date":"2020-03-22T08:42:22","date_gmt":"2020-03-22T05:42:22","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/dba-gramotno-organizovyvaem-sinhronizaczii-i-importy"},"modified":"2020-03-22T08:42:22","modified_gmt":"2020-03-22T05:42:22","slug":"dba-gramotno-organizovyvaem-sinhronizaczii-i-importy","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/dba-gramotno-organizovyvaem-sinhronizaczii-i-importy","title":{"rendered":"DBA: \u00fcgyesen megszervezz\u00fck a szinkroniz\u00e1l\u00e1sokat \u00e9s import\u00e1l\u00e1sokat","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Nagy adathalmazok bonyolult feldolgoz\u00e1sa sor\u00e1n (k\u00fcl\u00f6nb\u00f6z\u0151 <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ETL\">ETL-folyamatok<\/a><\/noindex>: import\u00e1l\u00e1sok, \u00e1talak\u00edt\u00e1sok \u00e9s szinkroniz\u00e1l\u00e1sok k\u00fcls\u0151 forr\u00e1ssal) gyakran felmer\u00fcl az ig\u00e9ny <b>ideiglenesen \u201ememoriz\u00e1lni\u201d, majd gyorsan feldolgozni<\/b> valami nagym\u00e9ret\u0171t.<\/p>\n<p>Az ilyen t\u00edpus\u00fa feladatok \u00e1ltal\u00e1ban a k\u00f6vetkez\u0151k\u00e9ppen hangzanak: <i>\u201eItt van, hogy <noindex><a rel=\"nofollow\" href=\"https:\/\/sbis.ru\/accounting\">a k\u00f6nyvel\u00e9s let\u00f6lt\u00f6tte az \u00fcgyf\u00e9lbankb\u00f3l<\/a><\/noindex> a legut\u00f3bbi be\u00e9rkezett kifizet\u00e9seket, ezeket gyorsan fel kell t\u00f6lteni a weboldalra \u00e9s hozz\u00e1 kell rendelni a sz\u00e1ml\u00e1khoz\u201d<\/i><\/p>\n<p>De amikor ennek a \"valaminek\" a mennyis\u00e9ge t\u00f6bb sz\u00e1z megab\u00e1jtra n\u0151, \u00e9s a szolg\u00e1ltat\u00e1snak folyamatosan 24\/7 \u00fczemm\u00f3dban kell m\u0171k\u00f6dnie az adatb\u00e1zissal, sz\u00e1mos mell\u00e9khat\u00e1s l\u00e9p fel, amelyek megnehez\u00edtik az \u00e9let\u00e9t.<br \/>\n<img decoding=\"async\" alt=\"DBA: \u00fcgyesen megszervezz\u00fck a szinkroniz\u00e1l\u00e1sokat \u00e9s import\u00e1l\u00e1sokat\" src=\"\/wp-content\/uploads\/2020\/03\/f74afb2cd6f5f8de26a0932166933c95.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA PostgreSQL-ben (\u00e9s nem csak benne) ezek kezel\u00e9s\u00e9re haszn\u00e1lhatunk bizonyos optimaliz\u00e1l\u00e1si lehet\u0151s\u00e9geket, amelyek lehet\u0151v\u00e9 teszik a gyorsabb feldolgoz\u00e1st, kevesebb er\u0151forr\u00e1s-felhaszn\u00e1l\u00e1ssal.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>1. Hov\u00e1 t\u00f6lts\u00fck?<\/h2>\n<p>\nEl\u0151sz\u00f6r is, hat\u00e1rozzuk meg, hov\u00e1 t\u00f6lthetj\u00fck fel azokat az adatokat, amelyeket \u201efeldolgozni\u201d szeretn\u00e9nk.<\/p>\n<h3>1.1. Ideiglenes t\u00e1bl\u00e1k (TEMPORARY TABLE)<\/h3>\n<p>\nAlapvet\u0151en a PostgreSQL-ben az ideiglenes t\u00e1bl\u00e1k ugyanolyan t\u00e1bl\u00e1k, mint b\u00e1rmely m\u00e1s. Ez\u00e9rt t\u00e9vhit, hogy <i><b>\u201eminden csak a mem\u00f3ri\u00e1ban t\u00e1rol\u00f3dik, \u00e9s az elfogyhat\u201d<\/b><\/i>. De van n\u00e9h\u00e1ny l\u00e9nyeges k\u00fcl\u00f6nbs\u00e9g is.<\/p>\n<h4>Saj\u00e1t \u201en\u00e9vt\u00e9r\u201d minden adatb\u00e1zis-kapcsolathoz<\/h4>\n<p>\nHa k\u00e9t kapcsolat egyszerre pr\u00f3b\u00e1lja v\u00e9grehajtani <code>CREATE TABLE x<\/code>, akkor valamelyik\u00fck biztosan kapni fog <b>egy egyedis\u00e9gs\u00e9rt\u00e9si hib\u00e1t<\/b> az adatb\u00e1zisobjektumokkal kapcsolatban.<\/p>\n<p>De ha mindketten megpr\u00f3b\u00e1lj\u00e1k v\u00e9grehajtani <code>CREATE <b>\u00c1TMENETI<\/b> T\u00c1BLA x<\/code>, akkor mindketten norm\u00e1lisan v\u00e9grehajthatj\u00e1k, \u00e9s mindkett\u0151 megkapja <b>a saj\u00e1t p\u00e9ld\u00e1ny\u00e1t<\/b> a t\u00e1bl\u00e1b\u00f3l. \u00c9s semmi k\u00f6z\u00f6s nem lesz k\u00f6z\u00f6tt\u00fck.<\/p>\n<h4>\u00d6ngyilkoss\u00e1g disconnect eset\u00e9n<\/h4>\n<p>\nA kapcsolat lez\u00e1r\u00e1sakor minden ideiglenes t\u00e1bla automatikusan t\u00f6rl\u0151dik, \u00edgy \u201ek\u00e9zzel\u201d v\u00e9grehajtani <code>DROP TABLE x<\/code> nincs \u00e9rtelme, kiv\u00e9ve\u2026<\/p>\n<p>Ha a <b>pgbouncer-t tranzakci\u00f3s m\u00f3dban haszn\u00e1lja<\/b>, akkor az adatb\u00e1zis tov\u00e1bbra is \u00fagy gondolja, hogy ez a kapcsolat m\u00e9g mindig akt\u00edv, \u00e9s ebben az ideiglenes t\u00e1bl\u00e1nak tov\u00e1bbra is l\u00e9teznie kell.<\/p>\n<p>Ez\u00e9rt a t\u00e1bla m\u00e1sodik alkalommal val\u00f3 l\u00e9trehoz\u00e1s\u00e1nak megk\u00eds\u00e9rl\u00e9se egy m\u00e1sik pgbouncer kapcsolatr\u00f3l hib\u00e1t fog eredm\u00e9nyezni. De ezt meg lehet ker\u00fclni, ha ig\u00e9nybe vessz\u00fck <code>IDEIGLENES T\u00c1BL\u00c1ZAT L\u00c9TREHOZ\u00c1SA <b>HA NEM L\u00c9TEZIK<\/b> x<\/code>.<\/p>\n<p>Azt viszont jobb elker\u00fclni, mert \u00edgy \u201ev\u00e1ratlanul\u201d felfedezhetj\u00fck, hogy ott maradtak a \u201ekor\u00e1bbi tulajdonos\u201d adatai. Ehelyett sokkal jobb lenne elolvasni a k\u00e9zik\u00f6nyvet, \u00e9s megn\u00e9zni, hogy a t\u00e1bla l\u00e9trehoz\u00e1sakor van lehet\u0151s\u00e9g a kieg\u00e9sz\u00edt\u00e9s\u00e9re <code>K\u00d6TELEZETTS\u00c9G ALAPJ\u00c1N <b>DROP<\/b><\/code> \u2014 azaz a tranzakci\u00f3 befejez\u00e9sekor a t\u00e1bl\u00e1zat automatikusan t\u00f6rl\u00e9sre ker\u00fcl.<\/p>\n<h4>Nem-replik\u00e1ci\u00f3<\/h4>\n<p>\nCsak egy bizonyos kapcsolathoz val\u00f3 tartoz\u00e1s miatt a ideiglenes t\u00e1bl\u00e1k nem replik\u00e1l\u00f3dnak. Viszont <b>ez megszabad\u00edt a kett\u0151s adatr\u00f6gz\u00edt\u00e9s sz\u00fcks\u00e9gess\u00e9g\u00e9t\u0151l<\/b> heap + WAL, ez\u00e9rt az INSERT\/UPDATE\/DELETE jelent\u0151sen gyorsabb benne.<\/p>\n<p>De mivel az ideiglenes t\u00e1bl\u00e1zat, ha \u00fagy tetszik, \"majdnem egyszer\u0171\" t\u00e1bl\u00e1zat, \u00edgy a replik\u00e1n sem hozhat\u00f3 l\u00e9tre. Legal\u00e1bbis most, b\u00e1r a megfelel\u0151 patch m\u00e1r r\u00e9g\u00f3ta kering.<\/p>\n<h3>1.2. Nemsorolt t\u00e1bl\u00e1k (UNLOGGED TABLE)<\/h3>\n<p>\nDe mi a helyzet, ha van egy terjedelmes ETL-folyamata, amit nem lehet megval\u00f3s\u00edtani egy tranz\u00e1ci\u00f3n bel\u00fcl, \u00e9s van <b>pgbouncer-t tranzakci\u00f3s m\u00f3dban haszn\u00e1lja<\/b>?..<\/p>\n<p>Vagy az adatfolyam olyan nagy, hogy <b>egy kapcsolat s\u00e1vsz\u00e9less\u00e9ge nem elegend\u0151<\/b> az adatb\u00e1zissal (\u00e9rtsd: egy CPU-n l\u00e9v\u0151 folyamat)?..<\/p>\n<p>Vagy egyes m\u0171veletek <b>aszinkron m\u00f3don<\/b> k\u00fcl\u00f6nb\u00f6z\u0151 kapcsolatokban zajlanak?..<\/p>\n<p>Itt csak egy lehet\u0151s\u00e9g van \u2014 <b>ideiglenes nem-ideiglenes t\u00e1bl\u00e1t l\u00e9trehozni<\/b>. Sz\u00f3vicc, igen. Azaz:<\/p>\n<ul>\n<li>l\u00e9trehoztam \u201esaj\u00e1t\u201d t\u00e1bl\u00e1imat a lehet\u0151 legesetlegesebb nevekkel, hogy senkivel ne tal\u00e1lkozzak<\/li>\n<li><b>Extract<\/b>: adatokat t\u00f6lt\u00f6ttem fel bels\u0151 forr\u00e1sokb\u00f3l<\/li>\n<li><b>Transform<\/b>: \u00e1talak\u00edtottam, kit\u00f6lt\u00f6ttem a kulcsmeghat\u00e1roz\u00f3 mez\u0151ket<\/li>\n<li><b>Bet\u00f6lt\u00e9s<\/b>: az el\u0151k\u00e9sz\u00edtett adatokat \u00e1tm\u00e1soltam a c\u00e9l t\u00e1bl\u00e1zatokba<\/li>\n<li>t\u00f6r\u00f6ltem a \u201esaj\u00e1t\u201d t\u00e1bl\u00e1imat<\/li>\n<\/ul>\n<p>\n\u00c9s most \u2014 egy kan\u00e1l k\u00e1tr\u00e1ny. Val\u00f3j\u00e1ban <b>az \u00f6sszes r\u00f6gz\u00edt\u00e9s a PostgreSQL-ben k\u00e9tszer t\u00f6rt\u00e9nik<\/b> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/461523\/\">el\u0151sz\u00f6r a WAL-ba<\/a><\/noindex>, majd a t\u00e1bl\u00e1zatok\/testekbe. Mindez az ACID t\u00e1mogat\u00e1sa \u00e9s az adatok helyes l\u00e1that\u00f3s\u00e1ga \u00e9rdek\u00e9ben k\u00e9sz\u00fclt <code>COMMIT<\/code>rezerv\u00e1lt \u00e9s <code>ROLLBACK<\/code>rezerv\u00e1lt tranzakci\u00f3k.<\/p>\n<p>De nek\u00fcnk erre nincs sz\u00fcks\u00e9g\u00fcnk! A folyamatunk <b>vagy teljes eg\u00e9sz\u00e9ben sikeresen v\u00e9get \u00e9rt, vagy nem<\/b>. Nem sz\u00e1m\u00edt, h\u00e1ny k\u00f6zbens\u0151 tranzakci\u00f3 lesz benne \u2014 minket nem \u00e9rdekel a \u201efolytat\u00e1s a folyamat k\u00f6zep\u00e9t\u0151l\u201d, k\u00fcl\u00f6n\u00f6sen, ha nem vil\u00e1gos, hol tartott.<\/p>\n<p>Erre a PostgreSQL fejleszt\u0151i m\u00e1r a 9.1-es verzi\u00f3ban bevezettek egy dolgot, mint <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/sql-createtable#SQL-CREATETABLE-UNLOGGED\">a nem napl\u00f3zott (UNLOGGED) t\u00e1bl\u00e1k<\/a><\/noindex>:<\/p>\n<blockquote><p>Ezzel a megjel\u00f6l\u00e9ssel a t\u00e1bl\u00e1zat nem napl\u00f3zottk\u00e9nt j\u00f6n l\u00e9tre. A nem napl\u00f3zott t\u00e1bl\u00e1kba \u00edrt adatok nem mennek \u00e1t a napl\u00f3zott \u00edr\u00e1s (l\u00e1sd 29. fejezet) r\u00e9v\u00e9n, ami miatt ezek a t\u00e1bl\u00e1k <b>j\u00f3val gyorsabban m\u0171k\u00f6dnek, mint a norm\u00e1l<\/b>. Azonban nem v\u00e9dettek a hib\u00e1kkal szemben; \u00e1ramkimarad\u00e1s vagy v\u00e9szhelyzeti le\u00e1ll\u00e1s eset\u00e9n a nem napl\u00f3zott t\u00e1bl\u00e1zat <b>automatikusan elt\u0171nik.<\/b>. Ezen k\u00edv\u00fcl a nem napl\u00f3zott t\u00e1bl\u00e1zat tartalma <b>nem replik\u00e1l\u00f3dik.<\/b> a vez\u00e9re serverekre. B\u00e1rmilyen index, amely a nem napl\u00f3zott t\u00e1bl\u00e1hoz l\u00e9trej\u00f6n, automatikusan nem napl\u00f3zott\u00e1 v\u00e1lik.<\/p><\/blockquote>\n<p>R\u00f6viden, <b>nagyon sokkal gyorsabb lesz<\/b>, de ha az adatb\u00e1zis szerver \"\u00f6sszeomlik\" - kellemetlen lesz. De gyakran el\u0151fordul ez, \u00e9s k\u00e9pes-e az ETL folyamatod helyesen kezelni a dolgokat \"a k\u00f6zep\u00e9b\u0151l\" az adatb\u00e1zis \"\u00fajj\u00e1\u00e9leszt\u00e9se\" ut\u00e1n?..<\/p>\n<p>Ha m\u00e9gsem, \u00e9s a fenti eset hasonl\u00edt a ti\u00e9dre - haszn\u00e1lj <code>UNLOGGED<\/code>, de soha <b>ne haszn\u00e1ld ezt a tulajdons\u00e1got val\u00f3di t\u00e1bl\u00e1kra<\/b>, melyek adatai fontosak sz\u00e1modra.<\/p>\n<h3>1.3. ON COMMIT { DELETE ROWS | DROP }<\/h3>\n<p>\nEz a konstrukci\u00f3 lehet\u0151v\u00e9 teszi, hogy a t\u00e1bla l\u00e9trehoz\u00e1sakor automatikus viselked\u00e9st adjunk meg a tranzakci\u00f3 befejez\u00e9sekor.<\/p>\n<p>A <code>K\u00d6TELEZETTS\u00c9G ALAPJ\u00c1N <b>DROP<\/b><\/code> m\u00e1r \u00edrtam fent, ezt gener\u00e1lja <code>DROP TABLE<\/code>, de itt a <code>K\u00d6TELEZETTS\u00c9G ALAPJ\u00c1N <b>SOROZAT T\u00d6RL\u00c9SE<\/b><\/code> helyzet \u00e9rdekesebb - itt gener\u00e1l\u00f3dik <code>TRUNCATE TABLE<\/code>.<\/p>\n<p>Mivel a meta-adatt\u00e1rol\u00f3 ideiglenes t\u00e1bl\u00e1ja pontosan ugyanolyan infrastrukt\u00far\u00e1val rendelkezik, mint a norm\u00e1l t\u00e1bl\u00e1k, ez\u00e9rt <b>az ideiglenes t\u00e1bl\u00e1k folyamatos l\u00e9trehoz\u00e1sa \u00e9s t\u00f6rl\u00e9se a rendszer t\u00e1bl\u00e1k \"megb\u0151v\u00fcl\u00e9s\u00e9t\" eredm\u00e9nyezi<\/b> pg_class, pg_attribute, pg_attrdef, pg_depend,\u2026<\/p>\n<p>Most k\u00e9pzeld el, hogy van egy munk\u00e1s, aki k\u00f6zvetlen kapcsolatban van az adatb\u00e1zissal, \u00e9s m\u00e1sodpercenk\u00e9nt \u00faj tranzakci\u00f3t nyit, l\u00e9trehoz, felt\u00f6lt, feldolgoz \u00e9s t\u00f6r\u00f6l egy ideiglenes t\u00e1bl\u00e1t... A szem\u00e9t a rendszer t\u00e1bl\u00e1kban b\u0151s\u00e9gesen felhalmoz\u00f3dik, ez pedig felesleges lass\u00edt\u00e1shoz vezet minden m\u0171velet sor\u00e1n.<\/p>\n<p>\u00d6sszess\u00e9g\u00e9ben, ne csin\u00e1ld ezt! Ebben az esetben sokkal hat\u00e9konyabb <code>CREATE TEMPORARY TABLE x ... ON COMMIT DELETE ROWS<\/code> kivinni a tranzakci\u00f3s cikluson k\u00edv\u00fcl - akkor az \u00faj tranzakci\u00f3 kezdete el\u0151tt a t\u00e1bl\u00e1k m\u00e1r <b>l\u00e9tezni fognak<\/b> (megtakar\u00edtjuk a h\u00edv\u00e1st <code>CREATE<\/code>), de <b>\u00fcres lesz<\/b>, h\u00e1la <code>TRUNCATE<\/code> (ennek a h\u00edv\u00e1sa is megtakar\u00edtottuk) a kor\u00e1bbi tranzakci\u00f3 befejez\u00e9sekor.<\/p>\n<h3>1.4. HASONL\u00d3\u2026 BELESZ\u00c1M\u00cdTVA \u2026<\/h3>\n<p>\nAz elej\u00e9n eml\u00edtettem, hogy az ideiglenes t\u00e1bl\u00e1k tipikus felhaszn\u00e1l\u00e1si esete - k\u00fcl\u00f6nb\u00f6z\u0151 importok - \u00e9s a fejleszt\u0151 f\u00e1radtan m\u00e1solja a c\u00e9l t\u00e1bla mez\u0151list\u00e1j\u00e1t az ideiglenes t\u00e1bla deklar\u00e1ci\u00f3j\u00e1ba...<\/p>\n<p>De a lustas\u00e1g a fejl\u0151d\u00e9s mozgat\u00f3rug\u00f3ja! Ez\u00e9rt <b>egy \u00faj t\u00e1bl\u00e1t \"mint minta\"<\/b> sokkal egyszer\u0171bben l\u00e9trehozhatsz:<\/p>\n<pre><code class=\"sql\">CREATE TEMPORARY TABLE import_table(\n  LIKE target_table\n);<\/code><\/pre>\n<p>\nMivel ebbe a t\u00e1bl\u00e1ba k\u00e9s\u0151bb nagyon sok adatot be lehet gener\u00e1lni, a keres\u00e9s benne nem lesz \u00e9ppen gyors. De erre van egy hagyom\u00e1nyos megold\u00e1s - indexek! Igen, <b>az ideiglenes t\u00e1bl\u00e1nak is lehetnek indexei<\/b>.<\/p>\n<p>Mivel gyakran a sz\u00fcks\u00e9ges indexek megegyeznek a c\u00e9l t\u00e1bla indexeivel, egyszer\u0171en meg\u00edrhatod <code>HASONL\u00d3 target_table <b>TARTALMAZZA AZ INDEXEKET<\/b><\/code>.<\/p>\n<p>Ha tov\u00e1bbi <code>DEFAULT<\/code>-\u00e9rt\u00e9kek (p\u00e9ld\u00e1ul a primer kulcs \u00e9rt\u00e9keinek kit\u00f6lt\u00e9s\u00e9hez) haszn\u00e1lhat\u00f3k <code>HASONL\u00d3 target_table <b>TARTALMAZZA AZ ALAP\u00c9RT\u00c9KEKET<\/b><\/code>. Vagy csak \u2014 <code>HASONL\u00d3 target_table <b>MINDEN BELE\u00c9RTVE<\/b><\/code> \u2014 m\u00e1solja az alap\u00e9rtelmezett \u00e9rt\u00e9keket, indexeket, k\u00e9nyszereket,\u2026<\/p>\n<p>De itt m\u00e1r meg kell \u00e9rteni, hogy ha l\u00e9trehozt\u00e1l <b>import t\u00e1bl\u00e1t az indexekkel, akkor az adatok bet\u00f6lt\u00e9se hosszabb ideig tart<\/b>, mint ha el\u0151sz\u00f6r minden adatot bet\u00f6ltesz, \u00e9s csak k\u00e9s\u0151bb alkalmazod az indexeket \u2014 n\u00e9zd meg p\u00e9ldak\u00e9nt, hogyan csin\u00e1lja <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/app-pgdump\">pg_dump<\/a><\/noindex>.<\/p>\n<p>\u00d6sszess\u00e9g\u00e9ben, <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/sql-createtable\">OLVASD EL A HASZN\u00c1LATI \u00daTMUTAT\u00d3T<\/a><\/noindex>!<\/p>\n<h2>2. Hogyan \u00edrjunk?<\/h2>\n<p>\nEgyszer\u0171en mondom \u2014 haszn\u00e1lj <code><noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/sql-copy\">COPY<\/a><\/noindex><\/code>-folyamot a \"csomag\" helyett <code>INSERT<\/code>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.citusdata.com\/blog\/2017\/11\/08\/faster-bulk-loading-in-postgresql-with-copy\/\">a sebess\u00e9g jelent\u0151s n\u00f6vel\u00e9s\u00e9re<\/a><\/noindex>. Ak\u00e1r k\u00f6zvetlen\u00fcl a el\u0151re elk\u00e9sz\u00edtett f\u00e1jlb\u00f3l is.<\/p>\n<h2>3. Hogyan dolgozzunk fel?<\/h2>\n<p>\nTegy\u00fck fel, hogy a bevezet\u0151nk k\u00f6r\u00fclbel\u00fcl \u00edgy n\u00e9z ki:<\/p>\n<ul>\n<li>a rendszeredben van egy t\u00e1bla az \u00fcgyf\u00e9ladatokkal <b>1M rekorddal<\/b><\/li>\n<li>minden nap az \u00fcgyf\u00e9l \u00faj <b>teljes \"k\u00e9p\u00e9t\"<\/b><\/li>\n<li>tapasztalataid alapj\u00e1n tudod, hogy az esetek t\u00f6bbs\u00e9g\u00e9ben <b>maxim\u00e1lisan 10K rekord v\u00e1ltozik<\/b><\/li>\n<\/ul>\n<p>\nA klasszikus p\u00e9lda egy ilyen helyzetre a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gnivc.ru\/technical_support\/classifiers_reference\/kladr\/\">KLDAR adatb\u00e1zis<\/a><\/noindex> \u2014 rengeteg c\u00edm tal\u00e1lhat\u00f3, de minden heti kiad\u00e1sban a v\u00e1ltoz\u00e1sok k\u00f6z\u00f6tt (telep\u00fcl\u00e9snevek \u00e1tnevez\u00e9se, utc\u00e1k egyes\u00edt\u00e9se, \u00faj h\u00e1zak megjelen\u00e9se) nagyon kev\u00e9s van az eg\u00e9sz orsz\u00e1g m\u00e9ret\u00e9hez k\u00e9pest.<\/p>\n<h3>3.1. Teljes szinkroniz\u00e1l\u00e1si algoritmus<\/h3>\n<p>\nEgyszer\u0171s\u00e9g kedv\u00e9\u00e9rt tegy\u00fck fel, hogy m\u00e9g az adatok \u00e1talak\u00edt\u00e1s\u00e1ra sincs sz\u00fcks\u00e9g \u2014 egyszer\u0171en csak a t\u00e1bl\u00e1zatot kell a k\u00edv\u00e1nt form\u00e1ra hozni, \u00edgy:<\/p>\n<ul>\n<li><b>t\u00f6r\u00f6lni<\/b> minden, ami m\u00e1r nincs<\/li>\n<li><b>a rendszert a p9 \u00e1gon a \"Sisyphus\" tartom\u00e1nyb\u00f3l. Az \u00faj v\u00e1llalati felhaszn\u00e1l\u00f3k sz\u00e1m\u00e1ra lehet\u0151s\u00e9g van tesztverzi\u00f3k beszerz\u00e9s\u00e9re, m\u00edg a mag\u00e1nszem\u00e9lyek sz\u00e1m\u00e1ra a \"Basalt SPO\" weboldal\u00e1r\u00f3l vagy az \u00faj let\u00f6lt\u0151 oldalr\u00f3l a \"getalt.ru\" webhelyr\u0151l hagyom\u00e1nyosan ingyenesen let\u00f6lthet\u0151 a sz\u00fcks\u00e9ges \"Alt\" oper\u00e1ci\u00f3s rendszer verzi\u00f3.<\/b> minden, ami m\u00e1r megvolt, \u00e9s friss\u00edteni kell<\/li>\n<li><b>besz\u00farni<\/b> minden, ami m\u00e9g nem volt<\/li>\n<\/ul>\n<p>\nMi\u00e9rt \u00e9ppen ilyen sorrendben kell a m\u0171veleteket v\u00e9gezni? Mert \u00edgy n\u00f6vekszik a t\u00e1bl\u00e1zat m\u00e9rete minim\u00e1lisan (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/491366\/\">ne feledd a MVCC-t!<\/a><\/noindex>).<\/p>\n<h4>T\u00d6R\u00d6LD FROM dst<\/h4>\n<p>\nNem, term\u00e9szetesen \u00e1t lehet ugrani k\u00e9t m\u0171veletet:<\/p>\n<ul>\n<li><b>t\u00f6r\u00f6lni<\/b> (<code>DELETE<\/code>) t\u00e9nyleg minden<\/li>\n<li><b>besz\u00farni<\/b> minden a \u00faj k\u00e9pben<\/li>\n<\/ul>\n<p>\nDe ezzel egy\u00fctt, a MVCC-nek k\u00f6sz\u00f6nhet\u0151en, <b>a t\u00e1bl\u00e1zat m\u00e9rete pontosan dupl\u00e1j\u00e1ra n\u0151<\/b>! Kapni +1M rekordot a t\u00e1bl\u00e1zatban a 10K friss\u00edt\u00e9se miatt nem \u00e9ppen optim\u00e1lis redundancia...<\/p>\n<h4>TRUNCATE dst<\/h4>\n<p>\nA tapasztalt fejleszt\u0151k tudj\u00e1k, hogy az eg\u00e9sz t\u00e1bl\u00e1zat el\u00e9g olcs\u00f3n tiszt\u00edthat\u00f3:<\/p>\n<ul>\n<li><b>clear<\/b> (<code>TRUNCATE<\/code>) Az eg\u00e9sz t\u00e1bl\u00e1t<\/li>\n<li><b>besz\u00farni<\/b> minden a \u00faj k\u00e9pben<\/li>\n<\/ul>\n<p>\nHat\u00e9kony m\u00f3dszer, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/481866\/\">n\u00e9ha teljes m\u00e9rt\u00e9kben alkalmazhat\u00f3<\/a><\/noindex>, de van egy probl\u00e9ma\u2026 1M rekord bevitele sok id\u0151t vesz ig\u00e9nybe, ez\u00e9rt nem engedhetj\u00fck meg magunknak, hogy a t\u00e1bl\u00e1zat \u00fcres maradjon az \u00f6sszes ebben az id\u0151ben (ahogy t\u00f6rt\u00e9nne, ha nem csomagoln\u00e1nk egy tranzakci\u00f3ba).<\/p>\n<p>Ez\u00e9rt:<\/p>\n<ul>\n<li>kezd\u0151dik <b>egy hossz\u00fa tranzakci\u00f3<\/b><\/li>\n<li><code>TRUNCATE<\/code> r\u00e1vonatkozik <b>Kiz\u00e1r\u00f3 hozz\u00e1f\u00e9r\u00e9s<\/b>-z\u00e1rol\u00e1s<\/li>\n<li>hossz\u00fa ideig t\u00e1rolunk, mik\u00f6zben minden m\u00e1s <b>m\u00e9g azt sem tudja <code>SELECT<\/code><\/b><\/li>\n<\/ul>\n<p>\nValami nem \u00e1ll j\u00f3l\u2026<\/p>\n<h4>ALTER TABLE\u2026 \u00c1TNEVEZ\u00c9S\u2026 \/ T\u00c1BL\u00c1ZAT T\u00d6RL\u00c9SE \u2026<\/h4>\n<p>\nEgy alternat\u00edva, hogy mindent felt\u00f6lten\u00e9nk egy \u00faj t\u00e1bl\u00e1ba, majd egyszer\u0171en \u00e1tnevezz\u00fck a r\u00e9git. N\u00e9h\u00e1ny kellemetlen apr\u00f3s\u00e1g:<\/p>\n<ul>\n<li>ez is <b>Kiz\u00e1r\u00f3 hozz\u00e1f\u00e9r\u00e9s<\/b>, b\u00e1r id\u0151ben l\u00e9nyegesen kevesebb<\/li>\n<li>minden lek\u00e9rdez\u00e9si terv\/tiltott t\u00e1bl\u00e1zati statisztika null\u00e1z\u00f3dik, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/479656\/\">futtatni kell az ANALYZE-t<\/a><\/noindex><\/li>\n<li><b>megszakadnak az \u00f6sszes k\u00fcls\u0151 kulcs<\/b> (FK) a t\u00e1bl\u00e1ra<\/li>\n<\/ul>\n<p>\nVolt egy WIP-patch Simon Riggs-t\u0151l, amely azt javasolta, hogy <code>ALTER<\/code>-m\u0171velet a t\u00e1bla f\u00e1jlszint\u0171 felcser\u00e9l\u00e9s\u00e9re, an\u00e9lk\u00fcl, hogy a statisztik\u00e1t \u00e9s a FK-t meg\u00e9rinten\u00e9, de nem gy\u0171jt\u00f6tte \u00f6ssze a sz\u00fcks\u00e9ges szavazati k\u00f6rt.<\/p>\n<h4>DELETE, UPDATE, INSERT<\/h4>\n<p>\n\u00cdgy a h\u00e1rom m\u0171velet blokkol\u00e1s n\u00e9lk\u00fcli v\u00e1ltozat\u00e1n\u00e1l maradunk. Szinte h\u00e1rmat\u2026 Hogyan tudjuk ezt a leghat\u00e9konyabban megtenni?<\/p>\n<pre><code class=\"sql\">-- mindent tranzakci\u00f3 keretein bel\u00fcl csin\u00e1lunk, hogy senki ne l\u00e1ssa a \"k\u00f6ztes\" \u00e1llapotokat\nBEGIN;\n\n-- l\u00e9trehozzuk a ideiglenes t\u00e1bl\u00e1t az import\u00e1lt adatokkal\nCREATE TEMPORARY TABLE tmp(\n  LIKE dst INCLUDING INDEXES -- a hasonl\u00f3 m\u00f3don, indexekkel egy\u00fctt\n) ON COMMIT DROP; -- a tranzakci\u00f3n k\u00edv\u00fcl nincs sz\u00fcks\u00e9g\u00fcnk r\u00e1\n\n-- gyorsan l\u00f6v\u0151 \u00faj k\u00e9pet a COPY seg\u00edts\u00e9g\u00e9vel\nCOPY tmp FROM STDIN;\n-- ...\n-- .\n\n-- t\u00f6r\u00f6lj\u00fck a hi\u00e1nyz\u00f3kat\nDELETE FROM\n  dst D\nUSING\n  dst X\nLEFT JOIN\n  tmp Y\n    USING(pk1, pk2) -- els\u0151dleges kulcs mez\u0151k\nWHERE\n  (D.pk1, D.pk2) = (X.pk1, X.pk2) AND\n  Y IS NOT DISTINCT FROM NULL; -- \"anti join\"\n\n-- friss\u00edtj\u00fck a megmaradtakat\nUPDATE\n  dst D\nSET\n  (f1, f2, f3) = (T.f1, T.f2, T.f3)\nFROM\n  tmp T\nWHERE\n  (D.pk1, D.pk2) = (T.pk1, T.pk2) AND\n  (D.f1, D.f2, D.f3) IS DISTINCT FROM (T.f1, T.f2, T.f3); -- nem sz\u00fcks\u00e9ges friss\u00edteni a megegyez\u0151ket\n\n-- besz\u00farjuk a hi\u00e1nyz\u00f3kat\nINSERT INTO\n  dst\nSELECT\n  T.*\nFROM\n  tmp T\nLEFT JOIN\n  dst D\n    USING(pk1, pk2)\nWHERE\n  D IS NOT DISTINCT FROM NULL;\n\nCOMMIT;\n<\/code><\/pre>\n<p><\/p>\n<h3>3.2. Az import ut\u00f3feldolgoz\u00e1sa<\/h3>\n<p>\nUgyanabban a KML-ben minden megv\u00e1ltozott rekordot tov\u00e1bbi post-processz\u00e1l\u00e1snak kell al\u00e1vetni \u2013 normaliz\u00e1lni, kiemelni a kulcsszavakat, megfelel\u0151 strukt\u00far\u00e1kba hozni. De hogyan lehet megtudni\u2014 <b>mi v\u00e1ltozott<\/b>, an\u00e9lk\u00fcl, hogy bonyol\u00edtan\u00e1nk a szinkroniz\u00e1l\u00e1si k\u00f3dot, l\u00e9nyeg\u00e9ben ne is \u00e9rts\u00fcnk hozz\u00e1?<\/p>\n<p>Ha a szinkroniz\u00e1l\u00e1s alatt csak az \u00d6n folyamata rendelkezik \u00edr\u00e1si jogosults\u00e1ggal, akkor egy trigger seg\u00edts\u00e9g\u00e9vel \u00f6sszegy\u0171jthetj\u00fck az \u00f6sszes v\u00e1ltoz\u00e1st:<\/p>\n<pre><code class=\"sql\">-- c\u00e9lt\u00e1bl\u00e1k\nCREATE TABLE kladr(...);\nCREATE TABLE kladr_house(...);\n\n-- t\u00f6rt\u00e9neti v\u00e1ltoz\u00e1sok t\u00e1bl\u00e1i\nCREATE TABLE kladr$log(\n  ro kladr, -- itt \u00e1llnak az \u00e1lland\u00f3 rekordok r\u00e9gi\/\u00faj m\u00e1solatai\n  rn kladr\n);\n\nCREATE TABLE kladr_house$log(\n  ro kladr_house,\n  rn kladr_house\n);\n\n-- \u00e1ltal\u00e1nos v\u00e1ltoz\u00e1snapl\u00f3z\u00f3 f\u00fcggv\u00e9ny\nCREATE OR REPLACE FUNCTION diff$log() RETURNS trigger AS $$\nDECLARE\n  dst varchar = TG_TABLE_NAME || '$log';\n  stmt text = '';\nBEGIN\n  -- ellen\u0151rizz\u00fck a napl\u00f3z\u00e1s sz\u00fcks\u00e9gess\u00e9g\u00e9t a rekord friss\u00edt\u00e9sekor\n  IF TG_OP = 'UPDATE' THEN\n    IF NEW IS NOT DISTINCT FROM OLD THEN\n      RETURN NEW;\n    END IF;\n  END IF;\n  -- l\u00e9trehozzuk a napl\u00f3bejegyz\u00e9st\n  stmt = 'INSERT INTO ' || dst::text || '(ro,rn)VALUES(';\n  CASE TG_OP\n    WHEN 'INSERT' THEN\n      EXECUTE stmt || 'NULL,$1)' USING NEW;\n    WHEN 'UPDATE' THEN\n      EXECUTE stmt || '$1,$2)' USING OLD, NEW;\n    WHEN 'DELETE' THEN\n      EXECUTE stmt || '$1,NULL)' USING OLD;\n  END CASE;\n  RETURN NEW;\nEND;\n$$ LANGUAGE plpgsql;\n<\/code><\/pre>\n<p>\nMost m\u00e1r a szinkroniz\u00e1l\u00e1s megkezd\u00e9se el\u0151tt trigger-eket alkalmazhatunk (vagy bekapcsolhatjuk azokat <code>ALTER TABLE ... ENABLE TRIGGER ...<\/code>):<\/p>\n<pre><code class=\"sql\">CREATE TRIGGER log\n  AFTER INSERT OR UPDATE OR DELETE\n  ON kladr\n    FOR EACH ROW\n      EXECUTE PROCEDURE diff$log();\n\nCREATE TRIGGER log\n  AFTER INSERT OR UPDATE OR DELETE\n  ON kladr_house\n    FOR EACH ROW\n      EXECUTE PROCEDURE diff$log();\n<\/code><\/pre>\n<p>\nAzt\u00e1n nyugodtan kivonhatunk az log t\u00e1bl\u00e1kb\u00f3l minden sz\u00fcks\u00e9ges v\u00e1ltoz\u00e1st, \u00e9s \u00e1tvezethetj\u00fck azokat a tov\u00e1bbi feldolgoz\u00f3kra.<\/p>\n<h3>3.3. Kapcsol\u00f3d\u00f3 k\u00e9szletek import\u00e1l\u00e1sa<\/h3>\n<p>\nFent azt a helyzetet vizsg\u00e1ltuk, amikor a forr\u00e1s \u00e9s a c\u00e9ladatok szerkezete megegyezik. De mi t\u00f6rt\u00e9nik, ha a k\u00fcls\u0151 rendszert\u0151l val\u00f3 export\u00e1l\u00e1s form\u00e1tuma elt\u00e9r a n\u00e1lunk t\u00e1rolt strukt\u00far\u00e1t\u00f3l?<\/p>\n<p>Vegy\u00fcnk p\u00e9ldak\u00e9nt egy \u00fcgyf\u00e9l \u00e9s a hozz\u00e1juk kapcsol\u00f3d\u00f3 sz\u00e1ml\u00e1k t\u00e1rol\u00e1s\u00e1t, klasszikus \u00absok-az-egyhez\u00bb esetk\u00e9nt:<\/p>\n<pre><code class=\"sql\">CREATE TABLE client(\n  client_id\n    serial\n      PRIMARY KEY\n, inn\n    varchar\n      UNIQUE\n, name\n    varchar\n);\n\nCREATE TABLE invoice(\n  invoice_id\n    serial\n      PRIMARY KEY\n, client_id\n    integer\n      REFERENCES client(client_id)\n, number\n    varchar\n, dt\n    date\n, sum\n    numeric(32,2)\n);<\/code><\/pre>\n<p>\nAzonban a k\u00fcls\u0151 forr\u00e1st\u00f3l \u00e9rkez\u0151 export \u00abminden egyben\u00bb form\u00e1ban \u00e9rkezik:<\/p>\n<pre><code class=\"sql\">CREATE TEMPORARY TABLE invoice_import(\n  client_inn\n    varchar\n, client_name\n    varchar\n, invoice_number\n    varchar\n, invoice_dt\n    date\n, invoice_sum\n    numeric(32,2)\n);<\/code><\/pre>\n<p>\nNyilv\u00e1nval\u00f3, hogy az \u00fcgyfelek adatai dupl\u00e1z\u00f3dhatnak ilyen form\u00e1tumban, \u00e9s a f\u0151 bejegyz\u00e9s a \u00absz\u00e1mla\u00bb:<\/p>\n<pre><code class=\"plaintext\">0123456789;Vasya;A-01;2020-03-16;1000.00\n9876543210;Petya;A-02;2020-03-16;666.00\n0123456789;Vasya;B-03;2020-03-16;9999.00\n<\/code><\/pre>\n<p>\nA modellhez egyszer\u0171en besz\u00farjuk a tesztadatainkat, de eml\u00e9kezz\u00fcnk \u2014 <code>COPY<\/code> hat\u00e9konyabban!<\/p>\n<pre><code class=\"sql\">INSERT INTO invoice_import\nVALUES\n  ('0123456789', 'Vasya', 'A-01', '2020-03-16', 1000.00)\n, ('9876543210', 'Petya', 'A-02', '2020-03-16', 666.00)\n, ('0123456789', 'Vasya', 'B-03', '2020-03-16', 9999.00);<\/code><\/pre>\n<p>\nEl\u0151sz\u00f6r kiemelj\u00fck azokat a \u00abszeleteket\u00bb, amelyekre a mi \u00abt\u00e9nyek\u00bb hivatkoznak. Ebben az esetben a sz\u00e1ml\u00e1k az \u00fcgyfelekre hivatkoznak:<\/p>\n<pre><code class=\"sql\">CREATE TEMPORARY TABLE client_import AS\nSELECT DISTINCT ON(client_inn)\n-- csak SELECT DISTINCT lehet, ha az adatok nem ellentmond\u00e1sosak\n  client_inn inn\n, client_name \"name\"\nFROM\n  invoice_import;<\/code><\/pre>\n<p>\nAhhoz, hogy a sz\u00e1ml\u00e1kat helyesen \u00f6sszekapcsoljuk az \u00fcgyf\u00e9l-azonos\u00edt\u00f3kkal, el\u0151sz\u00f6r meg kell ismern\u00fcnk vagy gener\u00e1lnunk ezeket az azonos\u00edt\u00f3kat. Adjunk hozz\u00e1 mez\u0151ket hozz\u00e1juk:<\/p>\n<pre><code class=\"sql\">ALTER TABLE invoice_import ADD COLUMN client_id integer;\nALTER TABLE client_import ADD COLUMN client_id integer;<\/code><\/pre>\n<p>\nA fent le\u00edrt t\u00e1bl\u00e1zat-szinkroniz\u00e1l\u00e1si m\u00f3dszert fogjuk alkalmazni egy kis v\u00e1ltoztat\u00e1ssal \u2014 nem friss\u00edt\u00fcnk \u00e9s nem t\u00e1vol\u00edtunk el semmit a c\u00e9l t\u00e1bl\u00e1zatban, hiszen az \u00fcgyfelek importja sz\u00e1munkra \u201ecsak hozz\u00e1ad\u00e1s\u201d:<\/p>\n<pre><code class=\"sql\">-- megadjuk az import t\u00e1bl\u00e1zatban a m\u00e1r l\u00e9tez\u0151 rekordok ID-j\u00e1t\nUPDATE\n  client_import T\nSET\n  client_id = D.client_id\nFROM\n  client D\nWHERE\n  T.inn = D.inn; -- egyedi kulcs\n\n-- besz\u00farjuk a hi\u00e1nyz\u00f3 rekordokat \u00e9s megadjuk az ID-jukat\nWITH ins AS (\n  INSERT INTO client(\n    inn\n  , name\n  )\n  SELECT\n    inn\n  , name\n  FROM\n    client_import\n  WHERE\n    client_id IS NULL -- ha az ID nem lett megadva\n  RETURNING *\n)\nUPDATE\n  client_import T\nSET\n  client_id = D.client_id\nFROM\n  ins D\nWHERE\n  T.inn = D.inn; -- egyedi kulcs\n\n-- megadjuk az \u00fcgyf\u00e9l ID-j\u00e1t a sz\u00e1mla rekordokn\u00e1l\nUPDATE\n  invoice_import T\nSET\n  client_id = D.client_id\nFROM\n  client_import D\nWHERE\n  T.client_inn = D.inn; -- alkalmaz\u00e1si kulcs\n<\/code><\/pre>\n<p>\nTulajdonk\u00e9ppen ennyi \u2014 a <code>invoice_import<\/code> most m\u00e1r ki van t\u00f6ltve a kapcsolat mez\u0151 <code>client_id<\/code>, amellyel be fogjuk illeszteni a sz\u00e1ml\u00e1t.<br \/>\n<br \/>Forr\u00e1s: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/492464\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0440\u0430\u0437\u043d\u044b\u0435 ETL-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b: \u0438\u043c\u043f\u043e\u0440\u0442\u044b, \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c) \u0447\u0430\u0441\u0442\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u00ab\u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c\u00bb, \u0438 \u0441\u0440\u0430\u0437\u0443 \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043e\u0431\u044a\u0435\u043c\u043d\u043e\u0435. \u0422\u0438\u043f\u043e\u0432\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u0437\u0432\u0443\u0447\u0438\u0442 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a: \u00ab\u0412\u043e\u0442 \u0442\u0443\u0442 \u0431\u0443\u0445\u0433\u0430\u043b\u0442\u0435\u0440\u0438\u044f \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u043b\u0430 \u0438\u0437 \u043a\u043b\u0438\u0435\u043d\u0442-\u0431\u0430\u043d\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0432\u0448\u0438\u0435 \u043e\u043f\u043b\u0430\u0442\u044b, \u043d\u0430\u0434\u043e \u0438\u0445 \u0431\u044b\u0441\u0442\u0440\u0435\u043d\u044c\u043a\u043e \u0432\u043a\u0430\u0447\u0430\u0442\u044c \u043d\u0430 \u0441\u0430\u0439\u0442 \u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u043a \u0441\u0447\u0435\u0442\u0430\u043c\u00bb \u041d\u043e \u043a\u043e\u0433\u0434\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":74954,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-74953","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0440\u0430\u0437\u043d\u044b\u0435 ETL-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b: \u0438\u043c\u043f\u043e\u0440\u0442\u044b, \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c) \u0447\u0430\u0441\u0442\u043e.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/dba-gramotno-organizovyvaem-sinhronizaczii-i-importy\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47DBA: \u0433\u0440\u0430\u043c\u043e\u0442\u043d\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u044b | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0440\u0430\u0437\u043d\u044b\u0435 ETL-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b: \u0438\u043c\u043f\u043e\u0440\u0442\u044b, \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c) \u0447\u0430\u0441\u0442\u043e.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/dba-gramotno-organizovyvaem-sinhronizaczii-i-importy\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-03-22T05:42:22+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-22T05:42:22+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47DBA: szakszer\u0171en szervezz\u00fck a szinkroniz\u00e1l\u00e1sokat \u00e9s import\u00e1l\u00e1sokat | ProHoster","description":"Nagy adathalmazon v\u00e9gzett bonyolult feldolgoz\u00e1s sor\u00e1n (k\u00fcl\u00f6nb\u00f6z\u0151 ETL-folyamatok: import\u00e1l\u00e1sok, konvert\u00e1l\u00e1sok \u00e9s szinkroniz\u00e1l\u00e1sok k\u00fcls\u0151 forr\u00e1sokkal) gyakran.","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/dba-gramotno-organizovyvaem-sinhronizaczii-i-importy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47DBA: \u0433\u0440\u0430\u043c\u043e\u0442\u043d\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u044b | ProHoster","og:description":"\u041f\u0440\u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0440\u0430\u0437\u043d\u044b\u0435 ETL-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b: \u0438\u043c\u043f\u043e\u0440\u0442\u044b, \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c) \u0447\u0430\u0441\u0442\u043e.","og:url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/dba-gramotno-organizovyvaem-sinhronizaczii-i-importy","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-03-22T05:42:22+00:00","article:modified_time":"2020-03-22T05:42:22+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"74953","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:04:26","updated":"2022-09-30 13:25:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/74953","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=74953"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/74953\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/74954"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=74953"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=74953"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=74953"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}