Lafiyar fihirisa a cikin PostgreSQL ta idanun mai haɓaka Java

Hi

Sunana Vanya kuma ni mai haɓaka Java ne. Ya faru da cewa ina aiki da yawa tare da PostgreSQL - kafa bayanai, inganta tsarin, aiki, da kuma kunna ɗan DBA a karshen mako.

Kwanan nan na gyara bayanai da yawa a cikin ƙananan ayyukanmu kuma na rubuta ɗakin karatu na java pg-index-lafiya, wanda ya sa wannan aikin ya fi sauƙi, yana adana lokaci kuma yana taimaka mini in guje wa wasu kurakurai na yau da kullum daga masu haɓakawa. Wannan dakin karatu ne za mu yi magana a kai a yau.

Lafiyar fihirisa a cikin PostgreSQL ta idanun mai haɓaka Java

Disclaimer

Babban sigar PostgreSQL da nake aiki dashi shine 10. Duk tambayoyin SQL da nake amfani da su ana gwada su akan sigar 11. Mafi ƙarancin sigar tallafi shine 9.6.

prehistory

Duk ya fara kusan shekara guda da suka gabata tare da yanayin da ya kasance baƙon abu a gare ni: gasa da ƙirƙirar ƙididdiga daga shuɗi ya ƙare tare da kuskure. Fihirisar kanta, kamar yadda ta saba, ta kasance a cikin ma'ajin bayanai a cikin mara inganci. Binciken log ɗin ya nuna ƙarancin temp_file_limit. Sai mu tafi... Ina zurfafa zurfafa, na gano ɗimbin matsaloli a cikin tsarin bayanai, na ɗaga hannuna, na fara gyara su da walƙiya a idanuna.

Matsala daya - tsoho tsari

Wataƙila kowa ya gaji da misalin game da Postgres, wanda za'a iya gudanar da shi a kan mai yin kofi, amma ... ƙayyadaddun ƙayyadaddun ƙayyadaddun gaske yana haifar da tambayoyi da yawa. Aƙalla, yana da daraja a kula da shi kiyaye_aiki_mem, temp_file_limit, sanarwa_lokaci и kulle_lokaci.

A wajenmu kiyaye_aiki_mem shi ne tsoho 64 MB, kuma temp_file_limit wani abu a kusa da 2 GB - ba mu da isasshen ƙwaƙwalwar ajiya don ƙirƙirar fihirisa akan babban tebur.

Saboda haka, in pg-index-lafiya Na tattara jerin abubuwa key, a ganina, sigogin da ya kamata a tsara su don kowane rumbun adana bayanai.

Matsala ta biyu - fihirisa kwafi

Takaddun bayanan mu suna rayuwa akan faifan SSD, kuma muna amfani da su HA-tsari tare da cibiyoyin bayanai da yawa, babban mai watsa shiri da n- adadin kwafi. Wurin diski abu ne mai matukar amfani a gare mu; ba shi da mahimmanci fiye da aiki da amfani da CPU. Don haka, a gefe guda, muna buƙatar fihirisa don karantawa da sauri, a gefe guda kuma, ba ma son ganin alamun da ba dole ba a cikin ma'ajin bayanai, tunda suna cinye sararin samaniya kuma suna raguwar sabunta bayanai.

Kuma yanzu, bayan mayar da komai fihirisa mara inganci da ganin isa rahoton Oleg Bartunov, Na yanke shawarar tsara "babban" tsarkakewa. Ya juya cewa masu haɓakawa ba sa son karanta takaddun bayanai. Ba sa son shi sosai. Saboda wannan, kurakurai guda biyu na yau da kullun suna tasowa - fihirisar da aka ƙirƙira da hannu akan maɓalli na farko da kuma maƙasudin “manual” makamancin haka akan ginshiƙi na musamman. Gaskiyar ita ce, ba a buƙatar su - Postgres zai yi duk abin da kanta. Ana iya share irin waɗannan firikwensin cikin aminci, kuma an bayyana bincike don wannan dalili kwafi_indexes.

Matsala ta uku - fihirisa masu shiga tsakani

Yawancin masu haɓaka novice suna ƙirƙirar fihirisa akan shafi ɗaya. Sannu a hankali, kasancewar sun sami wannan sana'a sosai, mutane sukan fara inganta tambayoyinsu kuma suna ƙara ƙarin hadaddun fihirisa waɗanda suka haɗa da ginshiƙai da yawa. Wannan shine yadda fihirisa a kan ginshiƙai ke bayyana A, A + B, A+B+C da sauransu. Biyu na farko na waɗannan fihirisa za a iya jefa su cikin aminci, tun da prefixes ne na na uku. Wannan kuma yana adana sararin diski mai yawa kuma akwai bincike don wannan intersected_indexes.

Matsala hudu - maɓallan ƙasashen waje ba tare da fihirisa ba

Postgres yana ba ku damar ƙirƙirar maɓalli na ƙasashen waje ba tare da ƙididdige fihirisar goyan baya ba. A yawancin yanayi wannan ba matsala ba ne, kuma yana iya yiwuwa ma ba zai iya bayyana kansa ba ... A halin yanzu ...

Haka yake tare da mu: kawai cewa a wani lokaci a wani lokaci wani aiki, yana gudana bisa ga jadawalin da kuma share bayanan umarni na gwaji, ya fara "ƙara" mana da mai masaukin baki. CPU da IO sun tafi ɓata, buƙatun sun ragu kuma sun ƙare, sabis ɗin ya kasance ɗari biyar. Bincike mai sauri pg_stat_aiki ya nuna tambayoyi kamar:

delete from <table> where id in (…)

