Ћао
Моје име је Вања и ја сам Јава програмер. Десило се да доста радим са ПостгреСКЛ-ом - постављам базу података, оптимизујем структуру, перформансе и играм мало ДБА викендом.
Недавно сам средио неколико база података у нашим микросервисима и написао јава библиотеку
Одрицање од одговорности
Главна верзија ПостгреСКЛ-а са којом радим је 10. Сви СКЛ упити које користим су такође тестирани на верзији 11. Минимална подржана верзија је 9.6.
praistorija
Све је почело пре скоро годину дана са ситуацијом која ми је била чудна: такмичарско креирање индекса из ведра неба се завршило грешком. Сам индекс је, као и обично, остао у бази података у неисправном стању. Анализа дневника је показала недостатак
Први проблем - подразумевана конфигурација
Вероватно су сви прилично уморни од метафоре о Постгресу, који се може покренути на апарату за кафу, али... подразумевана конфигурација заиста поставља бројна питања. У најмању руку, вреди обратити пажњу одржавање_рад_мем, темп_филе_лимит, статемент_тимеоут и лоцк_тимеоут.
У нашем случају одржавање_рад_мем била је подразумевана 64 МБ, и темп_филе_лимит нешто око 2 ГБ – једноставно нисмо имали довољно меморије да направимо индекс на великој табели.
Стога, у пг-индекс-здравље Сакупио сам серију
Проблем два - дупли индекси
Наше базе података живе на ССД дисковима и користимо их HA-конфигурација са више центара података, главни хост и n-број реплика. Простор на диску је веома вредан ресурс за нас; није ништа мање важно од перформанси и потрошње ЦПУ-а. Дакле, с једне стране су нам потребни индекси за брзо читање, а са друге стране, не желимо да видимо непотребне индексе у бази података, јер једу простор и успоравају ажурирање података.
А сада, обновивши све
Задатак трећи - индекси који се секу
Већина програмера почетника креира индексе на једној колони. Постепено, након што су темељно искусили овај посао, људи почињу да оптимизују своје упите и додају сложеније индексе који укључују неколико колона. Овако се појављују индекси на колонама A, А + Б, А+Б+Ц и тако даље. Прва два од ових индекса могу се безбедно избацити, јер су префикси трећег. Ово такође штеди много простора на диску и постоји дијагностика за ово
Проблем четврти - страни кључеви без индекса
Постгрес вам омогућава да креирате ограничења страног кључа без навођења индекса подршке. У многим ситуацијама то није проблем, а можда се и не манифестује... За сада...
Исто је било и са нама: само што је у неком тренутку главни хост почео да нам „додаје“ посао који се одвија по распореду и брише базу података тестних налога. ЦПУ и ИО су пропали, захтеви су успорени и истекли су, услуга је била пет стотина. Брза анализа
delete from <table> where id in (…)
У овом случају, наравно, постојао је индекс по ИД-у у циљној табели и врло мало записа је обрисано у складу са условом. Чинило се да би све требало да функционише, али, нажалост, није.
Чудесни је притекао у помоћ објаснити анализирати и рекао да поред брисања записа у циљној табели постоји и провера референтног интегритета, а на једној од повезаних табела ова провера не успе секвенцијално скенирање због недостатка одговарајућег индекса. Тако је рођена дијагностика
Проблем пети – нулта вредност у индексима
Постгрес подразумевано укључује нулте вредности у бтрее индексе, али тамо обично нису потребне. Стога, марљиво покушавам да избацим ове нуле (дијагностика where <A> is not null
. На овај начин сам успео да смањим величину једног од наших индекса са 1877 МБ на 16 КБ. А у једној од услуга, величина базе података је смањена укупно за 16% (за 4.3 ГБ у апсолутним бројевима) због искључивања нул вредности из индекса. Огромна уштеда на диску са врло једноставним модификацијама. 🙂
Шести проблем – недостатак примарних кључева
Због природе механизма
Једног дана, једна дивна миграција је узела и ажурирала све записе у великој и активно коришћеној табели. Добили смо +100 ГБ до величине табеле из ведра неба. Била је то проклета срамота, али нашим незгодама није био крај. Након што се аутовакум на овом столу завршио 15 сати касније, постало је јасно да се физичка локација неће вратити. Нисмо могли да зауставимо услугу и направимо ВАЦУУМ ФУЛЛ, па смо одлучили да користимо
У библиотечкој верзији 0.1.5 Додата је могућност прикупљања података из надувености табела и индекса и благовременог реаговања на њих.
Задаци седми и осми - недовољни индекси и неискоришћени индекси
Следеће две дијагностике су:
Као што сам већ написао, користимо конфигурацију са неколико реплика, а оптерећење читања на различитим хостовима је фундаментално различито. Као резултат тога, испоставља се да се неке табеле и индекси на неким хостовима практично не користе, а за анализу морате прикупити статистику са свих хостова у кластеру.
Овај приступ нам је омогућио да уштедимо неколико десетина гигабајта уклањањем индекса који никада нису коришћени, као и додавањем индекса који недостају у ретко коришћене табеле.
Као закључак
Наравно, за скоро сву дијагностику можете конфигурисати
Нека дијагностика се може извршити у функционалним тестовима одмах након увођења миграција базе података. А ово је можда једна од најмоћнијих карактеристика моје библиотеке. Пример употребе може се наћи у
Има смисла вршити провере за неискоришћене или недостајуће индексе, као и за надувавање, само на правој бази података. Прикупљене вредности се могу забележити у
Заиста се томе надам пг-индекс-здравље биће корисно и тражено. Такође можете допринети развоју библиотеке тако што ћете пријавити проблеме које пронађете и предложити нову дијагностику.
Извор: ввв.хабр.цом