Жалқаулар үшін жаңарту: PostgreSQL 12 өнімділікті қалай жақсартады

Жалқаулар үшін жаңарту: PostgreSQL 12 өнімділікті қалай жақсартады

PostgreSQL 12, «әлемдегі ең жақсы ашық бастапқы реляциялық дерекқордың» соңғы нұсқасы екі аптадан кейін шығады (егер бәрі жоспарға сәйкес болса). Бұл жылына бір рет тонна жаңа мүмкіндіктері бар жаңа нұсқаны шығарудың әдеттегі кестесіне сәйкес келеді және шынын айтқанда, бұл әсерлі. Сондықтан мен PostgreSQL қауымдастығының белсенді мүшесі болдым.

Менің ойымша, алдыңғы шығарылымдардан айырмашылығы, PostgreSQL 12 бір немесе екі революциялық мүмкіндіктерді (бөлу немесе сұрау параллелизмі сияқты) қамтымайды. Мен бір кездері PostgreSQL 12 негізгі ерекшелігі - үлкен тұрақтылық деп әзілдеген едім. Бұл сіздің бизнесіңіздің маңызды деректерін басқарған кезде қажет емес пе?

Бірақ PostgreSQL 12 мұнымен тоқтап қалмайды: жаңа мүмкіндіктер мен жақсартулармен қолданбалар жақсырақ жұмыс істейді, және сізге тек жаңарту қажет!

(Мүмкін, индекстерді қайта құру керек, бірақ бұл шығарылымда бұл біз үйреніп кеткендей қорқынышты емес.)

PostgreSQL-ті жаңартып, қажетсіз әбігерсіз бірден маңызды жақсартулардан ләззат алу тамаша болады. Бірнеше жыл бұрын мен PostgreSQL 9.4 нұсқасынан PostgreSQL 10 нұсқасына дейін жаңартуды қарап шықтым және PostgreSQL 10 жүйесіндегі жақсартылған сұрау параллелизмінің арқасында қолданбаның қалай жылдам жұмыс істейтінін көрдім. Ең бастысы, менен ештеңе талап етілмеді (тек конфигурация параметрін орнатыңыз). max_parallel_workers).

Келісіңіз, қолданбалар жаңартудан кейін бірден жақсы жұмыс істегенде ыңғайлы. Біз пайдаланушыларды қуантуға тырысамыз, өйткені PostgreSQL-де олардың саны артып келеді.

PostgreSQL 12-ге қарапайым жаңарту сізді қалай қуантады? Мен қазір айтамын.

Негізгі индекстеу жақсартулары

Индекстеусіз деректер базасы алысқа бармайды. Басқа қалай ақпаратты тез табуға болады? PostgreSQL негізгі индекстеу жүйесі деп аталады В-ағаш. Бұл индекс түрі сақтау жүйелері үшін оңтайландырылған.

Біз жай ғана операторды қолданамыз CREATE INDEX ON some_table (some_column), және PostgreSQL индексті үнемі жаңартып отыру үшін көп жұмыс жасайды, ал біз мәндерді үнемі енгізіп, жаңартып және жоямыз. Барлығы сиқырлы сияқты өздігінен жұмыс істейді.

Бірақ PostgreSQL индекстерінің бір проблемасы бар - олар үрленеді және қосымша дискілік орынды алып, деректерді іздеу мен жаңарту өнімділігін төмендетеді. «Bloat» демекші, индекс құрылымын тиімсіз сақтау. Бұл жойылатын қоқыс қоршауларына қатысты болуы мүмкін немесе болмауы мүмкін VACUUM (ақпарат үшін Питер Гаганға рахмет)Питер Геоггеган)). Индекстің кебуі әсіресе индекс белсенді өзгеретін жұмыс жүктемелерінде байқалады.

PostgreSQL 12 B-ағаш индекстерінің өнімділігін айтарлықтай жақсартады және TPC-C сияқты эталондармен жүргізілген тәжірибелер қазір орта есеппен 40% аз кеңістік пайдаланылатынын көрсетті. Енді біз B-ағаш индекстерін сақтауға ғана емес (яғни жазу операцияларына), сонымен қатар деректерді алуға да аз уақыт жұмсаймыз, өйткені индекстер әлдеқайда аз.

