Kumusta
Ang akong ngalan mao si Vanya ug ako usa ka developer sa Java. Nahitabo nga daghan ako nga nagtrabaho sa PostgreSQL - pag-set up sa database, pag-optimize sa istruktura, pasundayag, ug pagdula og gamay nga DBA sa katapusan sa semana.
Bag-ohay lang akong gihapsay ang daghang mga database sa among mga microservice ug nagsulat og java library
Disclaimer
Ang nag-unang bersyon sa PostgreSQL nga akong gitrabahoan mao ang 10. Ang tanan nga mga pangutana sa SQL nga akong gigamit gisulayan usab sa bersyon 11. Ang minimum nga gisuportahan nga bersyon mao ang 9.6.
sa naunang kasaysayan
Nagsugod ang tanan hapit usa ka tuig ang milabay sa usa ka sitwasyon nga katingad-an alang kanako: ang kompetisyon nga paghimo sa usa ka indeks nga walaβy asul natapos sa usa ka sayup. Ang indeks mismo, sama sa naandan, nagpabilin sa database sa usa ka dili balido nga kahimtang. Ang pag-analisa sa log nagpakita sa kakulang
Problema uno - default configuration
Tingali ang tanan medyo gikapoy sa metapora bahin sa Postgres, nga mahimoβg ipadagan sa usa ka magbubuhat sa kape, apan ... ang default nga pagsumpo sa tinuud nagpatunghag daghang mga pangutana. Sa labing gamay, angay nga hatagan pagtagad maintenance_work_mem, temp_file_limit, statement_timeout ΠΈ lock_timeout.
Sa among kaso maintenance_work_mem mao ang default nga 64 MB, ug temp_file_limit usa ka butang sa palibot sa 2 GB - wala kami igo nga memorya aron makahimo usa ka indeks sa usa ka dako nga lamesa.
Busa, sa pg-index-panglawas Nagkolekta ako usa ka serye
Duha ka problema - doble nga mga indeks
Ang among mga database nagpuyo sa SSD drive, ug among gigamit HA-konfigurasyon nga adunay daghang mga sentro sa datos, master host ug n- gidaghanon sa mga replika. Ang espasyo sa disk usa ka bililhon kaayo nga kapanguhaan alang kanamo; kini mao ang dili kaayo importante kay sa performance ug CPU konsumo. Busa, sa usa ka bahin, nagkinahanglan kita og mga indeks alang sa paspas nga pagbasa, ug sa laing bahin, dili nato gusto nga makita ang dili kinahanglan nga mga indeks sa database, tungod kay sila mokaon sa luna ug mohinay sa pag-update sa datos.
Ug karon, nga gipahiuli ang tanan
Tulo nga problema - nag-intersecting nga mga indeks
Kadaghanan sa mga bag-ong developer naghimo og mga indeks sa usa ka kolum. Sa hinay-hinay, nga hingpit nga nasinati kini nga negosyo, ang mga tawo nagsugod sa pag-optimize sa ilang mga pangutana ug pagdugang labi ka komplikado nga mga indeks nga adunay daghang mga kolum. Ingon niini ang pagpakita sa mga indeks sa mga kolum A, Usa ka + B, A + B + C ug uban pa. Ang una nga duha niini nga mga indeks mahimong luwas nga ilabay, tungod kay kini mga prefix sa ikatulo. Nagtipig usab kini og daghang espasyo sa disk ug adunay mga diagnostic alang niini
Problema sa upat - langyaw nga mga yawe nga walay mga indeks
Gitugotan ka sa mga postgres nga maghimo mga langyaw nga yawe nga mga pagpugong nga wala magpiho sa usa ka indeks sa pagsuporta. Sa daghang mga sitwasyon kini dili usa ka problema, ug mahimong dili gani magpakita sa iyang kaugalingon... Sa pagkakaron...
Kini mao ang sama nga uban kanato: kini lang nga sa usa ka punto sa panahon sa usa ka trabaho, nga nagdagan sumala sa usa ka eskedyul ug paghawan sa database sa pagsulay order, nagsugod nga "idugang" kanato sa master host. Ang CPU ug IO nausik, ang mga hangyo mihinay ug na-time out, ang serbisyo lima ka gatos. Dali nga pagtuki
delete from <table> where id in (β¦)
Sa kini nga kaso, siyempre, adunay usa ka indeks pinaagi sa id sa target nga lamesa, ug gamay ra nga mga rekord ang natangtang sumala sa kondisyon. Ingon og ang tanan kinahanglan nga molihok, apan, alaut, kini wala.
Ang kahibulongan miabut aron sa pagluwas ipasabot analisaha ug giingon nga dugang sa pagtangtang sa mga rekord sa target nga lamesa, adunay usab usa ka referential integrity check, ug sa usa sa mga may kalabutan nga mga lamesa kini nga tseke napakyas. sequential scan tungod sa kakulang sa usa ka angay nga indeks. Busa ang mga diagnostic natawo
Lima nga problema - null nga kantidad sa mga indeks
Sa kasagaran, ang Postgres naglakip sa null values ββββsa mga btree index, apan kasagaran dili kini gikinahanglan didto. Busa, makugihon kong naningkamot nga isalikway kining mga null (diagnostics where <A> is not null
. Niining paagiha akong napakunhod ang gidak-on sa usa sa among mga indeks gikan sa 1877 MB ngadto sa 16 KB. Ug sa usa sa mga serbisyo, ang gidak-on sa database mikunhod sa kinatibuk-an sa 16% (sa 4.3 GB sa hingpit nga mga numero) tungod sa dili paglakip sa mga null nga kantidad gikan sa mga indeks. Dako nga pagtipig sa disk space nga adunay yano nga mga pagbag-o. π
Ikaunom nga problema - kakulang sa panguna nga mga yawe
Tungod sa kinaiya sa mekanismo
Usa ka adlaw, usa ka talagsaon nga paglalin ang mikuha ug nag-update sa tanang mga rekord sa usa ka dako ug aktibong gigamit nga lamesa. Nakuha namon ang + 100 GB sa gidak-on sa lamesa nga walaβy asul. Makauulaw kaayo, apan ang among mga kasaypanan wala matapos didto. Human matapos ang autovacuum niini nga lamesa 15 ka oras ang milabay, nahimong klaro nga ang pisikal nga lokasyon dili na mobalik. Dili namo mapahunong ang serbisyo ug himoong VACUUM FULL, mao nga nakahukom mi nga gamiton
Sa bersyon sa librarya 0.1.5 Ang abilidad sa pagkolekta sa datos gikan sa bloat sa mga lamesa ug mga indeks ug pagtubag niini sa tukma sa panahon nga paagi gidugang.
Ang mga problema pito ug walo - dili igo nga mga indeks ug wala magamit nga mga indeks
Ang mosunod nga duha ka mga diagnostic mao ang:
Sama sa nasulat na nako, naggamit kami usa ka pagsumpo nga adunay daghang mga replika, ug ang pagkarga sa pagbasa sa lainlaing mga host lahi sa sukaranan. Ingon usa ka sangputanan, ang kahimtang nahimo nga ang pipila nga mga lamesa ug mga indeks sa pipila nga mga host halos wala gigamit, ug alang sa pag-analisar kinahanglan nimo nga mangolekta mga estadistika gikan sa tanan nga mga host sa cluster.
Kini nga pamaagi nagtugot kanamo sa pagluwas sa pipila ka napulo ka gigabytes pinaagi sa pagtangtang sa mga indeks nga wala gayud gigamit, ingon man usab sa pagdugang sa nawala nga mga indeks sa panagsa ra nga gigamit nga mga lamesa.
Isip usa ka konklusyon
Siyempre, alang sa halos tanan nga mga diagnostic nga imong ma-configure
Ang ubang mga diagnostic mahimong ipahigayon sa functional nga mga pagsulay diha-diha dayon human sa paglansad sa database migrations. Ug kini tingali usa sa labing kusgan nga bahin sa akong librarya. Ang usa ka pananglitan sa paggamit makita sa
Makataronganon ang paghimo sa mga tseke alang sa wala magamit o nawala nga mga indeks, ingon man usab alang sa bloat, sa tinuod nga database lamang. Ang nakolekta nga mga kantidad mahimong irekord sa
Naglaum gyud ko nga pg-index-panglawas mahimong mapuslanon ug gikinahanglan. Mahimo ka usab nga makatampo sa pag-uswag sa librarya pinaagi sa pagreport sa mga problema nga imong nakit-an ug pagsugyot og bag-ong mga diagnostic.
Source: www.habr.com