Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Rapò a prezante kèk apwòch ki pèmèt kontwole pèfòmans demann SQL lè gen dè milyon de yo chak jou, e gen dè santèn de serveurs PostgreSQL kontwole.

Ki solisyon teknik ki pèmèt nou trete yon volim enfòmasyon konsa avèk efikasite, e ki jan sa fè lavi yon pwomotè òdinè vin pi fasil?


Ki moun ki enterese? analiz de pwoblèm espesifik ak divès kalite teknik optimize Rekèt SQL ak rezoud pwoblèm DBA tipik nan PostgreSQL - ou kapab tou li yon seri atik sou sijè sa a.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)
Non mwen se Kirill Borovikov, mwen reprezante Konpayi tensor. Espesyalman, mwen espesyalize nan travay ak baz done nan konpayi nou an.

Jodi a mwen pral di w kouman nou optimize demann, lè ou pa bezwen "chwazi apa" pèfòmans nan yon sèl rechèch, men rezoud pwoblèm nan an masse. Lè gen dè milyon de demann, epi ou bezwen jwenn kèk apwòch nan solisyon gwo pwoblèm sa a.

An jeneral, Tensor pou yon milyon nan kliyan nou yo se VLSI se aplikasyon nou an: rezo sosyal antrepriz, solisyon pou kominikasyon videyo, pou koule dokiman entèn ak ekstèn, sistèm kontablite pou kontablite ak depo,... Sa vle di, tankou yon "mega-konbine" pou jesyon biznis entegre, nan ki gen plis pase 100 diferan. pwojè entèn yo.

Pou asire yo tout travay e devlope nòmalman, nou gen 10 sant devlopman nan tout peyi a, ki gen plis ladan yo 1000 devlopè.

Nou ap travay ak PostgreSQL depi 2008 epi nou akimile yon gwo kantite sa nou trete - done kliyan, estatistik, analyse, done ki soti nan sistèm enfòmasyon ekstèn - plis pase 400TB. Gen anviwon 250 serveurs nan pwodiksyon sèlman, e an total gen anviwon 1000 serveurs baz done ke nou kontwole.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

SQL se yon lang deklaratif. Ou dekri pa "ki jan" yon bagay ta dwe travay, men "ki sa" ou vle reyalize. DBMS la konnen pi byen ki jan fè yon JOIN - ki jan yo konekte tab ou yo, ki kondisyon yo enpoze, ki sa ki pral ale nan endèks la, ki sa ki pa pral ...

Gen kèk DBMS ki aksepte sijesyon: "Non, konekte de tab sa yo nan tankou yon keu," men PostgreSQL pa ka fè sa. Sa a se pozisyon konsyan devlopè dirijan yo: "Nou ta pito fini optimize rechèch la pase pèmèt devlopè yo sèvi ak kèk kalite sijesyon."

Men, malgre lefèt ke PostgreSQL pa pèmèt "deyò a" kontwole tèt li, li parfe pèmèt gade sa k ap pase anndan lilè ou kouri rechèch ou an, ak ki kote li gen pwoblèm.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

An jeneral, ki pwoblèm klasik yon pwomotè [nan yon DBA] anjeneral vini ak? "Isit la nou te akonpli demann lan, epi tout bagay se dousman avèk nou, tout bagay ap pandye, gen yon bagay k ap pase... Yon kalite pwoblèm!”

Rezon ki fè yo prèske toujou menm:

  • algorithm rechèch inefikas
    Devlopè: "Kounye a, mwen ba li 10 tab nan SQL atravè JOIN..." - epi li espere ke kondisyon li yo pral miraculeuseman efektivman "demare" epi li pral jwenn tout bagay byen vit. Men, mirak pa rive, ak nenpòt sistèm ak varyasyon sa yo (10 tab nan yon sèl FROM) toujou bay kèk kalite erè. [atik]
  • estatistik ki pa enpòtan
    Pwen sa a trè enpòtan espesyalman pou PostgreSQL, lè ou "vide" yon seri done gwo sou sèvè a, fè yon demann, epi li "sexcanits" tablèt ou a. Paske yè te gen 10 dosye ladan l, e jodi a gen 10 milyon dola, men PostgreSQL poko okouran de sa, epi nou bezwen di li sou li. [atik]
  • "ploge" sou resous yo
    Ou te enstale yon baz done gwo ak lou chaje sou yon sèvè fèb ki pa gen ase disk, memwa, oswa pèfòmans processeur. Ak sa a tout ... Yon kote gen yon plafon pèfòmans pi wo a ki ou pa ka sote ankò.
  • bloke
    Sa a se yon pwen difisil, men yo pi enpòtan pou plizyè demann modifye (INSERT, UPDATE, DELETE) - sa a se yon gwo sijè separe.

