Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Renuntiatio quaedam praebet accessiones quae admittunt Monitor in observantia SQL queries quando sunt decies centena eorum per diemet sunt centuriones monitores PostgreSQL servientes.

Quae solutiones technicae nobis permittunt ut efficaciter ad tale volumen notitiarum procedamus, et quomodo haec vita facilior est ordinarii elit?


Quis interest? analysis quaestionum specificarum et optimizationum variarum artium SQL queries et problemata typica DBA solvens in PostgreSQL - potes etiam legere seriem vasa Atque in hoc loco.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)
Nomen mihi est Kirill Borovikov Tensor company. Speciatim speciali operando cum databases in nostro comitatu.

Hodie tibi dicam quomodo interrogationes optimize debemus, cum "decerpere" unius interrogationis opus non debes, sed problema obiter solvere. Quando decies centena millia petitionum sunt, et invenire debes accedit ad solutionem magna haec quaestio.

In genere, Tensor pro decies centena millia clientium nostrorum est VLSI nostra applicatione: corporatum retis socialibus, solutiones pro communicatione video, profluentia documenti interni et externi, rationum rationum ratiocinandi et apothecarum, id est, talis "mega-coniungo" pro administratione negotiorum integrali, in qua plures quam 100 diversae sunt. internis inceptis.

Curent ut omnes laborent et enucleentur, centra 10 evolutionis per universam regionem habemus, cum plus in illis 1000 developers.

Laboravimus cum PostgreSQL cum 2008 et magnam copiam congessimus eorum quae processimus - clientelam datam, statisticam, analyticam, datam ab extraneis systematibus informibus - quam 400TB *. Sunt circiter CCL servientes in sola productione, et in summa circiter 250 servers datorum quos monitor sumus.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

SQL lingua declarativa est. Non describunt quomodo aliquid operetur, sed quid vis consequi. DBMS melius scit quomodo iungas - tabulas tuas coniungere, quae condiciones imponere, quid per indicem ire, quid non...

Nonnulli DBMSs significationes accipiunt: β€œNon, coniunge has duas tabulas in tali queue et tali”, sed PostgreSQL hoc facere non potest. Haec est positio conscia ducens tincidunt: "Quaestionem optimizer absolvere maluimus quam tincidunt uti aliqua ambage".

Sed, non obstante quod PostgreSQL "extra" se regere non patitur, perfecte concedit vide quid agatur intus eumcum interrogationem tuam curris, et ubi problemata habet.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

In genere, quae quaestiones classicae soleant venire cum elit? "Ecce petitionem implevimus" omnia tarda sunt nobis, omnia pendent, aliquid eveniunt... Aliqua molestia!

Rationes fere semper eaedem sunt;

  • inutilis query algorithmus
    Developer: "Nunc ei 10 tabulas in SQL via JOIN ... dabo." - et condiciones eius mirabiliter efficaciter "solventes" sperat et omnia cito consequetur. But miracula do not happen, and any system with such variability (10 tables in one FROM) semper aliquam speciem erroris dat. [articulus]
  • evasissent mutant
    Hoc punctum speciatim ad PostgreSQL pertinet, cum magnas notitias in servo "fundas", rogamus, et tabulam "sexcanites". Quia heri in eo fuerunt decem tabulae, et hodie decies centena millia sunt, sed PostgreSQL hoc nondum scit, et de eo narrare oportet. [articulus]
  • "obturaculum" in opibus
    Magnum et grave onustum database in servo infirmo instituisti quod satis orbis, memoriae, aut processus effectus non habet. Et omnia id est.
  • obturans
    Hoc difficile punctum est, sed maxime ad quaestiones modificationes varias pertinentes (INSERT, UPDATE, DELETE) - hic locus magnus separatus est.

Questus consilium

... Et ad omnia alia opus consilium! Non opus est videre quid intus servo agatur.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

quaesitum consilium exsecutionis de PostgreSQL lignum est algorithmus interrogationis in textu repraesentationis exsecutionis. Hoc ipsum algorithmus, quod effectus analyseos a consilio instituto efficacissimas esse repertus est.

