Monitorings

Lēni PostgreSQL vaicājumi: praktisks optimizācijas kontrolsaraksts

Pirms pērkat jaudīgāku serveri, izejiet cauri šim sarakstam. Lielākā daļa lēno PostgreSQL datubāzu ir lēnas to pašu dažu iemeslu dēļ — un gandrīz visus var novērst bez jaunas aparatūras.

· 8 min lasīšanai · AG Data komanda

Kad PostgreSQL datubāze kļūst lēna, pirmā doma parasti ir palielināt resursus: vairāk CPU, vairāk atmiņas, lielāka instance. Dažreiz tas ir pareizais lēmums. Daudz biežāk datubāze lielāko daļu laika tērē nelielam skaitam vaicājumu, kurus var padarīt krietni lētākus — un jaudīgāks serveris tikai padara to pašu izšķērdību dārgāku.

Šis ir kontrolsaraksts, ko izejam veiktspējas projektos, aptuveni šādā secībā. Tas sakārtots pēc tā, cik bieži katrs solis izrādās īstā problēma, nevis pēc tā, cik tas ir interesants.

1. Atrodiet vaicājumus, kas patiešām patērē laiku

Nesāciet ar vaicājumu, par kuru kāds sūdzējās. Sāciet ar to, kur datubāze kopumā pavada laiku. Paplašinājums pg_stat_statements apkopo izpildes statistiku katram normalizētam vaicājumam. Pievienojiet to shared_preload_libraries, izpildiet CREATE EXTENSION pg_stat_statements un kārtojiet pēc kopējā laika:

SELECT query, calls, total_exec_time, mean_exec_time, rows
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 20;

Saraksta augšgalā parādās divas ļoti atšķirīgas problēmas. Vaicājumam, kas izpildās 4 ms, bet tiek izsaukts 30 miljonus reižu dienā, vajag citu risinājumu nekā 40 sekunžu atskaitei, kas tiek palaista divreiz. total_exec_time parāda, kuri vaicājumi ir svarīgi; mean_exec_time un calls — kāda veida problēma jums ir.

2. Lasiet izpildes plānu ar reāliem skaitļiem

Katram dārgajam vaicājumam izpildiet EXPLAIN (ANALYZE, BUFFERS) uz reālistiskas datu kopijas — nekad uz gandrīz tukšas testa datubāzes, kur katrs plāns izskatās ātrs. Atcerieties, ka ANALYZE vaicājumu tiešām izpilda, tāpēc rakstīšanas operācijas ietiniet transakcijā un atceliet to. Meklējiet:

3. Sakārtojiet indeksus — arī tos, kuru nevajadzētu būt

Lielākie ieguvumi parasti nāk tieši no šejienes. Visbiežāk sastopamie gadījumi:

4. Nodrošiniet plānotājam precīzu statistiku

Slikti rindu novērtējumi parasti rodas no novecojušas vai pārāk rupjas statistikas. Pārbaudiet, kad lielās tabulas pēdējo reizi analizētas, palieliniet statistikas mērķi kolonnām ar nevienmērīgu sadalījumu, un korelētām kolonnām — piemēram, pilsētai un pasta indeksam — izveidojiet paplašināto statistiku ar CREATE STATISTICS, lai plānotājs vairs nepieņemtu, ka tās ir neatkarīgas.

5. Pārbaudiet, vai autovacuum tiek līdzi

Noslogotās tabulās noklusējuma autovacuum iestatījumi bieži ir pārāk piesardzīgi. Rezultāts ir uzpūšanās: vaicājumi nolasa vairāk lapu, lai atgrieztu tās pašas rindas, un tikai indeksa skenēšana pasliktinās, jo redzamības karte atpaliek. Sekojiet n_dead_tup skatā pg_stat_user_tables un noslogotākajām tabulām pielāgojiet autovacuum katrai atsevišķi, nevis globāli.

Situācija, ko redzam regulāri: atskaite, kas agrāk aizņēma mazāk par sekundi, tagad aizņem minūti, lai gan vaicājumu neviens nemainīja. Tabula aiz tās klusi izaugusi vairākas reizes lielāka par dzīvajiem datiem, jo autovacuum netika līdzi atjauninājumiem. Tabulas līmeņa autovacuum iestatījumi un vienreizēja pārbūve atjauno ātrumu — uz tās pašas aparatūras.

6. Tikai tad — atmiņa un konfigurācija

Konfigurācija ir svarīga, bet tā reti ir pirmais labojums. Iestatījumi, kuriem visbiežāk jāpievērš uzmanība:

7. Skatieties uz lietotni, ne tikai uz datubāzi

Dažas no dārgākajām "datubāzes problēmām" patiesībā ir piekļuves modeļi: ORM ģenerēti N+1 vaicājumi, lapošana ar lielām OFFSET vērtībām vai veselu rindu ielāde, kad tiek izmantotas divas kolonnas. Tās neparādās kā viens lēns vaicājums — tās parādās kā ātrs vaicājums ar milzīgu izsaukumu skaitu pg_stat_statements.

Galvenās atziņas

PostgreSQL Veiktspēja Vaicājumu optimizācija Indeksi
Sadarbība ar mums

Datubāze strādā lēnāk, nekā vajadzētu?

Šo kontrolsarakstu veicam kā fiksēta apjoma veiktspējas auditu un iedodam prioritizētu labojumu sarakstu — lielākajai daļai no tiem jauna aparatūra nav vajadzīga.

Sazināties Vairāk no emuāra