Jwenn yon plan

...E pou tout lòt bagay nou bezwen yon plan! Nou bezwen wè sa k ap pase andedan sèvè a.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Yon plan ekzekisyon rechèch pou PostgreSQL se yon pye bwa nan algorithm ekzekisyon rechèch la nan reprezantasyon tèks. Li se jisteman algorithm la ki, kòm yon rezilta nan analiz pa planifikatè a, yo te jwenn yo dwe pi efikas la.

Chak nœud pyebwa se yon operasyon: rekipere done ki sòti nan yon tab oswa endèks, bati yon bitmap, rantre nan de tab, rantre, kwaze, oswa eksklizyon seleksyon. Egzekite yon rechèch enplike nan mache nan nœuds pyebwa sa a.

Pou jwenn plan rechèch la, fason ki pi fasil se egzekite deklarasyon an EXPLAIN. Pou jwenn ak tout atribi reyèl, se sa ki, aktyèlman egzekite yon rechèch sou baz la - EXPLAIN (ANALYZE, BUFFERS) SELECT ....

Pati nan move: lè ou kouri li, li rive "isit la e kounye a", kidonk li sèlman apwopriye pou debogaj lokal yo. Si ou pran yon sèvè trè chaje ki anba yon gwo koule nan chanjman done, epi ou wè: "Oh! Isit la nou gen yon ekzekisyon dousmanся demann." Mwatye inèdtan, yon èdtan de sa - pandan w t ap kouri epi resevwa demann sa a soti nan mòso bwa yo, pote l 'tounen sou sèvè a, tout dataset ou ak estatistik chanje. Ou kouri li nan debogaj - epi li kouri byen vit! Epi ou pa ka konprann poukisa, poukisa te dousman.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Yo nan lòd yo konprann sa ki te pase egzakteman nan moman sa a lè demann lan te egzekite sou sèvè a, moun entelijan te ekri modil auto_explain. Li prezan nan prèske tout distribisyon PostgreSQL ki pi komen, epi li ka tou senpleman aktive nan dosye konfigirasyon an.

Si li reyalize ke kèk demann ap kouri pi lontan pase limit ou te di li a, li fè sa "enstantane" nan plan demann sa a epi ekri yo ansanm nan jounal la.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Tout bagay sanble ap byen kounye a, nou ale nan boutèy la epi nou wè la ... [tèks pye]. Men, nou pa ka di anyen sou li, lòt pase lefèt ke li se yon plan ekselan paske li te pran 11ms egzekite.

Tout bagay sanble ap byen - men pa gen anyen ki klè sa ki aktyèlman rive. Apa de tan an jeneral, nou pa reyèlman wè anyen. Paske gade tankou yon "ti mouton" nan tèks klè se jeneralman pa vizyèl.

Men, menm si li pa evidan, menm si li pa konvenyan, gen plis pwoblèm fondamantal:

  • Ne la endike sòm resous tout subtree a anba li. Sa vle di, ou pa ka jis chèche konnen konbyen tan yo te pase sou An patikilye Index Scan sa a si gen kèk kondisyon enbrike anba li. Nou dwe dinamik gade pou wè si gen "timoun" ak varyab kondisyonèl, CTE andedan - ak soustraksyon tout bagay sa yo "nan lespri nou".
  • Dezyèm pwen: tan an ki endike sou ne a se sèl tan ekzekisyon ne. Si yo te egzekite ne sa a kòm yon rezilta, pa egzanp, yon bouk nan dosye tab plizyè fwa, Lè sa a, kantite bouk-sik nan ne sa a ogmante nan plan an. Men, tan an ekzekisyon atomik tèt li rete menm jan an tèm de plan. Sa vle di, yo nan lòd yo konprann konbyen tan ne sa a te fèt an total, ou bezwen miltipliye yon bagay pa yon lòt - ankò, "nan tèt ou."

Nan sitiyasyon sa yo, konprann "Kiyès ki lyen ki pi fèb la?" prèske enposib. Se poutèt sa, menm devlopè yo tèt yo ekri nan "manyèl la" sa "Konprann yon plan se yon atis ki dwe aprann, eksperyans...".