Nodus arboris singula operatio est: notitia ex tabula vel indice receptans, bitmap fabricans, duas tabulas coniungens, iungens, secans vel excerpta exclusis. Executio quaesitum involvit ambulationem per nodos huius arboris.

Ut investigationem institutum impetres, via facillimum est enuntiationem exsequi EXPLAIN. Ut cum omnibus realibus attributis, hoc est, interrogationem in basi actu exsequi. EXPLAIN (ANALYZE, BUFFERS) SELECT ....

Malam partem: cum curris, fit "hic et nunc", sic solum est aptum loci debugging. Si servo onusto accipias quod sub valido cursu notitiarum mutationum est, et vides: β€œO! Hic habemus lentum suppliciumXia rogamus." Dimidia hora, ante horam - dum curritis et hanc petitionem e lignis questus est, eam servo reddens, tota tua dataset ac statistica mutata est. Curris ad debug - et cito currit! Non potes cognoscere quare erat tardius.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Ut intelligas quid exacte factum sit in momento quo in calculonis postulatio facta est, homines callidi scripserunt moduli auto_explain. In omnibus fere distributionibus communissimis PostgreSQL adest, et simpliciter agitari potest in fasciculi config.

Si animadvertit aliquam petitionem longius currendam esse quam terminum quod ei dixisti, facit "snapshot" of the plan of this request and scriben them together in the index.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Omnia iam bene esse videntur, itur ad truncum et ibi videmus... [text footcloth]. Sed nihil de eo loqui possumus, praeterquam quod optimum consilium est quod 11ms exequi cepit.

Omnia denique esse videntur -- sed nihil est quod acciderit. Praeter generale tempus nihil vere videmus. Quia aspectum talem "agnus" textus plani fere visualis non est.

Sed etsi non apparet, etsi incommodum est, plures sunt quaestiones fundamentales:

  • Nodus indicat summa rerum totius subtree sub eo. Hoc est, non modo scire potes quantum temporis in hoc particulari Indice Scan consumptum sit, si aliqua sub eo conditio nidificatur. Vitaliter inspiciendum est an sint "filii" et variabiles conditionales, CTEs intus - et omnia haec "in mentibus nostris" detrahenda.
  • Secundo punctum: tempus quod notatur in nodo unum nodi supplicium tempus. Si nodi ille effectus est, exempli gratia, ansa per tabulas tabulas pluries, tum numerus ansarum β€” cyclorum nodi β€” crescit in consilio. Sed ipsum tempus exsecutionis atomi idem manet secundum rationem consilii. Hoc est, ut intelligas quam diu hic nodi in summa gestum sit, necesse est ut aliud ex alio multiplicetur, iterum in capite tuo.

Talibus in adiunctis intellege quis est nexus infirmissimus? fere impossibile. Ideo ipsi tincidunt scribunt in "manualibus" illud "Intelligere consilium est ars discenda, experientia....".

Sed 1000 tincidunt habemus, et hanc experientiam unicuique eorum dare non potes. ego te scit, sed istic iam non novit. Forsitan discet, aut fortasse non, sed nunc opus est β€” et ubi hanc experientiam habebit?

Consilium visualization

Intelleximus ergo nos ut quaestiones illas agamus, nobis opus esse bonum visualisation consilii. [articulus]

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Primum "per forum" venimus - inspiciamus in Interreti quid etiam existat.

Sed evenit ut paucissimae sint solutiones relative β€œvivere” quae plus minusve enucleantur β€” proprie, una tantum; explain.depesz.com per Hubertum Lubaczewski. Cum in "pascere" agrum repraesentationem propositi propositi, tibi ostendit mensam cum notitia parsed:

  • nodi proprium processui tempore
  • totum tempus totum subtree
  • numerus monumentorum quae recepta sunt peraeque expectatur
  • nodi corporis

Hoc officium etiam facultatem habet ut archivum nexuum communicare possit. Ibi consilium tuum proiecisti et dixisti: "Heus, Vasya, hic nexus est, illic aliquid mali est."

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Sed etiam parvae sunt difficultates.

