Саломатии индексҳо дар PostgreSQL аз нигоҳи як таҳиягари Java

Салом.

Номи ман Ваня ва ман таҳиягари Java ҳастам. Чунин мешавад, ки ман бо PostgreSQL бисёр кор мекунам - таъсиси пойгоҳи додаҳо, оптимизатсияи сохтор, иҷроиш ва дар рӯзҳои истироҳат каме DBA бозӣ мекунам.

Ба наздикӣ ман якчанд пойгоҳи додаҳоро дар микросервисҳои худ тартиб додам ва китобхонаи java навиштам pg-index-тандурустӣ, ки ин корро осон мекунад, вақтро сарфа мекунад ва ба ман кӯмак мекунад, ки аз хатогиҳои маъмули таҳиягарон канорагирӣ кунам. Маҳз ҳамин китобхона аст, ки мо имрӯз дар бораи он сӯҳбат хоҳем кард.

Саломатии индексҳо дар PostgreSQL аз нигоҳи як таҳиягари Java

Радди

Версияи асосии PostgreSQL, ки ман бо он кор мекунам, 10 аст. Ҳама дархостҳои SQL, ки ман истифода мебарам, инчунин дар версияи 11 санҷида мешаванд. Версияи ҳадди ақали дастгирӣ 9.6 аст.

prehistory

Ҳамааш тақрибан як сол пеш аз як вазъияте оғоз ёфт, ки барои ман аҷиб буд: эҷоди рақобати индекси ғайриоддӣ бо хатогӣ анҷом ёфт. Худи индекс, чун маъмул, дар базаи маълумот дар ҳолати беэътибор монд. Таҳлили гузоришҳо камбудиҳоро нишон дод temp_file_limit. Ва мо меравем... Амиқтар кофта, ман як қатор мушкилотро дар конфигуратсияи пойгоҳи додаҳо кашф кардам ва остинҳоямро печонда, бо дурахши чашмонам онҳоро ислоҳ кардам.

Мушкилоти як - конфигуратсияи пешфарз

Эҳтимол ҳама аз метафора дар бораи Postgres хеле хаста шудаанд, ки онро дар қаҳвапаз кор кардан мумкин аст, аммо ... конфигуратсияи пешфарз воқеан як қатор саволҳоро ба миён меорад. Дар ҳадди аққал, ба он диққат додан лозим аст нигоҳдории_кори_мем, temp_file_limit, изҳорот_вахт и lock_timeout.

Дар мавриди мо нигоҳдории_кори_мем пешфарз шуд 64 MB, ва temp_file_limit чизе тақрибан 2 ГБ - мо танҳо хотираи кофӣ надоштем, то дар ҷадвали калон индекс эҷод кунем.

Бинобар ин, дар pg-index-тандурустӣ Ман як силсила ҷамъоварӣ кардам калид, ба андешаи ман, параметрҳое, ки бояд барои ҳар як пойгоҳи додаҳо танзим карда шаванд.

Масъалаи дуюм - индексҳои такрорӣ

Пойгоҳи додаҳои мо дар дискҳои SSD зиндагӣ мекунанд ва мо истифода мебарем HA-конфигуратсия бо якчанд марказҳои додаҳо, мизбони усто ва n- шумораи нусхаҳо. Фазои диск барои мо манбаи хеле арзишманд аст; он на камтар аз иҷрои ва истеъмоли CPU муҳим аст. Аз ин рӯ, аз як тараф, ба мо индексҳо барои хондани зуд ниёз доранд ва аз тарафи дигар, мо намехоҳем индексҳои нолозимро дар пойгоҳи додаҳо бинем, зеро онҳо ҷойро мехӯранд ва навсозии маълумотро суст мекунанд.

Ва ҳоло, ки ҳама чизро барқарор кард индексҳои беэътибор ва дидани кофӣ хабар медихад Олег Бартунов, Карор додам, ки тозакунии «бузург» ташкил кунам. Маълум шуд, ки таҳиягарон хондани ҳуҷҷатҳои пойгоҳи додаҳоро дӯст намедоранд. Онҳо онро хеле дӯст намедоранд. Аз ин сабаб, ду хатои маъмулӣ ба вуҷуд меояд - шохиси дастӣ дар калиди ибтидоӣ ва индекси шабеҳи "дастӣ" дар сутуни беназир. Гап дар он аст, ки онҳо лозим нестанд - Postgres ҳама чизро худаш мекунад. Чунин нишондиҳандаҳоро метавон бехатар нест кард ва бо ин мақсад ташхисҳо пайдо шуданд индексҳои такрорӣ.