Men, nou gen 1000 devlopè, epi ou pa ka transmèt eksperyans sa a nan chak nan yo. Mwen menm, ou menm, li konnen, men yon moun laba a pa konnen ankò. Petèt li pral aprann, oswa petèt pa, men li bezwen travay kounye a - e ki kote li ta jwenn eksperyans sa a?

Planifye vizyalizasyon

Se poutèt sa, nou reyalize ke yo nan lòd yo fè fas ak pwoblèm sa yo, nou bezwen bon vizyalizasyon plan an. [atik]

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Nou premye te ale "atravè mache a" - ann gade sou entènèt la pou wè sa ki menm egziste.

Men, li te tounen soti ke gen trè kèk solisyon relativman "viv" ki gen plis oswa mwens devlope - literalman, yon sèl: eksplike.depesz.com pa Hubert Lubaczewski. Lè ou antre nan jaden "feed" yon tèks reprezantasyon plan an, li montre w yon tablo ak done yo analize:

  • tan pwòp pwosesis ne a
  • tan total pou tout subtree a
  • kantite dosye ki te rekipere ke yo te espere estatistik
  • kò a ne tèt li

Sèvis sa a tou gen kapasite pou pataje yon achiv nan lyen. Ou te voye plan w la epi ou te di: "Hey, Vasya, men yon lyen, gen yon bagay ki mal la."

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Men tou gen ti pwoblèm.

Premyèman, yon gwo kantite "kopi-kole". Ou pran yon moso boutèy demi lit la, mete l ladan l, epi ankò, e ankò.

Dezyèmman, nan pa gen okenn analiz sou kantite done li yo - tanpon yo menm ki pwodiksyon an EXPLAIN (ANALYZE, BUFFERS), nou pa wè li isit la. Li tou senpleman pa konnen ki jan yo demonte yo, konprann yo ak travay avèk yo. Lè w ap li yon anpil nan done epi reyalize ke ou ta ka malallocation disk la ak kachèt memwa, enfòmasyon sa a trè enpòtan.

Twazyèm pwen negatif se devlopman trè fèb nan pwojè sa a. Commits yo piti anpil, li bon si yon fwa chak sis mwa, ak kòd la se nan Perl.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Men, sa a se tout "lyrics", nou te kapab yon jan kanmenm viv ak sa a, men gen yon sèl bagay ki anpil vire nou lwen sèvis sa a. Sa yo se erè nan analiz la nan Ekspresyon Tablo Komen (CTE) ak divès kalite nœuds dinamik tankou InitPlan/SubPlan.

Si ou kwè foto sa a, Lè sa a, tan an total ekzekisyon nan chak ne endividyèl pi gran pase tan an ekzekisyon total nan demann lan tout antye. Li senp - tan an jenerasyon nan CTE sa a pa te soustraksyon nan ne la Scan CTE. Se poutèt sa, nou pa konnen repons ki kòrèk la ankò pou konbyen tan eskanè CTE a li menm te pran.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Lè sa a, nou reyalize ke li te tan yo ekri pwòp pa nou - Hurray! Chak pwomotè di: "Kounye a, nou pral ekri pwòp pa nou an, li pral super fasil!"

Nou te pran yon pil tipik pou sèvis entènèt: yon nwayo ki baze sou Node.js + Express, itilize Bootstrap ak D3.js pou bèl dyagram. Ak atant nou yo te konplètman jistifye - nou te resevwa premye pwototip nan 2 semèn:

  • analizeur plan koutim
    Sa vle di, kounye a nou ka analize nenpòt plan soti nan sa yo ki te pwodwi pa PostgreSQL.
  • analiz kòrèk nan nœuds dinamik - CTE Scan, InitPlan, SubPlan
  • analiz distribisyon tanpon yo - kote paj done yo li nan memwa, ki kote soti nan kachèt lokal la, ki kote soti nan disk
  • te gen klè
    Se konsa, yo pa "fouye" tout bagay sa yo nan boutèy la, men yo wè "lyen ki pi fèb la" touswit nan foto a.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Nou te gen yon bagay tankou sa a, ak sentaks en enkli ladan li. Men, anjeneral devlopè nou yo pa travay ankò ak yon reprezantasyon konplè nan plan an, men ak yon sèl ki pi kout. Apre yo tout, nou te deja analize tout nimewo yo epi jete yo agoch ​​ak dwa, ak nan mitan an nou kite sèlman premye liy lan, ki kalite ne li ye: CTE Scan, CTE jenerasyon oswa Seq Scan dapre kèk siy.