Uno modo, ingens moles "copia crustulum". Tu frustum ligni accipis, ibi et iterum iterumque haere.

Alio modo, nulla analysis de moles notitia legere - idem buffers qui output EXPLAIN (ANALYZE, BUFFERS)hic non videmus. Simpliciter non scit quomodo eos disgreget, illos intelligat et cum illis laboret. Cum legeres multum notitiae et scito te posse misallocating orbis et cella memoria, haec notitia magni momenti est.

Tertium punctum negativum est valde debilis huius propositi evolutionis. Commissae minimae sunt, bonum est si semel singulis mensibus sex, et signum est in Perl.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Sed haec omnia β€œlyrica”, cum hoc aliquo vivere potuimus, sed unum est quod nos ab hoc servitio magnopere avertimus. Hi errores in analysi elocutionis Tabulae Communis (CTE) et variae nodi dynamicae sicut InitPlan/SubPlan.

Si hanc imaginem credis, tunc totum tempus uniuscuiusque nodi exsecutionis maius est quam tota exsecutio temporis totius petitionis. Simplex est - generatio huius temporis CTE non subtrahitur a CTE Scan nodi. Ergo iam non scimus quam diu rectam responsum CTE scan ipsum sumpsit.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Tunc intelleximus tempus nostrum scribere - eia! Omnis elit dicit: "Nunc nostra scribemus, super facilis eris!"

Stackos typicam cepimus pro officiis interretialibus: nucleus in Node.js + Express, Bootstrap usus et D3.js pro figuris pulchris. Nostrae exspectationes plene iustificatae sunt - primum exemplar recepimus in 2 hebdomadibus;

  • consuetudo consilium Total
    Hoc est, nunc aliquod consilium ab iis generatis PostgreSQL parse possumus.
  • recta analysis de dynamic nodis - CTE Scan, InitPlan, SubPlan
  • analysis of buffers distribution - ubi paginae datae e memoria leguntur, ubi e latibulo locali, ubi ab orbe
  • obtinuit claritatem
    Ut non "fodere" haec omnia in trunco, sed "infirmissima nexum" videre statim in tabula.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Simile quiddam venimus, syntaxi indicibus comprehensa. Sed plerumque tincidunt nostri non iam perfecta repraesentatione consilii, sed cum breviore operantur. Post omnes numeros jam abscivimus omnes, et projecimus eos ad dextram, et in medio relinquimus primam tantum lineam, qualis est nodi: CTE Scan, CTE generatio seu Seq Scan secundum aliquod signum.

Haec est abbreviata repraesentatio quam vocamus consilio template.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Quid aliud opportunum foret? Commodum erit videre quaenam totius nostri temporis pars in qua nodi partita sit, et modo ad latus "haero". Pie chart.

In nodo monstramus et videmus - evenit ut Seq Scan minus quam quartam totius temporis acceperit, et reliquae 3/4 a Scan CTE captae sint. Horror! Haec nota parva est de "rate ignis" CTE Scan si eas in quaestionibus tuis active uteris. Ieiunium non sunt valde β€” inferiores sunt etiam regulari mensae intuens. [articulus] [articulus]

Sed plerumque huiusmodi schemata sunt magis interesting, magis implicata, cum statim segmentum designamus et videmus, exempli gratia, quod plusquam dimidium temporis aliquid Seq Scan "comedit". Praeterea Filtrae intus quaedam erat, multa monumenta iuxta eam abiecta sunt... Hanc imaginem in elit protinus iactare potes et dices: β€œVasya, omnia hic tibi mala sunt! Instar is, vide - quid mali est!"

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Naturaliter implicati sunt quidam "rastri".