Масъалаи сеюм - индексҳои буриш

Аксари таҳиягарони навкор индексҳоро дар як сутун эҷод мекунанд. Оҳиста-оҳиста, пас аз таҷриба кардани ин тиҷорат, одамон ба оптимизатсия кардани дархостҳои худ шурӯъ мекунанд ва индексҳои мураккабтареро, ки якчанд сутунро дар бар мегиранд, илова мекунанд. Индексҳо дар сутунҳо ҳамин тавр пайдо мешаванд A, A + B, A+B+C ва ғайра. Ду аввали ин индексҳоро метавон бехатар хориҷ кард, зеро онҳо префикси сеюм мебошанд. Ин инчунин фазои зиёди дискро сарфа мекунад ва барои ин ташхис вуҷуд дорад шохиси буридашуда.

Масъалаи чорум - калидҳои хориҷӣ бе индекс

Postgres ба шумо имкон медиҳад, ки маҳдудиятҳои калиди хориҷиро бидуни муайян кардани индекси пуштибонӣ эҷод кунед. Дар бисёр ҳолатҳо ин мушкилот нест ва ҳатто метавонад худро зоҳир накунад... Дар ҳоли ҳозир...

Бо мо низ ҳамин тавр буд: танҳо дар як вақт коре, ки мувофиқи ҷадвал кор мекунад ва базаи фармоишҳои санҷиширо тоза мекунад, аз ҷониби мизбон ба мо "илова карда" шуд. CPU ва IO барбод рафтанд, дархостҳо суст шуданд ва мӯҳлаташон гузашт, хидмат панҷсад буд. Таҳлили зуд pg_stat_activity нишон дод, ки пурсишҳо чунинанд:

delete from <table> where id in (…)

Дар ин ҳолат, албатта, дар ҷадвали ҳадаф индекс аз рӯи id мавҷуд буд ва аз рӯи шарт хеле кам сабтҳо нест карда шуданд. Чунин менамуд, ки ҳама чиз бояд кор кунад, аммо афсӯс, ки ин тавр нашуд.

Аҷиб ба наҷот омад таҳлил фаҳмонед ва гуфт, ки ба ғайр аз нест кардани сабтҳо дар ҷадвали мавриди ҳадаф, боз як санҷиши якпорчагии истинод вуҷуд дорад ва дар яке аз ҷадвалҳои алоқаманд ин санҷиш ноком мешавад. скани пайдарпай аз сабаби набудани индекси мувофик. Ҳамин тариқ, ташхис ба вуҷуд омад калидҳои_хориҷӣ бидуни_индекс.

Масъалаи панҷум – арзиши нул дар индексҳо

Бо нобаёнӣ, Postgres арзишҳои нулро дар индексҳои btree дар бар мегирад, аммо онҳо одатан дар он ҷо лозим нестанд. Аз ин рӯ, ман кӯшиш мекунам, ки ин нулҳоро (диагностика индексҳо бо арзишҳои_null), эҷод кардани шохисҳои қисман дар сутунҳои ночиз аз рӯи намуд where <A> is not null. Бо ин роҳ ман тавонистам андозаи як индекси моро аз 1877 МБ то 16 КБ кам кунам. Ва дар яке аз хидматҳо, андозаи пойгоҳи додаҳо дар маҷмӯъ 16% (бо рақамҳои мутлақ 4.3 ГБ) аз ҳисоби хориҷ кардани арзишҳои нул аз индексҳо коҳиш ёфт. Пасандозҳои бузург дар фазои диск бо тағиротҳои хеле оддӣ. 🙂

Мушкилоти шашум - набудани калидҳои ибтидоӣ

Аз сабаби хусусияти механизм MVCC дар Postgres чунин вазъият имконпазир аст варам карданвақте ки андозаи ҷадвали шумо аз ҳисоби шумораи зиёди сабтҳои мурда босуръат меафзояд. Ман соддалавхона бовар доштам, ки ин ба мо тахдид намекунад ва ба базаи мо ин кор намеояд, зеро мо, вой!!!, тахиягарони мукаррари хастем... Чи кадар аблах ва соддалавхона будам...