Sa a se reprezantasyon abreje nou rele modèl plan.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Ki lòt bagay ki ta pratik? Li ta bon pou wè ki pati nan tan total nou atribye ba ki ne - epi jis "bwase li" sou bò a. tablo tat.

Nou lonje dwèt sou ne a epi wè - li sanble ke Seq Scan te pran mwens pase yon ka nan tan total la, ak 3/4 ki rete a te pran pa CTE Scan. Laterè! Sa a se yon ti nòt sou "pousantaj dife" nan CTE Scan si ou aktivman itilize yo nan demann ou yo. Yo pa trè vit - yo enferyè menm ak tab regilye optik. [atik] [atik]

Men, anjeneral dyagram sa yo pi enteresan, pi konplèks, lè nou imedyatman lonje dwèt sou yon segman epi wè, pou egzanp, ke plis pase mwatye nan tan an kèk Seq Scan "manje". Anplis, te gen kèk kalite Filtre andedan, yon anpil nan dosye yo te jete dapre li ... Ou ka dirèkteman voye foto sa a bay pwomotè a epi di: "Vasya, tout bagay se move isit la pou ou! Kalkile li, gade - yon bagay ki mal!"

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Natirèlman, te gen kèk "rato" ki enplike.

Premye bagay nou te rankontre se te pwoblèm awondi. Tan chak ne endividyèl nan plan an endike ak yon presizyon nan 1 μs. Men, lè kantite sik ne depase, pou egzanp, 1000 - apre ekzekisyon PostgreSQL divize "nan presizyon", Lè sa a, lè kalkile tounen nou jwenn tan an total "yon kote ant 0.95ms ak 1.05ms". Lè konte a ale nan mikrosgond, sa se oke, men lè li deja [mili] segonn, ou dwe pran enfòmasyon sa a an kont lè "demare" resous nan nœuds yo nan "ki moun ki konsome konbyen lajan" plan an.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Dezyèm pwen an, ki pi konplèks, se distribisyon resous (tanpon sa yo) nan mitan nœuds dinamik. Sa te koute nou 2 premye semèn pwototip a plis yon lòt 4 semèn.

Li byen fasil jwenn kalite pwoblèm sa a - nou fè yon CTE epi swadizan li yon bagay ladan l. An reyalite, PostgreSQL se "entelijan" epi li pa pral li anyen dirèkteman la. Lè sa a, nou pran premye dosye a soti nan li, ak nan li a san premye dosye ki soti nan menm CTE a.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Nou gade plan an epi konprann - sa dwòl, nou gen 3 tanpon (paj done) "konsome" nan Seq Scan, 1 plis nan CTE Scan, ak 2 plis nan dezyèm CTE Scan. Sa vle di, si nou tou senpleman rezime tout bagay, n ap jwenn 6, men nan tablèt la nou sèlman li 3! CTE Scan pa li anyen nan nenpòt kote, men li travay dirèkteman ak memwa pwosesis la. Sa vle di, yon bagay klèman mal isit la!

An reyalite, li sanble ke isit la se tout 3 paj done sa yo ki te mande nan men Seq Scan, premye 1 mande pou 1st CTE Scan la, epi apre sa 2yèm lan, ak 2 plis yo te li l '.Sa vle di, yon total de 3 paj yo te li done, pa 6.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Ak foto sa a te mennen nou nan konpreyansyon ke ekzekisyon an nan yon plan se pa yon pye bwa ankò, men tou senpleman yon kalite graf acyclic. Epi nou te resevwa yon dyagram tankou sa a, pou nou konprann "sa ki soti kote an premye." Sa vle di, isit la nou te kreye yon CTE soti nan pg_class, epi mande pou li de fwa, ak prèske tout tan nou te pase sou branch nan lè nou te mande pou li pou li 2yèm fwa. Li klè ke lekti 101yèm antre a pi chè pase jis li 1ye antre nan tablèt la.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Nou souf pou yon ti tan. Yo te di: “Koulye a, Neo, ou konnen kung fu! Koulye a, eksperyans nou an se dwa sou ekran ou. Koulye a, ou ka sèvi ak li." [atik]

Log consolidation

1000 devlopè nou yo te pran yon souf soulajman. Men, nou te konprann ke nou sèlman gen dè santèn de "konba" sèvè, ak tout sa a "kopi-kole" sou pati nan devlopè yo se pa nan tout pratik. Nou te reyalize ke nou te oblije kolekte li tèt nou.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