A wannan yanayin, ba shakka, akwai fihirisa ta id a cikin tebur ɗin da aka yi niyya, kuma kaɗan ne aka share bayanan bisa ga yanayin. Ya zama kamar duk abin da ya kamata ya yi aiki, amma, alas, bai yi ba.

Abin mamaki ya zo don ceto bayyana nazari kuma ya ce baya ga goge bayanan da ke cikin tebur ɗin da aka yi niyya, akwai kuma tantance ingancin tantancewa, kuma a ɗaya daga cikin teburan da ke da alaƙa wannan cak ɗin ya gaza. duban bi-biyu saboda rashin maƙasudin da ya dace. Ta haka aka haifi bincike maɓallan_waje_ba tare da_index.

Matsala biyar – ƙima maras kyau a cikin fihirisa

Ta hanyar tsoho, Postgres ya haɗa da ƙima mara kyau a cikin fihirisar btree, amma yawanci ba a buƙatar su a can. Don haka, na yi ƙoƙari na yi ƙoƙari na jefar da waɗannan nulls (diagnostics indexes_with_null_values), Ƙirƙirar fihirisa juzu'i akan ginshiƙan da ba za a iya warware su ta nau'in ba where <A> is not null. Ta haka ne na sami damar rage girman daya daga cikin fihirisar mu daga 1877 MB zuwa 16 KB. Kuma a cikin ɗayan sabis ɗin, girman bayanan ya ragu a cikin duka da 16% (ta 4.3 GB a cikakkiyar lambobi) saboda keɓance ƙimar mara amfani daga ma'auni. Babban tanadi a cikin sararin faifai tare da sauƙaƙan gyare-gyare. 🙂

Matsala shida - rashin maɓalli na farko

Saboda yanayin tsarin MVCC in Postgres yanayi irin wannan yana yiwuwa kumburalokacin da girman teburin ku ke girma da sauri saboda yawan adadin matattu. Na yi imani da cewa wannan ba zai yi mana barazana ba, kuma hakan ba zai faru da tushenmu ba, saboda mu, wow!!!, masu haɓakawa ne na yau da kullun… Yaya wawa da butulci nake…

Wata rana, ƙaura ɗaya mai ban mamaki ta ɗauki kuma ta sabunta duk bayanan a cikin babban tebur da aka yi amfani da shi sosai. Mun sami +100 GB zuwa girman tebur daga shuɗi. Abin kunya ne, amma mugunyar mu ba ta kare a nan ba. Bayan autovacuum akan wannan tebur ya ƙare sa'o'i 15 bayan haka, ya bayyana a fili cewa wurin jiki ba zai dawo ba. Ba za mu iya dakatar da sabis ɗin ba kuma mu sanya VACUUM FULL, don haka mun yanke shawarar yin amfani da shi pg_repack. Sai kuma ya zama haka pg_repack bai san yadda ake sarrafa tebur ba tare da maɓalli na farko ba ko wasu ƙuntatawa na musamman, kuma teburin mu ba shi da maɓalli na farko. Ta haka aka haifi bincike tebur_ba tare da_key_primary_key.

A cikin sigar ɗakin karatu 0.1.5 An ƙara ikon tattara bayanai daga ɓarna na tebur da fihirisa da kuma ba da amsa a kan lokaci.

Matsaloli bakwai da takwas - rashin isassun fihirisa da fihirisar da ba a yi amfani da su ba

Abubuwa biyu masu zuwa sune: Tables_tare da_rasa_indexes и rashin amfani_indexes – sun bayyana a cikin su na ƙarshe kwanan nan. Maganar ita ce ba za a iya ɗaukar su kawai a ƙara su ba.

Kamar yadda na riga na rubuta, muna amfani da tsari tare da kwafi da yawa, kuma nauyin karatu akan runduna daban-daban ya bambanta. A sakamakon haka, yanayin ya zama cewa ba a amfani da wasu teburi da fihirisa akan wasu runduna a zahiri, kuma don bincike kuna buƙatar tattara ƙididdiga daga duk rundunonin da ke cikin gungu. Sake saitin kididdiga Wannan kuma ya zama dole akan kowane mai masaukin baki a cikin gungu; ba za ku iya yin wannan akan maigida kawai ba.

Wannan hanya ta ba mu damar adana dubun gigabytes da yawa ta hanyar cire fihirisa da ba a taɓa amfani da su ba, da kuma ƙara maƙasudin da ba a taɓa amfani da su ba zuwa teburan da ba a cika amfani da su ba.

A matsayin ƙarshe

Tabbas, don kusan dukkanin bincike za ku iya saitawa jerin wariya. Ta wannan hanyar, zaku iya aiwatar da bincike cikin sauri a cikin aikace-aikacenku, hana sabbin kurakurai daga bayyana, sannan a hankali gyara tsoffin.

Ana iya yin wasu bincike a cikin gwaje-gwajen aiki nan da nan bayan ƙaddamar da ƙaura na bayanai. Kuma wannan shi ne watakila daya daga cikin mafi ƙarfi fasali na laburare. Ana iya samun misalin amfani a ciki demo.

Yana da ma'ana don yin cak don ƙididdiga marasa amfani ko ɓacewa, da kuma kumburi, kawai akan ainihin bayanan bayanai. Ana iya yin rikodin ƙimar da aka tattara a ciki DannaHause ko aika zuwa tsarin kulawa.

Ina fatan hakan pg-index-lafiya zai zama da amfani kuma a cikin buƙata. Hakanan kuna iya ba da gudummawa ga haɓaka ɗakin karatu ta hanyar ba da rahoton matsalolin da kuka samu da ba da shawarar sabbin bincike.

source: www.habr.com

Add a comment