Primum illud invenimus fuit quaestio rotunditas. Tempus nodi cuiusque consilii subtiliter 1 ΞΌs indicatur. Et cum numerus cyclorum nodi excedit, exempli gratia, 1000 - post executionem PostgreSQL divisum "intra accurationem", tum cum computandi reditum totum tempus "alicubi inter 0.95ms et 1.05ms" obtinetur. Cum comes ad microseconds accesserit, id bene est, sed cum secundis iam [milli] secundis, hanc informationem rationem habere debes cum facultates "solvendi" nodis "quantum" consilii consumpserunt.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Secundum punctum, magis implicatum, est distributio facultatum inter nodos dynamicos. Hoc nobis constat primas 2 septimanas prototypi plus alterae 4 hebdomadae.

Hoc genus problematis satis facile est - facimus CTE et quasi aliquid in eo legi. Re vera, PostgreSQL est "dolor" et nihil illic directe leget. Deinde sumimus primum testimonium inde, et ad ipsum centesimum et primum ab eodem CTE.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Consilium spectamus et intellegimus - mirum est, habemus 3 buffers (paginae datae) "consumi" in Seq Scan, 1 plura in CTE Scan, et 2 plura in secundo CTE Scan. Hoc est, si omnia simpliciter perstringamus, 6 impetrabimus, sed ex tabula tantum 3 legimus! CTE Scan nihil usquam non legit, sed memoriam processus directe operatur. Hoc est, plane falsum est aliquid!

Revera evenit ut hic omnes 3 paginae notitiarum, quae ab Seq Scan petitae sunt, primum 1 petierint 1 CTE Scan, deinde 2 et 2 plura ei recitata sint, id est, summa. 3 paginae datae lectae sunt, non 6 paginae.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Et haec imago nos adduxit ad intellegendum executionem consilii iam non esse arborem, sed tantum quandam graphi acyclici speciem. Et sic figuram sumpsimus, ut intelligamus quid primo loco factum sit. Hoc est, hic CTE ex pg_classe creavimus, et id bis petivimus, ac fere totus temporis nostri in ramo consumptus est, cum id tempus 2 quaesivimus. Perspicuum est legere 101 ingressum multo esse cariorem quam mox legere primum ingressum e tabula.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

aliquamdiu exhalavimus. Dicunt: β€œNunc, Neo, scis kung fu! Nunc experientia nostra in screen tuo est. Iam eo uti potes". [articulus]

Stipes consolidationis

Nostri 1000 tincidunt suspirium subsidio spirabant. Sed intelleximus nos tantum centum "pugnae" habere servos, et hoc totum "exemplari crustulum" ex parte tincidunt minime convenit. Intelleximus nosmet ipsos colligere.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Communiter norma moduli est qui statisticas colligere potest, tamen etiam acturi debet in config-is modulus pg_stat_statements. Sed nobis non convenit.

Uno modo, earundem quaestionibus, diversis machinis in eisdem datorum instrumentis utendo alia QueryIds. Hoc est, si primum SET search_path = '01'; SELECT * FROM user LIMIT 1;Et deinde SET search_path = '02'; et eadem postulatio, tunc statistica huius moduli varias tabulas habebunt, et non poterit generales statisticas specialiter in contextu huius petitionis profano colligere, neglectis technis.

Secundum quod prohibuit nos ab usu esse an desunt nobis consilia. Hoc est, nullum est consilium, ibi est sola petitio ipsa. Quid retardatio videmus, sed cur non intellegimus. Et hic ad problema dataset celeritatis mutandae revertimus.

Extremum et momentum - inopia "facta". Hoc est, instantiam interrogationis exsecutionis specificae appellare non potes - nulla est, tantum statistica aggregata est. Licet hoc operari, difficillimum est.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Ideo placuit crustulum pugnare et scribere exactionum coactore.

Collector per SSH coniungit, securam nexum cum servo cum datorum libello utente constituit, et tail -F "haeret" ei in tabella stipes. Ita in hac sessione dabimus tibi totum "speculum" totius stipes limaquem ministrans generat. Onus servitoris ipsum minimum est, quia nihil ibi parse, negotiationem modo imitari debemus.

Cum iam scribere coepimus interface in Node.js, collectorem in ea scribere perreximus. Et haec technica haec technologia se iustificavit, quia valde commodum est uti JavaScript ad operandum cum textu textui formato debili, quod est stipes. Et Node.js infrastructura ipsa quasi suggestum backend permittit te facile et commode operari cum retis nexus, immo cum quibusvis fluminibus data.