An jeneral, gen yon modil estanda ki ka kolekte estatistik, sepandan, li tou bezwen aktive nan konfigirasyon an - sa a. modil pg_stat_statements. Men, li pa te kostim nou.

Premyèman, li bay menm demann yo lè l sèvi avèk diferan rapid nan menm baz done a diferan QueryIds. Sa vle di, si ou fè premye SET search_path = '01'; SELECT * FROM user LIMIT 1;, ak lè sa a SET search_path = '02'; e menm demann, alors statistik sa modil i ava annan diferan rikord, e mon pa pou kapab kolekte statistik zeneral spesifikman dan konteks sa profile request, san pran kont bann schemes.

Dezyèm pwen ki te anpeche nou sèvi ak li se mank de plan. Sa vle di, pa gen okenn plan, gen sèlman demann nan tèt li. Nou wè sa ki te ralanti, men nou pa konprann poukisa. Ak isit la nou retounen nan pwoblèm nan nan yon seri done rapidman chanje.

Ak dènye moman an - mank de "reyalite". Sa vle di, ou pa ka adrese yon egzanp espesifik nan ekzekisyon rechèch - pa gen okenn, gen sèlman estatistik total. Malgre ke li posib pou travay ak sa a, li se jis trè difisil.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Se poutèt sa, nou te deside goumen kopye-kole epi yo te kòmanse ekri pèseptè.

Pèseptè a konekte atravè SSH, etabli yon koneksyon an sekirite nan sèvè a ak baz done a lè l sèvi avèk yon sètifika, ak tail -F "se kole" sou li nan dosye a. Se konsa, nan sesyon sa a nou jwenn yon "glas" konplè sou dosye a tout antye, ki sèvè a jenere. Chaj la sou sèvè a li menm se minim, paske nou pa analize anyen la, nou jis reflete trafik la.

Depi nou te deja kòmanse ekri koòdone nan Node.js, nou te kontinye ekri pèseptè a nan li. Ak teknoloji sa a te jistifye tèt li, paske li trè pratik yo sèvi ak JavaScript pou travay ak done tèks fèb fòma, ki se boutèy la. Ak enfrastrikti Node.js tèt li kòm yon platfòm backend pèmèt ou fasil epi fasilman travay ak koneksyon rezo, ak tout bon ak nenpòt kouran done.

An konsekans, nou "detire" de koneksyon: premye a "koute" boutèy la tèt li epi pran li nan tèt nou, ak dezyèm nan detanzantan mande baz la. "Men, jounal la montre ke siy ki gen oid 123 bloke," men sa a pa vle di anyen pou pwomotè a, epi li ta bon pou mande baz done a, "Ki sa ki OID = 123 de tout fason?" Se konsa, detanzantan nou mande baz la sa nou poko konnen sou tèt nou.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

"Genyen yon sèl bagay ou pa t pran an kont, gen yon espès myèl ki sanble ak elefan!..." Nou te kòmanse devlope sistèm sa a lè nou te vle kontwole 10 sèvè. Ki pi kritik nan konpreyansyon nou an, kote kèk pwoblèm leve ki te difisil pou fè fas. Men, pandan premye trimès la, nou te resevwa yon santèn pou siveyans - paske sistèm nan te travay, tout moun te vle li, tout moun te konfòtab.

Tout bagay sa a bezwen yo dwe ajoute moute, koule nan done se gwo ak aktif. An reyalite, sa nou kontwole, sa nou ka fè fas, se sa nou itilize. Nou itilize tou PostgreSQL kòm yon depo done. E pa gen anyen ki pi vit "vide" done nan li pase operatè a COPY Poko.

Men, tou senpleman "vide" done se pa reyèlman teknoloji nou an. Paske si ou gen apeprè 50k demann pou chak segonn sou yon santèn serveurs, Lè sa a, sa a pral jenere 100-150GB nan mòso bwa pa jou. Se poutèt sa, nou te dwe ak anpil atansyon "koupe" baz la.

Premyerman, nou te fè patisyon pa jou, paske, an jeneral, pa gen moun ki enterese nan korelasyon ki genyen ant jou. Ki diferans li fè sa ou te genyen yè, si aswè a ou te woule soti yon nouvo vèsyon aplikasyon an - ak deja kèk nouvo estatistik.

