{"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\/sq\/blog\/administrirovanie\/dba-gramotno-organizovyvaem-sinhronizaczii-i-importy","title":{"rendered":"DBA: Si t\u00eb organizojm\u00eb me kompetenc\u00eb sinkronizimet dhe importet","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Kur proceset e nd\u00ebrlikuara p\u00ebrpunuese t\u00eb grupeve t\u00eb m\u00ebdha t\u00eb t\u00eb dh\u00ebnave (ndryshe <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ETL\">Proceset ETL<\/a><\/noindex>: importet, konvertimet dhe sinkronizimet me burime t\u00eb jashtme) shpesh lind nevoja <b>p\u00ebr t\u00eb \u00abruajtur\u00bb temporalish, dhe p\u00ebr t'i p\u00ebrpunuar shpejt<\/b> di\u00e7ka voluminoze.<\/p>\n<p>Nj\u00eb detyr\u00eb tipike e k\u00ebtij lloji zakonisht formulohet k\u00ebshtu: <i>\u00abJa ku <noindex><a rel=\"nofollow\" href=\"https:\/\/sbis.ru\/accounting\">administrata ka eksportuar nga banka e klient\u00ebve<\/a><\/noindex> pagesat e fundit t\u00eb pranuara, duhet t'i ngarkojm\u00eb shpejt n\u00eb sit dhe t'i lidhim me llogarit\u00eb\u00bb<\/i><\/p>\n<p>Por kur volumit t\u00eb k\u00ebtij \"di\u00e7kaje\" fillon t\u00eb matet me qindra megabajt, dhe sh\u00ebrbimi duhet t\u00eb vazhdoj\u00eb t\u00eb punoj\u00eb me nj\u00eb baz\u00eb n\u00eb modalitetin 24&#215;7, shfaqen shum\u00eb efekte an\u00ebsore q\u00eb do t'ju prishin jet\u00ebn.<br \/>\n<img decoding=\"async\" alt=\"DBA: Si t\u00eb organizojm\u00eb me kompetenc\u00eb sinkronizimet dhe importet\" src=\"\/wp-content\/uploads\/2020\/03\/f74afb2cd6f5f8de26a0932166933c95.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nP\u00ebr t'u p\u00ebrballur me to n\u00eb PostgreSQL (po ashtu si dhe jo vet\u00ebm te ai), mund t\u00eb p\u00ebrdoren disa mund\u00ebsi p\u00ebr optimizime q\u00eb do t\u00eb lejojn\u00eb p\u00ebrpunimin m\u00eb t\u00eb shpejt\u00eb dhe me nj\u00eb konsum m\u00eb t\u00eb ul\u00ebt t\u00eb burimeve.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>1. Ku t\u00eb ngarkojm\u00eb?<\/h2>\n<p>\nS\u00eb pari, le t\u00eb p\u00ebrcaktojm\u00eb se ku mund t\u00eb ngarkojm\u00eb t\u00eb dh\u00ebnat q\u00eb duam t\u00eb \u00abp\u00ebrpunojm\u00eb\u00bb.<\/p>\n<h3>1.1. Tabela t\u00eb p\u00ebrkohshme (TEMPORARY TABLE)<\/h3>\n<p>\nN\u00eb princip, p\u00ebr PostgreSQL t\u00eb dh\u00ebnat e p\u00ebrkohshme jan\u00eb t\u00eb nj\u00ebjta si \u00e7do tabel\u00eb tjet\u00ebr. Prandaj, superstitat si <i><b>\u00abaty gjith\u00eb ruhet vet\u00ebm n\u00eb memorie, dhe ajo mund t\u00eb mbaroj\u00eb\u00bb<\/b><\/i>nuk jan\u00eb t\u00eb sakta. Por ka disa dallime t\u00eb r\u00ebnd\u00ebsishme.<\/p>\n<h4>Nj\u00eb \u00abem\u00ebr\u00bb t\u00eb ve\u00e7ant\u00eb p\u00ebr \u00e7do lidhje me DB<\/h4>\n<p>\nN\u00ebse dy lidhje p\u00ebrpiqen ndryshe t\u00eb ekzekutojn\u00eb <code>CREATE TABLE x<\/code>, at\u00ebher\u00eb ndonj\u00ebri patjet\u00ebr do t\u00eb marr\u00eb <b>gabimin e q\u00ebndrueshm\u00ebris\u00eb<\/b> objekteve t\u00eb DB.<\/p>\n<p>Por n\u00ebse t\u00eb dy p\u00ebrpiqen t\u00eb ekzekutojn\u00eb <code>CREATE <b>P\u00cbRKOHE<\/b> TABELA x<\/code>, at\u00ebher\u00eb t\u00eb dy do ta realizojn\u00eb normalisht, dhe secili do t\u00eb marr\u00eb <b>nj\u00eb shembujt e tij<\/b> tabel\u00ebs. Dhe mezi do t\u00eb ket\u00eb ndonj\u00eb lidhje mes tyre.<\/p>\n<h4>\u00abVet\u00eb-shkat\u00ebrrimi\u00bb pas disconnection<\/h4>\n<p>\nKur mbyllet lidhja, t\u00eb gjitha tabelat e p\u00ebrkohshme fshihen automatikisht, prandaj nuk ka asnj\u00eb kuptim t\u00eb ekzekutoni <code>DROP TABLE x<\/code> p\u00ebrve\u00e7 \u2026<\/p>\n<p>N\u00ebse po punoni p\u00ebrmes <b>pgbouncer n\u00eb m\u00ebnyr\u00ebn e transaksionit<\/b>, at\u00ebher\u00eb baza vazhdon t\u00eb besoj\u00eb se kjo lidhje \u00ebsht\u00eb ende aktive, dhe se tabela e p\u00ebrkohshme vazhdon t\u00eb ekzistoj\u00eb n\u00eb t\u00eb.<\/p>\n<p>Prandaj, p\u00ebrpjekja p\u00ebr ta krijuar p\u00ebrs\u00ebri, nga nj\u00eb lidhje tjet\u00ebr me pgbouncer, do t\u00eb sjell\u00eb nj\u00eb gabim. Por kjo mund t\u00eb anashkalohet duke p\u00ebrdorur <code>KRIJONI TABEL TEMPORARE <b>N\u00cbSE NUK EKZISTON<\/b> x<\/code>.<\/p>\n<p>Megjithat\u00eb, \u00ebsht\u00eb m\u00eb mir\u00eb t\u00eb mos b\u00ebni k\u00ebshtu, sepse m\u00eb pas mund t\u00eb \u2018zbulohet papritur\u2019 aty, t\u00eb dh\u00ebna q\u00eb kan\u00eb mbetur nga \u2018pronari i m\u00ebparsh\u00ebm\u2019. N\u00eb vend t\u00eb k\u00ebsaj, \u00ebsht\u00eb shum\u00eb m\u00eb mir\u00eb t\u00eb lexoni manualin dhe t\u00eb shihni se kur krijoni tabel\u00ebn ka mund\u00ebsin\u00eb t\u00eb shtoni <code>P\u00cbR ANGAZHIM <b>DROP<\/b><\/code> \u2014 pra at\u00eb, kur t\u00eb mbyllet transaksioni, tabela do t\u00eb fshihet automatikisht.<\/p>\n<h4>Jo-replikimi<\/h4>\n<p>\nP\u00ebr shkak se i p\u00ebrket vet\u00ebm nj\u00eb lidhjeje t\u00eb caktuar, tabelat p\u00ebrkohshme nuk replikohen. Por kjo <b>nuk k\u00ebrkon shkruaj t\u00eb dyfisht\u00eb t\u00eb t\u00eb dh\u00ebnave<\/b> n\u00eb heap + WAL, prandaj INSERT\/UPDATE\/DELETE n\u00eb t\u00eb \u00ebsht\u00eb shum\u00eb m\u00eb i shpejt\u00eb.<\/p>\n<p>Por, duke qen\u00eb se tabela p\u00ebrkohshme \u00ebsht\u00eb p\u00ebrfundimisht nj\u00eb tabel\u00eb \"gati normale\", at\u00ebher\u00eb nuk mund t\u00eb krijohet as n\u00eb replik\u00eb. T\u00eb pakt\u00ebn deri tani, ndon\u00ebse nj\u00eb patch p\u00ebrkat\u00ebs \u00ebsht\u00eb n\u00eb qarkullim prej koh\u00ebsh.<\/p>\n<h3>1.2. Tabelat e pa-journaluara (UNLOGGED TABLE)<\/h3>\n<p>\nPor \u00e7far\u00eb t\u00eb b\u00ebni, p\u00ebr shembull, n\u00ebse keni nj\u00eb proces ETL t\u00eb r\u00ebnd\u00eb, i cili nuk mund t\u00eb realizohet brenda nj\u00eb transaksioni dhe ju keni <b>pgbouncer n\u00eb m\u00ebnyr\u00ebn e transaksionit<\/b>?..<\/p>\n<p>Ose fluksi i t\u00eb dh\u00ebnave \u00ebsht\u00eb kaq i madh sa <b>kapaciteti i nj\u00eb lidhjeje<\/b> me DB (lexo, nj\u00eb proces n\u00eb CPU) nuk \u00ebsht\u00eb i mjaftuesh\u00ebm? ..<\/p>\n<p>Ose disa operacione shkojn\u00eb <b>asirinkronisht<\/b> n\u00eb lidhje t\u00eb ndryshme? ..<\/p>\n<p>K\u00ebtu ka vet\u00ebm nj\u00eb mund\u00ebsi \u2014 <b>t\u00eb krijoni p\u00ebrkoh\u00ebsisht nj\u00eb tabel\u00eb jo-p\u00ebrkohshme<\/b>. Nj\u00eb loj\u00eb fjal\u00ebsh, po. Dometh\u00ebn\u00eb:<\/p>\n<ul>\n<li>krijova \"tabelat\" e mia me emra sa m\u00eb t\u00eb rast\u00ebsish\u00ebm p\u00ebr t\u00eb mos u p\u00ebrzier me ask\u00ebnd<\/li>\n<li><b>Ekstrakto<\/b>: i ngarkova ato me t\u00eb dh\u00ebna nga nj\u00eb burim t\u00eb jasht\u00ebm<\/li>\n<li><b>Transformo<\/b>: i p\u00ebrpunova, popullova fushat e lidhjeve \u00e7el\u00ebs<\/li>\n<li><b>Ngarko<\/b>: transferova t\u00eb dh\u00ebnat e p\u00ebrgatitura n\u00eb tabelat e synuara<\/li>\n<li>fshiva \"tabelat\" e mia<\/li>\n<\/ul>\n<p>\nTani \u2014 nj\u00eb lug\u00eb katran. N\u00eb thelb, <b>e gjith\u00eb regjistrimi n\u00eb PostgreSQL ndodh dy her\u00eb<\/b> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/461523\/\">s\u00eb pari n\u00eb WAL<\/a><\/noindex>, pastaj n\u00eb trupin e tabelave\/indeks\u00ebve. E gjith\u00eb kjo \u00ebsht\u00eb b\u00ebr\u00eb p\u00ebr t\u00eb mb\u00ebshtetur ACID dhe p\u00ebr t\u00eb siguruar dukshm\u00ebrin\u00eb korrekte t\u00eb t\u00eb dh\u00ebnave midis <code>KREJT<\/code>&#8216;nd\u00ebrmjet dhe <code>ROLLBACK<\/code>&#8216;nd\u00ebrmjet transaksioneve.<\/p>\n<p>Por nuk kemi nevoj\u00eb p\u00ebr k\u00ebt\u00eb! T\u00eb gjith\u00eb procesi <b>ose kaloi me sukses plot\u00ebsisht, ose nuk kaloi<\/b>. Nuk ka r\u00ebnd\u00ebsi sa do t\u00eb ket\u00eb transaksione nd\u00ebrmjet\u00ebse \u2014 nuk na intereson \"t\u00eb vazhdojm\u00eb procesin nga mesi\", sidomos kur nuk dihet ku ishte.<\/p>\n<p>P\u00ebr k\u00ebt\u00eb q\u00ebllim, zhvilluesit e PostgreSQL n\u00eb versionin 9.1 implementuan nj\u00eb funksion si <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/sql-createtable#SQL-CREATETABLE-UNLOGGED\">tabelat e pa-journaluara (UNLOGGED)<\/a><\/noindex>:<\/p>\n<blockquote><p>Me k\u00ebt\u00eb njoftim, tabela krijohet si nj\u00eb tabel\u00eb e pa-journaluar. T\u00eb dh\u00ebnat q\u00eb shkruhen n\u00eb tabelat e pa-journaluara nuk kalojn\u00eb p\u00ebrmes regjistrit t\u00eb para-shkrimit (shih Kapitulli 29), si rezultat, tabelat e tilla <b>punojn\u00eb shum\u00eb m\u00eb shpejt se ato normale.<\/b>Megjithat\u00eb, ato nuk jan\u00eb t\u00eb mbrojtura nga d\u00ebshtimi; n\u00eb rast d\u00ebshtimi ose shk\u00ebputjeje t\u00eb papritur t\u00eb serverit, tabela e pa-journaluar <b>automatikisht fshihet.<\/b>P\u00ebr m\u00eb tep\u00ebr, p\u00ebrmbajtja e tabel\u00ebs s\u00eb pa-journaluar <b>nuk replikohen.<\/b> n\u00eb server\u00eb t\u00eb drejtuar. \u00c7do indeks q\u00eb krijohet p\u00ebr nj\u00eb tabel\u00eb t\u00eb pa regjistruar automatikisht b\u00ebhet i pa regjistruar.<\/p><\/blockquote>\n<p>N\u00eb m\u00ebnyr\u00eb m\u00eb t\u00eb shkurt\u00ebr, <b>do t\u00eb jet\u00eb shum\u00eb m\u00eb e shpejt\u00eb<\/b>, por n\u00ebse serveri i DB bie - do t\u00eb jet\u00eb e pak\u00ebndshme. Por sa shpesh ndodh kjo, dhe a e di procesi juaj ETL ta rregulloj\u00eb si\u00e7 duhet \"nga mesi\" pasi \"t\u00eb ringjallet\" DB?..<\/p>\n<p>N\u00ebse nuk \u00ebsht\u00eb k\u00ebshtu dhe rasti m\u00eb sip\u00ebr \u00ebsht\u00eb i ngjash\u00ebm me tuajin - p\u00ebrdorni <code>UNLOGGED<\/code>, por kurr\u00eb <b>mos e aktivizoni k\u00ebt\u00eb atribut n\u00eb tabelat reale<\/b>, t\u00eb dh\u00ebnat e t\u00eb cilave ju jan\u00eb t\u00eb \u00e7muara.<\/p>\n<h3>1.3. ON COMMIT { FSHIJ RRESHTAT | HUMB }<\/h3>\n<p>\nKy konstrukt lejon t\u00eb p\u00ebrcaktoni sjelljen automatike gjat\u00eb p\u00ebrmbylljes s\u00eb transaksionit kur krijoni nj\u00eb tabel\u00eb.<\/p>\n<p>P\u00ebr <code>P\u00cbR ANGAZHIM <b>DROP<\/b><\/code> Un\u00eb tashm\u00eb e kam shkruar m\u00eb lart, ai gjeneron <code>DROP TABLE<\/code>, por k\u00ebtu <code>P\u00cbR ANGAZHIM <b>Fshij Rreshtat<\/b><\/code> situata \u00ebsht\u00eb m\u00eb interesante - k\u00ebtu gjenerohet <code>TRUNCATE TABLE<\/code>.<\/p>\n<p>Duke qen\u00eb se e gjith\u00eb infrastruktura e ruajtjes s\u00eb meta-p\u00ebrshkrimit t\u00eb tabel\u00ebs p\u00ebrkoh\u00ebshe \u00ebsht\u00eb krejt\u00ebsisht e nj\u00ebjt\u00eb me at\u00eb t\u00eb zakonshmes, at\u00ebher\u00eb <b>krijimi dhe fshirja e tabelave p\u00ebrkoh\u00ebshe \u00e7on n\u00eb nj\u00eb \"shkaktim\" t\u00eb fort\u00eb t\u00eb tabelave sistemike<\/b> pg_class, pg_attribute, pg_attrdef, pg_depend,\u2026<\/p>\n<p>Tani imagjinoni se keni nj\u00eb pun\u00ebtor n\u00eb nj\u00eb lidhje t\u00eb drejtp\u00ebrdrejt\u00eb me DB, i cili \u00e7do sekond\u00eb hap nj\u00eb transaksion t\u00eb ri, krijon, mbush, p\u00ebrpunon dhe fshin nj\u00eb tabel\u00eb p\u00ebrkoh\u00ebshe\u2026 Do t\u00eb grumbullohet shum\u00eb pleh n\u00eb tabelat sistemike, q\u00eb do t\u00eb krijoj\u00eb vonesa t\u00eb tep\u00ebrta n\u00eb \u00e7do operacion.<\/p>\n<p>N\u00eb p\u00ebrgjith\u00ebsi, mos e b\u00ebni k\u00ebshtu! N\u00eb k\u00ebt\u00eb rast, \u00ebsht\u00eb m\u00eb efektive <code>CREATE TEMPORARY TABLE x ... ON COMMIT DELETE ROWS<\/code> ta nxirrni jasht\u00eb ciklit t\u00eb transaksioneve - at\u00ebher\u00eb n\u00eb fillim t\u00eb \u00e7do transaksioni t\u00eb ri tabela do t\u00eb <b>ekzistoj\u00eb<\/b> (shpenzojm\u00eb thirrjen <code>CREATE<\/code>), por <b>do t\u00eb jet\u00eb bosh<\/b>, fal\u00eb <code>TRUNCATE<\/code> (ne gjithashtu e kemi kursyer thirrjen e saj) kur p\u00ebrfundon transaksioni i m\u00ebparsh\u00ebm.<\/p>\n<h3>1.4. SI\u2026 P\u00cbRFSHI\u2026<\/h3>\n<p>\nE p\u00ebrmenda n\u00eb fillim se nj\u00eb nga rastet tipike t\u00eb p\u00ebrdorimit p\u00ebr tabelat p\u00ebrkoh\u00ebsh \u00ebsht\u00eb lloje t\u00eb ndryshme importesh - dhe zhvilluesi me lodhje kopjon list\u00ebn e fushave t\u00eb tabel\u00ebs objektiv n\u00eb shpalljen e tabel\u00ebs s\u00eb tij p\u00ebrkoh\u00ebshe\u2026<\/p>\n<p>Por inercia \u00ebsht\u00eb motor i progresit! Prandaj <b>krijimi i nj\u00eb tabele \"sip\u00ebr\"<\/b> mund t\u00eb jet\u00eb shum\u00eb m\u00eb i leht\u00eb:<\/p>\n<pre><code class=\"sql\">CREATE TEMPORARY TABLE import_table(\n  LIKE target_table\n);<\/code><\/pre>\n<p>\nDuke qen\u00eb se \u00ebsht\u00eb shum\u00eb e mundur t\u00eb gjeneroni shum\u00eb t\u00eb dh\u00ebna n\u00eb k\u00ebt\u00eb tabel\u00eb, k\u00ebrkimet n\u00eb t\u00eb do t\u00eb b\u00ebhen aspak t\u00eb shpejta. Por p\u00ebr k\u00ebt\u00eb ka nj\u00eb zgjidhje tradicionale - indekset! Dhe, po, <b>edhe tabela p\u00ebrkoh\u00ebshe mund t\u00eb ket\u00eb indekse<\/b>.<\/p>\n<p>Duke qen\u00eb se shpesh her\u00eb, indekset e nevojshme p\u00ebrkojn\u00eb me ato t\u00eb tabel\u00ebs objektiv, mund t\u00eb shkruani thjesht <code>SI target_table <b>DHE ME INDICES<\/b><\/code>.<\/p>\n<p>N\u00ebse ju nevojiten gjithashtu <code>DEFAULT<\/code>-vlera (p\u00ebr shembull, p\u00ebr t\u00eb plot\u00ebsuar vlerat e \u00e7el\u00ebsit primar), mund t\u00eb p\u00ebrdorni <code>SI target_table <b>P\u00cbRSHKAK T\u00cb T\u00cb D\u00cbRGUARAVE T\u00cb PARACAKTUARA<\/b><\/code>. Ose thjesht \u2014 <code>SI target_table <b>P\u00ebrfshir\u00eb t\u00eb gjitha<\/b><\/code> \u2014 do t\u00eb kopjoj\u00eb defoltet, indekset, constraint-e,\u2026<\/p>\n<p>Por k\u00ebtu duhet t\u00eb kuptoni se n\u00ebse keni krijuar <b>tabel\u00ebn e importit menj\u00ebher\u00eb me indekse, at\u00ebher\u00eb do t\u00eb importohen t\u00eb dh\u00ebnat m\u00eb ngadal\u00eb<\/b>, sesa n\u00ebse s\u00eb pari importoni t\u00eb gjith\u00eb t\u00eb dh\u00ebnat, dhe pastaj vendosni indekset \u2014 shikoni si e b\u00ebn <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/app-pgdump\">pg_dump<\/a><\/noindex>.<\/p>\n<p>N\u00eb p\u00ebrgjith\u00ebsi, <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/sql-createtable\">RTFM.<\/a><\/noindex>!<\/p>\n<h2>2. Si t\u00eb shkruani?<\/h2>\n<p>\nDo t\u00eb them thjesht \u2014 p\u00ebrdorni <code><noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/sql-copy\">COPY<\/a><\/noindex><\/code>-rrjedh\u00ebn n\u00eb vend t\u00eb \"grupit\" <code>SHTO<\/code>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.citusdata.com\/blog\/2017\/11\/08\/faster-bulk-loading-in-postgresql-with-copy\/\">shpejt\u00ebsia shum\u00ebfishohet<\/a><\/noindex>. Madje mund t'i merrni direkt nga nj\u00eb skedar i formuar paraprakisht.<\/p>\n<h2>3. Si t\u00eb p\u00ebrpunoni?<\/h2>\n<p>\nPra, le t\u00eb supozojm\u00eb se hyrja jon\u00eb duket k\u00ebshtu:<\/p>\n<ul>\n<li>ju keni n\u00eb baz\u00eb nj\u00eb tabel\u00eb me t\u00eb dh\u00ebnat e klient\u00ebve n\u00eb <b>1M regjistrime<\/b><\/li>\n<li>\u00e7do dit\u00eb klienti ju d\u00ebrgon nj\u00eb <b>t\u00eb plot\u00eb \"imazh\"<\/b><\/li>\n<li>sipas p\u00ebrvoj\u00ebs e dini se nga hera n\u00eb her\u00eb <b>ndryshojn\u00eb jo m\u00eb shum\u00eb se 10K regjistrime<\/b><\/li>\n<\/ul>\n<p>\nNj\u00eb shembull klasik i nj\u00eb situate t\u00eb till\u00eb \u00ebsht\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gnivc.ru\/technical_support\/classifiers_reference\/kladr\/\">baza KLDAR<\/a><\/noindex> \u2014 ka shum\u00eb adresa, por n\u00eb \u00e7do shkarkim javore t\u00eb ndryshimeve (ndryshime emrash t\u00eb vendbanimeve, bashkime rrug\u00ebsh, shfaqje t\u00eb sht\u00ebpive t\u00eb reja) ka shum\u00eb pak edhe n\u00eb shkall\u00eb t\u00eb t\u00ebr\u00eb vendit.<\/p>\n<h3>3.1. Algoritmi i sinkronizimit t\u00eb plot\u00eb<\/h3>\n<p>\nP\u00ebr thjesht\u00ebsi supozojm\u00eb se nuk keni nevoj\u00eb ta restrukturoni t\u00eb dh\u00ebnat \u2014 thjesht ta sillni tabel\u00ebn n\u00eb form\u00ebn e duhur, pra:<\/p>\n<ul>\n<li><b>t\u00eb fshij\u00eb<\/b> gjith\u00e7ka q\u00eb nuk ekziston m\u00eb<\/li>\n<li><b>Opsionet p\u00ebr procesor\u00ebt \u00abElbrus\u00bb jan\u00eb t\u00eb disponueshme me<\/b> gjith\u00e7ka q\u00eb ka qen\u00eb, dhe duhet t\u00eb p\u00ebrdit\u00ebsohet<\/li>\n<li><b>shto<\/b> gjith\u00e7ka q\u00eb nuk ka qen\u00eb ende<\/li>\n<\/ul>\n<p>\nPse duhet b\u00ebr\u00eb operacionet n\u00eb k\u00ebt\u00eb rend? Sepse n\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb p\u00ebrmasa e tabel\u00ebs do t\u00eb rritet minimalisht (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/491366\/\">mbani mend MVCC!<\/a><\/noindex>).<\/p>\n<h4>DELETE FROM dst<\/h4>\n<p>\nSigurisht, mund t\u00eb b\u00ebni me vet\u00ebm dy operacione:<\/p>\n<ul>\n<li><b>t\u00eb fshij\u00eb<\/b> (<code>FSHI<\/code>) gjith\u00e7ka<\/li>\n<li><b>shto<\/b> all nga imazhi i ri<\/li>\n<\/ul>\n<p>\nPor n\u00eb k\u00ebt\u00eb rast, fal\u00eb MVCC, <b>p\u00ebrmasa e tabel\u00ebs do t\u00eb rritet pik\u00ebrisht dyfish<\/b>! T\u00eb merrni +1M imazhe regjistrimesh n\u00eb tabel\u00eb p\u00ebr shkak t\u00eb p\u00ebrdit\u00ebsimit t\u00eb 10K \u2014 nuk \u00ebsht\u00eb shum\u00eb e mir\u00eb p\u00ebr shkak t\u00eb tepric\u00ebs\u2026<\/p>\n<h4>TRUNCATE dst<\/h4>\n<p>\nNj\u00eb zhvillues m\u00eb i experienced e di q\u00eb t\u00eb gjith\u00eb tabel\u00ebn mund ta pastroni mjaft lirsh\u00ebm:<\/p>\n<ul>\n<li><b>pastro<\/b> (<code>TRUNCATE<\/code>) t\u00eb gjith\u00eb tabel\u00ebn<\/li>\n<li><b>shto<\/b> all nga imazhi i ri<\/li>\n<\/ul>\n<p>\nMetoda \u00ebsht\u00eb efektive, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/481866\/\">ndonj\u00ebher\u00eb \u00ebsht\u00eb plot\u00ebsisht e aplikueshme<\/a><\/noindex>, por ka nj\u00eb problem\u2026 Do t\u00eb importojm\u00eb 1M regjistrime p\u00ebr nj\u00eb koh\u00eb t\u00eb gjat\u00eb, k\u00ebshtu q\u00eb nuk mund t\u00eb lejojm\u00eb tabel\u00ebn t\u00eb jet\u00eb bosh p\u00ebr gjith\u00eb k\u00ebt\u00eb koh\u00eb (si\u00e7 do t\u00eb ndodhte pa e futur n\u00eb nj\u00eb transaksion t\u00eb vetme).<\/p>\n<p>K\u00ebshtu q\u00eb:<\/p>\n<ul>\n<li>na fillon <b>nj\u00eb transaksion t\u00eb gjat\u00eb<\/b><\/li>\n<li><code>TRUNCATE<\/code> vendos <b>AccessExclusive<\/b>-bllokimin<\/li>\n<li>ne tregojm\u00eb ngadal\u00eb futurin, dhe t\u00eb gjith\u00eb t\u00eb tjer\u00ebt n\u00eb k\u00ebt\u00eb koh\u00eb <b>nuk mund t\u00eb <code>SELECT<\/code><\/b><\/li>\n<\/ul>\n<p>\n\u00c7far\u00eb po ndodh q\u00eb \u00ebsht\u00eb e keqe\u2026<\/p>\n<h4>ALTER TABLE\u2026 RENAME\u2026 \/ DROP TABLE \u2026<\/h4>\n<p>\nNj\u00eb mund\u00ebsi \u00ebsht\u00eb t\u00eb ngarkohet gjith\u00e7ka n\u00eb nj\u00eb tav\u00eb t\u00eb re dhe pastaj thjesht ta rinovoni n\u00eb vendin e tav\u00ebs s\u00eb vjet\u00ebr. Disa detaje t\u00eb pak\u00ebndshme:<\/p>\n<ul>\n<li>po ashtu <b>AccessExclusive<\/b>, edhe pse ndjesh\u00ebm m\u00eb pak n\u00eb koh\u00eb<\/li>\n<li>do t\u00eb humbasin t\u00eb gjith\u00eb planet e k\u00ebrkesave\/statistik\u00ebs s\u00eb k\u00ebsaj tav\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/479656\/\">duhet t\u00eb b\u00ebjm\u00eb ANALYZE<\/a><\/noindex><\/li>\n<li><b>shkelen t\u00eb gjitha \u00e7el\u00ebsat e jasht\u00ebm<\/b> (FK) p\u00ebr tav\u00ebn<\/li>\n<\/ul>\n<p>\nIshte nj\u00eb patch WIP nga Simon Riggs, i cili propozoi t\u00eb b\u00ebhej <code>ALTER<\/code>-operacion p\u00ebr t\u00eb z\u00ebvend\u00ebsuar trupin e tav\u00ebs n\u00eb nivelin e skedarit, pa prekur statistik\u00ebn dhe FK, por nuk arriti t\u00eb grumbulloj\u00eb kuorum.<\/p>\n<h4>DELETE, UPDATE, INSERT<\/h4>\n<p>\nPra, ndalojm\u00eb te opsioni jo-bllokues nga tre operacione. Pothuajse tre... Si ta b\u00ebjm\u00eb m\u00eb efektivisht?<\/p>\n<pre><code class=\"sql\">-- gjith\u00e7ka b\u00ebhet brenda transaksionit, q\u00eb askush t\u00eb mos shoh\u00eb \"gjendje t\u00eb p\u00ebrkohshme\"\nBEGIN;\n\n-- krijojm\u00eb tavolin\u00eb t\u00eb p\u00ebrkohshme me t\u00eb dh\u00ebnat e importuara\nCREATE TEMPORARY TABLE tmp(\n  LIKE dst INCLUDING INDEXES -- sipas modelit, s\u00eb bashku me indekset\n) ON COMMIT DROP; -- jasht\u00eb transaksionit, nuk na nevojitet\n\n-- shpejt\u00eb shpejt\u00eb importojm\u00eb imazhin e ri p\u00ebrmes COPY\nCOPY tmp FROM STDIN;\n-- ...\n-- .\n\n-- hiqni ato q\u00eb mungojn\u00eb\nDELETE FROM\n  dst D\nUSING\n  dst X\nLEFT JOIN\n  tmp Y\n    USING(pk1, pk2) -- fushat e \u00e7el\u00ebsit t\u00eb par\u00eb\nWHERE\n  (D.pk1, D.pk2) = (X.pk1, X.pk2) AND\n  Y IS NOT DISTINCT FROM NULL; -- \"anti-join\"\n\n-- p\u00ebrdit\u00ebsojm\u00eb ato q\u00eb kan\u00eb mbetur\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); -- nuk ka nevoj\u00eb t\u00eb p\u00ebrdit\u00ebsojm\u00eb ato q\u00eb p\u00ebrputhen\n\n-- shtojm\u00eb ato q\u00eb mungojn\u00eb\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. Pastrimi i importit<\/h3>\n<p>\nN\u00eb t\u00eb nj\u00ebjtin KLADr, t\u00eb gjitha regjistrimet e ndryshuara duhet t\u00eb kalojn\u00eb gjithashtu p\u00ebrmes pastrimit - normalizimi, identifikimi i fjal\u00ebve ky\u00e7e, p\u00ebrshtatja n\u00eb strukturat e nevojshme. Por si t\u00eb dim\u00eb - <b>\u00e7far\u00eb sakt\u00ebsisht \u00ebsht\u00eb ndryshuar<\/b>, pa e komplikuar kodin e sinkronizimit, n\u00eb ideale, duke mos e prekur fare?<\/p>\n<p>N\u00ebse qasja p\u00ebr shkrim n\u00eb momentin e sinkronizimit \u00ebsht\u00eb vet\u00ebm n\u00eb procesin tuaj, at\u00ebher\u00eb mund t\u00eb p\u00ebrdorni nj\u00eb trigger, i cili do t\u00eb mbledh\u00eb t\u00eb gjitha ndryshimet p\u00ebr ne:<\/p>\n<pre><code class=\"sql\">-- tabelat celulare\nCREATE TABLE kladr(...);\nCREATE TABLE kladr_house(...);\n\n-- tabelat me historin\u00eb ndryshimesh\nCREATE TABLE kladr$log(\n  ro kladr, -- k\u00ebtu ndodhen imazhet e plota t\u00eb regjistrimeve t\u00eb vjetra\/t\u00eb reja\n  rn kladr\n);\n\nCREATE TABLE kladr_house$log(\n  ro kladr_house,\n  rn kladr_house\n);\n\n-- funksioni i p\u00ebrgjithsh\u00ebm p\u00ebr regjistrimin e ndryshimeve\nCREATE OR REPLACE FUNCTION diff$log() RETURNS trigger AS $$\nDECLARE\n  dst varchar = TG_TABLE_NAME || '$log';\n  stmt text = '';\nBEGIN\n  -- kontrollojm\u00eb nevoj\u00ebn p\u00ebr regjistrimin kur azhurnohet nj\u00eb regjistrim\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  -- krijojm\u00eb nj\u00eb regjistrim logu\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>\nTani mund t'i vendosim (ose t'i aktivizojm\u00eb n\u00ebp\u00ebrmjet) trigget p\u00ebrpara fillimit t\u00eb sinkronizimit <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>\nDhe pastaj mund t\u00eb nxjerrim qet\u00eb t\u00eb gjitha ndryshimet q\u00eb na nevojiten nga tabelat log dhe t'i kalojm\u00eb p\u00ebrmes p\u00ebrpunuesve t\u00eb tjer\u00eb.<\/p>\n<h3>3.3. Importimi i seteve t\u00eb lidhura<\/h3>\n<p>\nM\u00eb sip\u00ebr kemi shqyrtuar rastet kur struktura e t\u00eb dh\u00ebnave t\u00eb burimit dhe t\u00eb pranimit p\u00ebrputhen. Por \u00e7far\u00eb t\u00eb b\u00ebjm\u00eb, n\u00ebse eksporti nga sistemi i jasht\u00ebm ka nj\u00eb format t\u00eb ndrysh\u00ebm nga struktura e ruajtjes n\u00eb baz\u00ebn ton\u00eb?<\/p>\n<p>T\u00eb marrim p\u00ebr shembull ruajtjen e klient\u00ebve dhe faturave p\u00ebr ta, nj\u00eb variant klasik \"marr\u00ebdh\u00ebnie shum\u00eb-n\u00eb-nj\u00eb\":<\/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>\nNd\u00ebrkaq, eksporti nga nj\u00eb burim t\u00eb jasht\u00ebm na vjen n\u00eb form\u00ebn \"gjith\u00e7ka n\u00eb nj\u00eb\":<\/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>\nSigurisht, t\u00eb dh\u00ebnat p\u00ebr klient\u00ebt mund t\u00eb jen\u00eb t\u00eb dyfishta n\u00eb k\u00ebt\u00eb variant, dhe regjistrimi kryesor \u00ebsht\u00eb \"fatura\":<\/p>\n<pre><code class=\"plaintext\">0123456789;Vasja;A-01;2020-03-16;1000.00\n9876543210;Petja;A-02;2020-03-16;666.00\n0123456789;Vasja;B-03;2020-03-16;9999.00\n<\/code><\/pre>\n<p>\nP\u00ebr modelin, thjesht do t\u00eb insertojm\u00eb t\u00eb dh\u00ebnat tona testuese, por mbajm\u00eb mend \u2014 <code>COPY<\/code> m\u00eb efikase!<\/p>\n<pre><code class=\"sql\">INSERT INTO invoice_import\nVALUES\n  ('0123456789', 'Vasja', 'A-01', '2020-03-16', 1000.00)\n, ('9876543210', 'Petja', 'A-02', '2020-03-16', 666.00)\n, ('0123456789', 'Vasja', 'B-03', '2020-03-16', 9999.00);<\/code><\/pre>\n<p>\nS\u00eb pari, do t\u00eb ndjekim ato \"shkurtimet\", p\u00ebr t\u00eb cilat \"faktet\" tona iu referohen. N\u00eb rastin ton\u00eb, faturat iu referohen klient\u00ebve:<\/p>\n<pre><code class=\"sql\">CREATE TEMPORARY TABLE client_import AS\nSELECT DISTINCT ON(client_inn)\n-- mund t\u00eb p\u00ebrdorni thjesht SELECT DISTINCT, n\u00ebse t\u00eb dh\u00ebnat jan\u00eb t\u00eb qarta\n  client_inn inn\n, client_name \"name\"\nFROM\n  invoice_import;<\/code><\/pre>\n<p>\nP\u00ebr t\u00eb lidhur sakt\u00eb faturat me ID-t\u00eb e klient\u00ebve, na nevojiten fillimisht k\u00ebto identifikues ose duhet t\u00eb gjenerohen. Do t\u00eb shtojm\u00eb fusha p\u00ebr to:<\/p>\n<pre><code class=\"sql\">ALTER TABLE invoice_import SHTO COLUMN client_id integer;\nALTER TABLE client_import SHTO COLUMN client_id integer;<\/code><\/pre>\n<p>\nDo t\u00eb p\u00ebrdorim metod\u00ebn e p\u00ebrmendur m\u00eb sip\u00ebr p\u00ebr sinkronizimin e tabelave me nj\u00eb korrigjim t\u00eb vog\u00ebl \u2014 nuk do t\u00eb p\u00ebrdit\u00ebsojm\u00eb ose fshijm\u00eb asgj\u00eb n\u00eb tabel\u00ebn e destinacionit, sepse importi i klient\u00ebve \u00ebsht\u00eb \"append-only\":<\/p>\n<pre><code class=\"sql\">-- vendosim n\u00eb tabel\u00ebn e importit ID-t\u00eb e regjistrimeve tashm\u00eb ekzistuese\nUPDATE\n  client_import T\nSET\n  client_id = D.client_id\nFROM\n  client D\nWHERE\n  T.inn = D.inn; -- \u00e7el\u00ebsi unik\n\n-- shtojm\u00eb regjistrimet q\u00eb mungojn\u00eb dhe vendosim ID-t\u00eb e tyre\nME 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 \u00cbSHT\u00cb NULL -- n\u00ebse ID nuk \u00ebsht\u00eb vendosur\n  KTHE\n)\nUPDATE\n  client_import T\nSET\n  client_id = D.client_id\nFROM\n  ins D\nWHERE\n  T.inn = D.inn; -- \u00e7el\u00ebsi unik\n\n-- vendosim ID-t\u00eb e klient\u00ebve p\u00ebr regjistrimet e faturave\nUPDATE\n  invoice_import T\nSET\n  client_id = D.client_id\nFROM\n  client_import D\nWHERE\n  T.client_inn = D.inn; -- \u00e7el\u00ebsi aplikativ\n<\/code><\/pre>\n<p>\nN\u00eb thelb, gjith\u00e7ka \u00ebsht\u00eb n\u00eb <code>invoice_import<\/code> tani fusha e lidhjes \u00ebsht\u00eb e mbushur <code>client_id<\/code>, me t\u00eb cilin do ta vendosim fatur\u00ebn.<br \/>\n<br \/>Burimi: <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.2 - 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\/sq\/blog\/administrirovanie\/dba-gramotno-organizovyvaem-sinhronizaczii-i-importy\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\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\/sq\/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: organizojm\u00eb n\u00eb m\u00ebnyr\u00eb t\u00eb men\u00e7ur sinkronizimet dhe importet | ProHoster","description":"N\u00eb proceset e komplikuara t\u00eb p\u00ebrpunimit t\u00eb grupeve t\u00eb m\u00ebdha t\u00eb t\u00eb dh\u00ebnave (procese t\u00eb ndryshme ETL: importe, konvertime dhe sinkronizime me burime t\u00eb jashtme) shpesh.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/dba-gramotno-organizovyvaem-sinhronizaczii-i-importy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","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\/sq\/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\/sq\/wp-json\/wp\/v2\/posts\/74953","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=74953"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/74953\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/74954"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=74953"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=74953"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=74953"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}