Duos itaque nexus extendimus: primum ipsum lignum audi et ad nos ipsum sume, alterum ad basim periodice quaeramus. "At stipes ostendit signum cum oid 123 obstructum", sed hoc nihil significat in elit, et pulchrum esset datorum quaerere, "Quid est OID = 123 usquam?" Itaque interdum turpia quaerimus quod de nobis nondum scimus.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

"Unum solum est quod rationem non habuisti, species apium elephantorum est!..". Hanc rationem evolvere coepimus cum 10 ministrantibus monitori vellemus. Maxime critica in intellectu nostro est, ubi nonnullae difficultates ortae sunt, quae difficiles sunt. Sed inter primam quartam partem centum vigilantiae recepimus - quia ratio operata, omnes desiderabant, omnes commoda erant.

Haec omnia addenda sunt, notitiae fluunt magnae et activae. Nam quod admonemus, quid tractemus, id quod utimur. Etiam PostgreSQL utimur pro repositione notitia. Nihil autem velocius est notitias "fundere" in illud quam operans COPY Nondum.

Sed simpliciter "fundare" notitia nostra non est realiter technology. Quia si petitiones circiter 50k in centum servientibus secundo secundo habebis, hoc 100-150GB lignarum per diem generabit. Ergo basi diligenter "secare".

Uno modo fecimus partiare per diemquia et magna nemo interest dierum. Quid interest, quid heri habueris, si hac nocte novam versionem applicationis evolvit - et iam aliquid novi mutant.

Secundo didicimus. valde, celerrime scribere utens COPY. Hoc est, non solum COPYquia velocior INSERTatque etiam citius.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Tertium punctum - to habui triggers relinquere, respective, et claves alienas. Hoc est, nullam prorsus integritatem referentes habemus. Quia si mensam habes quae par FKs habet, et dicis in structura database quod "hic est index index qui a FK referatur, exempli gratia, ad coetum tabularum," tum cum inseres, PostgreSQL nihil habet nisi quomodo capiat et faciat honeste SELECT 1 FROM master_fk1_table WHERE ... cum identificatorio quod inserere conaris - tantum reprehendo quod hoc testimonium ibi praesens est, quod non "abrumpere" hanc Clavem Alienam cum insertione tua.

Pro uno monumento ad tabulam scopo eiusque indices, additam utilitatem legendi ex omnibus tabulis, quae ad eum pertinent, obtinemus. Sed hoc omnino non opus est - opus nostrum quam maxime et quam celerrime cum minimo onere referre. Ita FK - descendit!

Sequitur illud aggregatio et hashing. Initio eas in datorum inseruimus - tamen statim convenit ut, cum recordum venerit, in tabula aliqua id faciam. "Plus unum" rectum in felis. Opportunum est, sed idem malum - unum testimonium inseris, sed aliud ex alia tabula legere et scribere cogeris. Praeterea non solum tu legeris et scribis, sed etiam omni tempore facis.

Nunc finge te habere mensam in qua simpliciter numeras numerum petitionum quae per certum exercitum transierunt; +1, +1, +1, ..., +1. Et tu, in principio, hoc non opus est - omnia possibilia sunt perorare in memoriam in collectori et mitte datorum in go +10.

Ita, in quibusdam quaestionibus, integritas logica tua potest "discidere", sed hic casus paene univocus est - quia servo normali habes, machinam in moderatoris habet, transactionem habes, stipes in fasciculi systematis... In genere, non pretium est. Damnum fructibus quod accipis a currendo triggers/FK non est operae pretium quod incurras.

Idem est cum hashing. Quaedam petitio ad te volat, quendam identificantem ab eo in datorum computas, datorum scribe, et tunc omnibus indica. Omnia praeclara sunt, donec in tempore recordationis alter ad te veniat, qui hoc idem referre cupit - et te impediri, et hoc iam malum est. Si ergo generatio alicuius IDs ad clientem transferre potest (relativum datorum), melius est hoc facere.