Dezyèmman, nou te aprann (yo te fòse) trè, trè vit pou ekri lè l sèvi avèk COPY. Sa vle di, pa sèlman COPYpaske li pi vit pase INSERT, e menm pi vit.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Twazyèm pwen an - mwen te oblije abandone deklanche, respektivman, ak kle etranje yo. Sa vle di, nou pa gen okenn entegrite referans ditou. Paske si ou gen yon tab ki gen yon pè FK, epi ou di nan estrikti baz done a ke "isit la se yon dosye boutèy demi lit ki referans pa FK, pou egzanp, nan yon gwoup dosye," Lè sa a, lè ou mete li, PostgreSQL. pa gen anyen ki rete men ki jan yo pran li epi fè li onètman SELECT 1 FROM master_fk1_table WHERE ... ak idantifyan ke w ap eseye mete - jis tcheke si dosye sa a prezan la, ke ou pa "kraze" kle etranje sa a ak ensèsyon ou.

Olye de yon dosye nan tab la sib ak endis li yo, nou jwenn benefis nan ajoute nan lekti nan tout tab yo li refere a. Men, nou pa bezwen sa a ditou - travay nou an se anrejistre otank posib ak pi vit ke posib ak pi piti chaj la. Se konsa, FK - desann!

Pwen kap vini an se agrégation ak hachage. Okòmansman, nou te aplike yo nan baz done a - apre tout, li pratik imedyatman, lè yon dosye rive, fè li nan kèk kalite tablèt. "plis youn" dwa nan deklanche la. Oke, li pratik, men menm bagay la move - ou mete yon dosye, men yo fòse yo li ak ekri yon lòt bagay soti nan yon lòt tab. Anplis, non sèlman ou li ak ekri, ou fè li tou chak fwa.

Koulye a, imajine ke ou gen yon tab kote ou tou senpleman konte kantite demann ki te pase nan yon lame espesifik: +1, +1, +1, ..., +1. Epi ou, nan prensip, pa bezwen sa a - li posib sòm nan memwa sou pèseptè a epi voye nan baz done a nan yon sèl kou +10.

Wi, nan ka ta gen kèk pwoblèm, entegrite lojik ou ka "tonbe apa", men sa a se yon ka prèske ireyèl - paske ou gen yon sèvè nòmal, li gen yon batri nan kontwolè a, ou gen yon boutèy tranzaksyon, yon boutèy demi lit sou la. sistèm fichye... An jeneral, pa li vo li. Pèt pwodiktivite ou jwenn nan kouri deklannche/FK pa vo depans ou fè a.

Se menm bagay la tou ak hachage. Yon demann sèten vole pou ou, ou kalkile yon idantifyan sèten soti nan li nan baz done a, ekri li nan baz done a ak Lè sa a, di li bay tout moun. Tout bagay anfòm jiskaske, nan moman anrejistreman an, yon dezyèm moun vin jwenn ou ki vle anrejistre menm bagay la - epi ou jwenn bloke, e sa a deja move. Se poutèt sa, si ou ka transfere jenerasyon an nan kèk ID nan kliyan an (an rapò ak baz done a), li se pi bon fè sa.

Li te jis pafè pou nou sèvi ak MD5 nan tèks la - demann, plan, modèl, ... Nou kalkile li sou bò pèseptè a, ak "vide" idantite pare a nan baz done a. Longè MD5 ak patisyon chak jou pèmèt nou pa enkyete sou kolizyon posib.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Men, yo nan lòd yo anrejistre tout sa a byen vit, nou te bezwen modifye pwosedi anrejistreman an tèt li.

Ki jan ou konn ekri done? Nou gen kèk kalite dataset, nou divize li an plizyè tab, epi answit COPIE li - premye nan premye a, answit nan dezyèm lan, nan twazyèm lan... Li pa konvenyan, paske nou sanble ap ekri yon kouran done nan twa etap. sekans. Dezagreyab. Èske li ka fè pi vit? Èske!

Pou fè sa, li se ase jis dekonpoze koule sa yo nan paralèl youn ak lòt. Li sanble ke nou gen erè, demann, modèl, bloke, ... vole nan fil separe - epi nou ekri li tout nan paralèl. Ase pou sa kenbe yon chanèl COPY toujou ap louvri pou chak tab sib endividyèl.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Sa vle di, nan pèseptè a toujou gen yon kouran, kote mwen ka ekri done mwen bezwen yo. Men, pou baz done a wè done sa yo, epi yon moun pa bloke ap tann pou done sa yo dwe ekri, KOPI dwe entèwonp nan sèten entèval. Pou nou, peryòd ki pi efikas la te apeprè 100ms - nou fèmen li epi imedyatman louvri li ankò sou menm tab la. Men, si nou pa gen ase nan yon sèl koule pandan kèk pik, Lè sa a, nou fè pisin jiska yon sèten limit.