Як рӯз, як муҳоҷирати олиҷаноб тамоми сабтҳоро дар ҷадвали калон ва фаъол истифода бурд ва навсозӣ кард. Мо ба андозаи ҷадвал +100 ГБ гирифтем. Ин хеле шармовар буд, аммо нохушиҳои мо бо ин тамом нашуданд. Пас аз он ки автовакуум дар ин миз пас аз 15 соат ба охир расид, маълум шуд, ки ҷойгиршавии физикӣ барнагардад. Мо наметавонистем хидматро боздорем ва ВАКУУМро пур кунем, бинобар ин мо тасмим гирифтем, ки истифода барем pg_repack. Ва баъд маълум шуд, ки pg_repack намедонад, ки чӣ тавр коркарди ҷадвалҳоро бидуни калиди ибтидоӣ ё дигар маҳдудиятҳои беназирӣ ва ҷадвали мо калиди ибтидоӣ надошт. Ҳамин тариқ, ташхис ба вуҷуд омад ҷадвалҳои_бе_калиди ибтидоӣ.

Дар нусхаи китобхона 0.1.5 Имконияти ҷамъоварии маълумот аз ҷадвалҳо ва индексҳо ва посух додан ба он сари вақт илова карда шудааст.

Масъалаҳои ҳафт ва ҳаштум - нишондиҳандаҳои нокифоя ва нишондиҳандаҳои истифоданашуда

Ду ташхиси зерин инҳоянд: ҷадвалҳо бо индексҳои гумшуда и индексҳои истифоданашуда - дар шакли ниҳоии онҳо нисбатан ба наздикӣ пайдо шуданд. Гап дар сари он аст, ки онҳоро танҳо гирифта ва илова кардан мумкин нест.

Тавре ки ман аллакай навишта будам, мо конфигуратсияро бо якчанд нусхабардорӣ истифода мебарем ва сарбории хониш дар ҳостҳои гуногун комилан фарқ мекунад. Дар натиҷа, вазъият маълум мешавад, ки баъзе ҷадвалҳо ва индексҳо дар баъзе ҳостҳо амалан истифода намешаванд ва барои таҳлил шумо бояд омори ҳама хостҳои кластерро ҷамъ кунед. Барқарор кардани омор Ин инчунин барои ҳар як хости кластер зарур аст; шумо инро танҳо дар устод карда наметавонед.

Ин равиш ба мо имкон дод, ки тавассути нест кардани индексҳои ҳеҷ гоҳ истифоданашуда, инчунин илова кардани индексҳои гумшуда ба ҷадвалҳои кам истифодашаванда якчанд даҳҳо гигабайтро сарфа кунем.

Хулоса

Албатта, барои қариб ҳама ташхис шумо метавонед танзим кунед рӯйхати истисноӣ. Бо ин роҳ, шумо метавонед дар аризаи худ зуд санҷишҳоро иҷро кунед, аз пайдо шудани хатогиҳои нав пешгирӣ кунед ва сипас оҳиста-оҳиста хатогиҳои кӯҳнаро ислоҳ кунед.

Баъзе ташхисҳоро метавон дар озмоишҳои функсионалӣ фавран пас аз интиқоли интиқоли пойгоҳи додаҳо анҷом дод. Ва ин шояд яке аз хусусиятҳои пурқуввати китобхонаи ман бошад. Намунаи истифодаро дар он пайдо кардан мумкин аст намоишӣ.

Тафтиши индексҳои истифоданашуда ё гумшуда, инчунин барои bloat, танҳо дар пойгоҳи додаҳои воқеӣ маъно дорад. Қиматҳои ҷамъшударо метавон дар қайд кард кликхона ё ба системаи мониторинг фиристода мешавад.

Ман дар ҳақиқат умедворам pg-index-тандурустӣ муфид ва серталаб хоҳад буд. Шумо инчунин метавонед тавассути гузориш додани мушкилоти пайдошуда ва пешниҳоди ташхиси нав дар рушди китобхона саҳм гузоред.

Манбаъ: will.com

Илова Эзоҳ