Perfectum erat nobis pro MD5 uti ex textu - petitio, consilium, template, ... in parte collectoris computamus, et "funde" id praeparatum in datorum datorum. Longitudo MD5 et cottidiana partitione permittit nos de conflictionibus possibilibus solliciti esse.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Sed ad haec omnia cito scribenda, opus est ipsum agendi modum mutare.

Quomodo plerumque data scribere? Dataset quaedam habemus, eam in plures tabulas scindimus, ac deinde eam in primam, deinde in secundam, in tertiam in tertiam. continue. Injucundus. Potestne fieri ocius? Can!

Ad quod faciendum, satis est has influitates inter se parallelas dissolui. Evenit ut errores, petitiones, templates, obstructiones, ... sequela in fila separata - et omnia in parallela scribimus. Hoc satis est habere exemplar alveum assidue pateat pro singulis singula mensae scopo.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Hoc est, in decumano illic 'semper amnisin quos possum scribere notitias quae debeo. Sed ut haec notitia datorum videt, et aliquis exspectans hanc notam scribendam non haerere; EXEMPLAR quibusdam intervallis interruptus est. Nobis enim tempus efficacissimum erat circiter 100ms β€” eam claudimus et statim iterum eandem mensam aperimus. Et si in aliquibus cacuminibus non satis unum fluit, tunc ad certum terminum componis.

Accedit quod pro tali onere profile, quamlibet aggregationem, cum monumentis in batches colligitur, malum esse deprehendimus. Classic malum est INSERT ... VALUES et amplius M monumentis. Quia in illo puncto apicem scribe in instrumentis habes, et omnes alii scribentes aliquid in orbe exspectabunt.

Ad huiusmodi anomalias tollendas, simpliciter aliquid non aggregatum; omnino non buffer. Et si in disco quiddam occurrit (Fortune, Stream API in Node.js permittit ut cognoscas) β€” hanc connexionem differ. Cum rem liberam iterum accipias, scribe ex congesta queue. Et dum occupat, alterum e stagno sume et ei scribe.

Priusquam accessum ad notas memorandas introduceremus, habuimus ops proxime 4K scribere, et hoc modo onus per 4 tempora redegi. Nunc alia 6 tempora creverunt propter novas databases monitores - usque ad 100MB/s. Nunc autem ligna condimus proximis 3 mensibus in volumine 10-15TB circiter, sperans in tribus mensibus justo quaelibet elit problema solvere poterit.

Intelligimus difficultates

Simpliciter autem colligendo omnia haec notitia bona, utilis, pertinentia, sed non satis β€” intellegi debet. Quia haec decies centena milia diversorum consiliorum per diem sunt.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Sed decies centena millia intractabiles sunt, primum oportet nos "minores" facere. Ac ante omnia decernere debes quomodo rem hanc "minorem" institues.

Tria cardinis puncta notavimus:

  • qui hanc petitionem
    Id est, ex qua applicatione "venire" fecit: interface, backend, solutionis ratio vel aliquid aliud.
  • quibus Accidit
    De quo servo proprio? Quia si plures ministros sub una applicatione habes, et subito unus "stultus" (quia "putris orbis est", "memoria emanavit", alia quaestio), tunc necesse est ut servo nominatim compellas.
  • quam quaestio manifestatur uno modo vel alio

Ad intellegendum "quis" petitionem nobis misit, utimur instrumento vexillum - sessionem variabilem constituendo: SET application_name = '{bl-host}:{bl-method}'; β€” mittimus nomen negotii logicae militiae a quo petitio venit, et nomen methodi seu applicationis quae initiatur.

Postquam "dominus" petitionis egimus, necesse est ut stipes outputare debeat - hoc enim variabilem configuramus. log_line_prefix = ' %m [%p:%v] [%d] %r %a'. Illis interested fortasse respice in manualquid sibi velit. Evenit quod videmus in sextario:

  • врСмя
  • processus et transaction identifiers
  • database nomen
  • IP qui misit hanc petitionem
  • ac modum nomine

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Tunc intelleximus non multum interest videre relationem pro uno rogatu inter diversos servientes. Saepe non est condicionem habere ubi una applicationis cochleae aeque passim. Sed etsi idem est, aliquem ex his ministris aspice.