Anplis de sa, nou te jwenn ke pou yon pwofil chaj konsa, nenpòt agrégasyon, lè dosye yo kolekte nan lo, se sa ki mal. Sa ki mal klasik se INSERT ... VALUES ak plis 1000 dosye. Paske nan pwen sa a ou gen yon pik ekri sou medya yo, ak tout lòt moun ap eseye ekri yon bagay sou disk la ap tann.

Pou debarase m de anomali sa yo, tou senpleman pa total anyen, pa tampon ditou. Men, si tanpon sou disk rive (ererezman, Stream API nan Node.js pèmèt ou chèche konnen) - ranvwaye koneksyon sa a. Lè ou resevwa yon evènman ke li gratis ankò, ekri l 'nan keu la akimile. Epi pandan ke li okipe, pran pwochen gratis nan pisin lan epi ekri li.

Anvan entwodwi apwòch sa a nan anrejistreman done, nou te gen apeprè 4K operasyon ekri, ak nan fason sa a nou redwi chaj la pa 4 fwa. Koulye a, yo te grandi yon lòt 6 fwa akòz nouvo baz done kontwole - jiska 100MB / s. Epi, koulye a nou estoke mòso bwa pou 3 dènye mwa yo nan yon volim sou 10-15TB, espere ke nan jis twa mwa nenpòt pwomotè yo pral kapab rezoud nenpòt pwoblèm.

Nou konprann pwoblèm yo

Men, tou senpleman kolekte tout done sa yo se yon bon bagay, itil, ki enpòtan, men se pa ase - li bezwen yo dwe konprann. Paske sa yo se dè milyon de plan diferan chak jou.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Men, dè milyon yo pa jere, nou dwe premye fè "pi piti". Epi, anvan tout bagay, ou bezwen deside ki jan ou pral òganize bagay sa a "pi piti".

Nou te idantifye twa pwen kle:

  • kiyès voye demann sa a
    Sa vle di, ki soti nan aplikasyon li te "rive": koòdone entènèt, backend, sistèm peman oswa yon lòt bagay.
  • kote sa te rive
    Sou ki sèvè espesifik? Paske si ou gen plizyè serveurs anba yon aplikasyon, epi toudenkou yon sèl "ale estipid" (paske "disk la se pouri", "memwa fwit", kèk lòt pwoblèm), Lè sa a, ou bezwen espesyalman adrese sèvè a.
  • kòm pwoblèm nan manifeste tèt li nan yon fason oswa yon lòt

Pou konprann "ki moun ki" voye nou yon demann, nou itilize yon zouti estanda - mete yon varyab sesyon: SET application_name = '{bl-host}:{bl-method}'; — nou voye non lame lojik biznis kote demann lan soti, ak non metòd oswa aplikasyon ki inisye li.

Apre nou te pase "pwopriyetè" demann lan, li dwe pwodiksyon nan boutèy la - pou sa nou konfigirasyon varyab la. log_line_prefix = ' %m [%p:%v] [%d] %r %a'. Pou moun ki enterese, petèt gade nan manyèl lakisa tout sa vle di. Li sanble ke nou wè nan boutèy la:

  • tan
  • idantifyan pwosesis ak tranzaksyon yo
  • non baz done
  • IP moun ki voye demann sa a
  • ak non metòd

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Lè sa a, nou reyalize ke li pa trè enteresan yo gade nan korelasyon an pou yon sèl demann ant serveurs diferan. Li pa souvan ke ou gen yon sitiyasyon kote yon aplikasyon vis moute egalman isit la ak la. Men, menm si se menm bagay la, gade nenpòt nan serveurs sa yo.

Se konsa, isit la nan koupe a "yon sèvè - yon jou" li te tounen ase pou nou pou nenpòt analiz.

Premye seksyon analyse se menm bagay la "echantiyon" - yon fòm abreje nan prezantasyon plan an, otorize nan tout endikatè nimerik. Dezyèm koupe a se aplikasyon an oswa metòd, ak twazyèm koupe a se ne plan espesifik ki te lakòz nou pwoblèm.