Кестелерін белсенді түрде жаңартатын қолданбалар – әдетте OLTP қолданбалары (нақты уақыттағы транзакцияны өңдеу) - дискіні пайдаланады және сұраныстарды әлдеқайда тиімдірек өңдейді. Дискідегі кеңістік неғұрлым көп болса, инфрақұрылымды жаңартпастан деректер қорының кеңістігі кеңейеді.

Кейбір жаңарту стратегиялары осы артықшылықтарды пайдалану үшін B-ағаш индекстерін қайта құруды талап етеді (мысалы, pg_upgrade индекстерді автоматты түрде қайта жасамайды). PostgreSQL-тің алдыңғы нұсқаларында кестелердегі үлкен индекстерді қайта құру айтарлықтай тоқтап қалуға әкелді, себебі бұл уақытта өзгертулер енгізу мүмкін болмады. Бірақ PostgreSQL 12-де тағы бір керемет мүмкіндік бар: енді индекстерді пәрменмен параллель түрде қайта құруға болады. БІРГЕ ҚАЙТА КӨРСЕТУтоқтап қалуды толығымен болдырмау үшін.

PostgreSQL 12-де индекстеу инфрақұрылымының басқа да жақсартулары бар. Сиқыр болған тағы бір нәрсе - алдын ала жазу журналы, aka WAL (алдын ала жазу журналы). Алдын ала жазу журналы сәтсіздік және репликация жағдайында PostgreSQL жүйесіндегі әрбір транзакцияны жазады. Қолданбалар оны мұрағаттау үшін пайдаланады және уақытында қалпына келтіру. Әрине, алдын ала жазу журналы дискіге жазылады, бұл өнімділікке әсер етуі мүмкін.

PostgreSQL 12 индексті құру кезінде GiST, GIN және SP-GiST индекстері арқылы жасалған WAL жазбаларының үстеме шығындарын азайтты. Бұл бірнеше нақты артықшылықтар береді: WAL жазбалары дискіде аз орын алады және апатты қалпына келтіру немесе бір уақытта қалпына келтіру сияқты деректер жылдамырақ ойнатылады. Егер сіз қолданбаларыңызда осындай индекстерді қолдансаңыз (мысалы, PostGIS негізіндегі геокеңістіктік қолданбалар GiST индексін көп пайдаланады), бұл сіздің тарапыңыздан ешқандай күш жұмсамай-ақ тәжірибені айтарлықтай жақсартатын тағы бір мүмкіндік.

Бөлу - үлкенірек, жақсырақ, жылдамырақ

PostgreSQL 10 енгізілді декларативті бөлу. PostgreSQL 11-де оны пайдалану әлдеқайда жеңіл болды. PostgreSQL 12-де бөлімдердің масштабын өзгертуге болады.

PostgreSQL 12-де бөлу жүйесінің өнімділігі айтарлықтай жақсарды, әсіресе кестеде мыңдаған бөлімдер болса. Мысалы, егер сұрау мыңдаған кестедегі бірнеше бөлімдерге ғана әсер етсе, ол әлдеқайда жылдам орындалады. Өнімділік тек сұраулардың осы түрлері үшін жақсартылған жоқ. Сондай-ақ, бірнеше бөлімдері бар кестелерде INSERT әрекеттерінің қаншалықты жылдам екенін байқайсыз.

Қолдану арқылы деректерді жазу COPY - Айтпақшы, бұл тамаша жол деректерді жаппай жүктеу және міне мысал JSON қабылдау — PostgreSQL 12-де бөлінген кестелер де тиімдірек болды. COPY көмегімен бәрі жылдам болды, бірақ PostgreSQL 12-де ол мүлдем ұшады.

Осы артықшылықтардың арқасында PostgreSQL одан да үлкен деректер жиынын сақтауға және оларды алуды жеңілдетуге мүмкіндік береді. Және сіздің тарапыңыздан ешқандай күш-жігер жоқ. Қолданбада уақыт қатарының деректерін жазу сияқты көптеген бөлімдер болса, қарапайым жаңарту оның жұмысын айтарлықтай жақсартады.