Hic ergo est cut "Unus servo - unus dies" satis nobis evasit ad aliquam explicationem.

Prima analytica sectio idem est "specimen" β€” Forma compendiosa praesentationis consilii, omnibus indicibus numeralibus purgata. Secunda incisa est applicationis seu methodus, et tertius incisus est certae rationis nodi quae nos difficultates effecit.

Cum ab instantiis specificis ad templates, duo simul commoda cepimus;

  • multa deminuto numero obiecti ad analysis
    Quaestionem resolvere non iam per milia quaesitorum aut consiliorum habemus, sed per dozens of templates.
  • timeline
    Id est, facta in quadam sectione summando, eorum aspectum interdiu exhibere potes. Et hic intelligis quod si habes aliquod exemplar quod fit, verbi gratia semel in hora, sed si semel in die, cogitas quid erraverit - quis fecerit et cur forte hic sit. non debet. Alia est haec methodus non numeralis, mere visualis, analysis.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Reliquae rationes fundantur in indicibus quos ex consilio elicimus: quotiens tale exemplar occurrit, totum et medium tempus, quantum notitia de orbe lecta est, et quantum ex memoria...

Quia, exempli gratia, ad analyticam paginam hospitio venis, vide - aliquid incipit legere nimium in orbe. Orbis in servo eum tractare non potest - Quis ex eo legit?

Et per quamlibet columnam poteris disponere et statuere quid nunc agas - onus in processus vel orbis, vel summam petitionum numerum. novam versionem applicationis advolvit.
[video lecture]

Et statim videre potes applicationes varias quae cum eodem template, ex petitione simili veniunt SELECT * FROM users WHERE login = 'Vasya'. Frontend, backend, processus... Et miraris cur processus legeret utentem si non penitus cum eo.

Oppositum statim est videre ex applicatione quid facit. Verbi gratia, frontend est hoc, hoc, hoc, et hoc semel in hora. Protinus oritur quaestio: videtur simile non esse frontendi officium facere aliquid semel in hora...

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Post aliquod tempus intelleximus aggregata nos defuisse mutant in consilio lymphaticorum. Solamus a consiliis nodi tantum qui aliquid agunt cum ipsis tabulis (legi/indice vel non scribe eas). Re quidem vera una tantum additur aspectus respectu imaginis praecedentis. quot monumenta haec nodi attulerunt?et quot abiecti sunt (Rows Remove by Filter).

Aptum indicem in tabula non habes, rogas eum, fugit indicem, cadit in Seq Scan... omnia monumenta praeter unum eliquasti. Cur 100M monumentis per dies eliquatis opus est?Nonne satius est indicem volvere?

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Cum omnia consilia nodi per nodi enucleata, intelleximus quasdam structuras typicas esse in consiliis quae suspecta sunt valde verisimile. Et tincidunt elit indicare esset: "Amice, hic primum lege indicem, deinde genus, et deinde abscinde" - ut fere unum est testimonium.

Omnes qui interrogationes scripserunt probabiliter hoc exemplum offendit: "Da mihi ultimum ordinem Vasya, tempus suum." Et si indicem ad tempus non habes, aut nullum diem in indice quo es usus, tunc eris. prorsus in eadem step "rase".

Scimus autem hoc "rasculum" esse - cur non statim narrare elit quid faciendum sit. Itaque, cum nunc consilium aperiens, elit noster statim pulchram picturam cum apicibus videt, ubi illi statim dicunt: β€œHabes hic et illic difficultates, sed huc atque illuc solventur”.

Quam ob rem moles experientiae quae in principio solvendis quaestionibus necessaria erat et nunc significanter incidit. Hoc genus instrumenti habemus.

Moles Optimization of PostgreSQL queries. Kirill Borovikov (Tensor)

Source: www.habr.com