Lè nou te deplase soti nan ka espesifik nan modèl, nou te gen de avantaj nan yon fwa:

  • rediksyon miltip nan kantite objè pou analiz
    Nou dwe analize pwoblèm nan pa plizyè milye demann oswa plan, men pa plizyè douzèn modèl.
  • delè
    Sa vle di, lè w rezime "reyalite yo" nan yon sèten seksyon, ou ka montre aparans yo pandan jounen an. Ak isit la ou ka konprann ke si ou gen yon kalite modèl ki rive, pou egzanp, yon fwa pa èdtan, men li ta dwe rive yon fwa pa jou, ou ta dwe reflechi sou sa ki te ale mal - ki moun ki te lakòz li ak poukisa, petèt li ta dwe isit la. pa ta dwe. Sa a se yon lòt metòd analiz ki pa nimerik, piman vizyèl.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Metòd ki rete yo baze sou endikatè yo ke nou ekstrè nan plan an: konbyen fwa yon modèl konsa te fèt, tan total ak mwayèn, konbyen done yo te li nan disk la, ak konbyen nan memwa...

Paske, pou egzanp, ou vin nan paj la analytics pou lame a, gade - yon bagay ap kòmanse li twòp sou disk la. Diskèt la sou sèvè a pa ka okipe li - ki moun ki li nan li?

Epi ou ka sòt pa nenpòt kolòn epi deside ki sa ou pral fè fas kounye a - chaj la sou processeur a oswa disk la, oswa kantite total demann ... Nou klase li, gade sa yo "tèt", fikse li ak te lanse yon nouvo vèsyon aplikasyon an.
[videyo konferans]

Epi imedyatman ou ka wè aplikasyon diferan ki vini ak modèl la menm soti nan yon demann tankou SELECT * FROM users WHERE login = 'Vasya'. Frontend, backend, pwosesis... Epi ou mande poukisa pwosesis ta li itilizatè a si li pa kominike avèk li.

Fason opoze a se imedyatman wè nan aplikasyon an sa li fè. Pou egzanp, entèfas la se sa a, sa a, sa a, ak sa a yon fwa pa èdtan (delè a ede). Ak kesyon an imedyatman leve: li sanble ke li pa travay nan entèfas la fè yon bagay yon fwa chak èdtan ...

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Apre kèk tan, nou reyalize ke nou te manke totalman estatistik pa plan nœuds. Nou izole nan plan yo sèlman nœuds sa yo ki fè yon bagay ak done yo nan tab yo tèt yo (li / ekri yo pa endèks oswa ou pa). An reyalite, se sèlman yon aspè ki ajoute parapò ak foto anvan an - Konbyen dosye ne sa a pote nou?, ak konbyen yo te jete (Ranj Retire pa Filtre).

Ou pa gen yon endèks apwopriye sou plak la, ou fè yon demann nan li, li vole pase endèks la, tonbe nan Seq Scan ... ou te filtre soti tout dosye yo eksepte yon sèl. Poukisa ou bezwen 100M dosye filtre chak jou? Èske li pa pi bon pou woule endèks la?

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Lè nou te analize tout plan yo ne pa ne, nou reyalize ke gen kèk estrikti tipik nan plan yo ki gen anpil chans yo gade sispèk. Epi li ta bon pou di pwomotè a: "Zanmi, isit la ou premye li pa endèks, Lè sa a, sòt, ak Lè sa a koupe" - kòm yon règ, gen yon sèl dosye.

Tout moun ki te ekri demann te pwobableman rankontre modèl sa a: "Ban m 'dènye lòd pou Vasya a, dat li." Men, si ou pa gen yon endèks pa dat, oswa pa gen okenn dat nan endèks ou te itilize a, Lè sa a, ou pral etap sou egzakteman menm "rato" la.

Men, nou konnen ke sa a se yon "rato" - kidonk poukisa pa imedyatman di pwomotè a sa li ta dwe fè. An konsekans, lè w ap louvri yon plan kounye a, pwomotè nou an imedyatman wè yon bèl foto ak konsèy, kote yo imedyatman di l ': "Ou gen pwoblèm isit la ak la, men yo rezoud nan fason sa a ak nan fason sa a."

Kòm yon rezilta, kantite eksperyans ki te nesesè pou rezoud pwoblèm nan kòmansman an e kounye a, te tonbe anpil. Sa a se kalite zouti nou genyen.

Optimizasyon an gwo demann PostgreSQL. Kirill Borovikov (Tansè)

Sous: www.habr.com

Add nouvo kòmantè