Бұл дәл «жаңарту және ләззат алу» жақсартуы болмаса да, PostgreSQL 12 бөлімге бөлінген кестелерге сілтеме жасайтын сыртқы кілттерді жасауға мүмкіндік береді, бұл бөлімді жұмыс істеуге ләззат етеді.

WITH сұраулары әлдеқайда жақсырақ болды

Қашан патч кірістірілген жалпы кесте өрнектері үшін қолданылды (CTE, aka WITH сұраулары) туралы мақала жазуды күте алмадым PostgreSQL қолданбасын әзірлеушілер қаншалықты бақытты болды. Бұл қолданбаны жылдамдататын мүмкіндіктердің бірі. Әрине, сіз CTE қолданбасаңыз.

Мен көбінесе SQL-ге жаңадан келгендер CTE-ді қолдануды ұнататынын байқаймын; егер сіз оларды белгілі бір жолмен жазсаңыз, сіз шынымен императивті бағдарлама жазып жатқандай сезінесіз. Өз басым осы сұрауларды айналып өту үшін қайта жазғанды ​​ұнататынмын жоқ CTE және өнімділікті арттыру. Қазір бәрі басқаша.

PostgreSQL 12 жанама әсерлерсіз белгілі бір CTE түрін енгізуге мүмкіндік береді (SELECT), ол сұраудың соңына жақын бір рет ғана пайдаланылады. Егер мен қайта жазған CTE сұрауларын қадағалайтын болсам, олардың көпшілігі осы санатқа жатады. Бұл әзірлеушілерге анық код жазуға көмектеседі, ол қазір де жылдам жұмыс істейді.

Сонымен қатар, PostgreSQL 12 сізге ештеңе жасамай-ақ SQL орындалуын оңтайландырады. Маған қазір мұндай сұрауларды оңтайландырудың қажеті жоқ шығар, бірақ PostgreSQL сұранысты оңтайландыру бойынша жұмысын жалғастырғаны өте жақсы.

Дәл уақытында (JIT) - қазір әдепкі

Қолдауы бар PostgreSQL 12 жүйелерінде LLVM JIT компиляциясы әдепкі бойынша қосылады. Ең алдымен сізге қолдау көрсетіледі JIT кейбір ішкі операциялар үшін, екіншіден, таңдау тізімдеріндегі өрнектері бар сұраулар (ең қарапайым мысал x + y), агрегаттар, WHERE сөйлемдері бар өрнектер және басқалар өнімділікті жақсарту үшін JIT пайдалана алады.

PostgreSQL 12 жүйесінде JIT әдепкі бойынша қосылғандықтан, өнімділік өздігінен жақсарады, бірақ сұрау өнімділігін өлшеу және кез келген нәрсені реттеу қажет пе екенін білу үшін JIT енгізілген PostgreSQL 11 қолданбасын сынауды ұсынамын.

PostgreSQL 12-дегі қалған жаңа мүмкіндіктер туралы не деуге болады?

PostgreSQL 12 стандартты SQL/JSON маршрут өрнектерін пайдаланып JSON деректерін тексеру мүмкіндігінен параметрі бар көп факторлы аутентификацияға дейін көптеген керемет жаңа мүмкіндіктерге ие. clientcert=verify-full, жасалған бағандар және т.б. Бөлек пост үшін жеткілікті.

PostgreSQL 10 сияқты, PostgreSQL 12 жаңартудан кейін бірден жалпы өнімділікті жақсартады. Сізде, әрине, өз жолыңыз болуы мүмкін - жақсартуларды қоспас бұрын, мен PostgreSQL 10-да жасағандай қолданбаны ұқсас жағдайларда өндірістік жүйеде сынап көріңіз. PostgreSQL 12 мен күткеннен де тұрақтырақ болса да, тестілеуде жалқау болмаңыз. қолданбаларды өндіріске жібермес бұрын мұқият.

Ақпарат көзі: www.habr.com

пікір қалдыру