{"id":36704,"date":"2019-10-31T22:13:15","date_gmt":"2019-10-31T19:13:15","guid":{"rendered":"https:\/\/prohoster.info\/blog\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej\/"},"modified":"2019-10-31T22:13:15","modified_gmt":"2019-10-31T19:13:15","slug":"optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej","title":{"rendered":"Optimizarea interog\u0103rilor de baz\u0103 de date pe exemplul unui serviciu B2B pentru constructori","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Cum po\u021bi cre\u0219te de 10 ori num\u0103rul de interog\u0103ri c\u0103tre baza de date f\u0103r\u0103 a trece pe un server mai performant \u0219i p\u0103str\u00e2nd func\u021bionalitatea sistemului? Voi povesti despre cum am comb\u0103tut sc\u0103derea performan\u021bei bazei noastre de date, cum am optimizat interog\u0103rile SQL pentru a deservi c\u00e2t mai mul\u021bi utilizatori f\u0103r\u0103 a cre\u0219te costurile resurselor de calcul.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nFac un serviciu pentru gestionarea proceselor de afaceri \u00een companiile de construc\u021bii. Colaboreaz\u0103 cu noi aproximativ 3.000 de companii. Peste 10.000 de persoane folosesc sistemul nostru zilnic timp de 4-10 ore. Rezolv\u0103 diverse sarcini de planificare, notificare, avertizare, validare\u2026 Folosim PostgreSQL 9.6. \u00cen baza de date avem aproximativ 300 de tabele, iar zilnic primim p\u00e2n\u0103 la 200 milioane de interog\u0103ri (10.000 diferite). \u00cen medie avem 3-4.000 de interog\u0103ri pe secund\u0103, iar \u00een cele mai active momente, mai mult de 10.000 de interog\u0103ri pe secund\u0103. Majoritatea interog\u0103rilor sunt OLAP. Ad\u0103ug\u0103rile, modific\u0103rile \u0219i \u0219tergerile sunt mult mai pu\u021bine, adic\u0103 \u00eenc\u0103rc\u0103tura OLTP este relativ mic\u0103. Toate aceste cifre le-am men\u021bionat pentru a putea evalua amploarea proiectului nostru \u0219i a \u00een\u021belege c\u00e2t de util poate fi experien\u021ba noastr\u0103 pentru voi.<\/p>\n<h3>Imaginea \u00eent\u00e2i. Liric\u0103<\/h3>\n<p>\nC\u00e2nd am \u00eenceput dezvoltarea, nu ne-am g\u00e2ndit prea mult la ce \u00eenc\u0103rcare va suporta baza de date \u0219i ce vom face dac\u0103 serverul nu va mai putea face fa\u021b\u0103. C\u00e2nd am proiectat baza de date, am urmat recomand\u0103rile generale \u0219i ne-am str\u0103duit s\u0103 nu ne facem singuri r\u0103u, dar mai departe de recomand\u0103rile generale cum ar fi \u201enu utiliza\u021bi modelul <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity%E2%80%93attribute%E2%80%93value_model\">Entity Attribute Values<\/a><\/noindex> nu am avansat. Am proiectat av\u00e2nd \u00een vedere principiile normaliz\u0103rii, evit\u00e2nd redundan\u021ba datelor \u0219i f\u0103r\u0103 a ne \u00eengrijora de accelerarea anumitor interog\u0103ri. Odat\u0103 ce au venit primii utilizatori, ne-am confruntat cu probleme de performan\u021b\u0103. Ca de obicei, nu am fost deloc preg\u0103ti\u021bi pentru asta. Primele probleme au fost simple. De obicei, totul s-a rezolvat prin ad\u0103ugarea unui nou index. Dar a venit un moment c\u00e2nd solu\u021biile simple au \u00eencetat s\u0103 mai func\u021bioneze. Realiz\u00e2nd c\u0103 ne lipse\u0219te experien\u021ba \u0219i c\u0103 ne este din ce \u00een ce mai greu s\u0103 \u00een\u021belegem cauzele problemelor, am angajat speciali\u0219ti care ne-au ajutat s\u0103 configur\u0103m corect serverul, s\u0103 conect\u0103m monitorizarea \u0219i ne-au ar\u0103tat unde s\u0103 ne uit\u0103m pentru a ob\u021bine <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/9.6\/pgstatstatements.html\">statistic\u0103<\/a><\/noindex>.<\/p>\n<h3>Imaginea a doua. Statistic\u0103<\/h3>\n<p>\nA\u0219adar, avem aproximativ 10.000 de cereri diverse care se execut\u0103 \u00een baza noastr\u0103 de date \u00eentr-o zi. Dintre cele 10.000, exist\u0103 mon\u0219tri care se execut\u0103 de 2-3 milioane de ori, cu un timp mediu de execu\u021bie de 0,1-0,3 ms, \u0219i cereri cu un timp mediu de execu\u021bie de 30 de secunde, care sunt apelate de 100 de ori pe zi.<\/p>\n<p>Optimizarea tuturor celor 10.000 de cereri nu a fost posibil\u0103, a\u0219a c\u0103 am decis s\u0103 ne concentr\u0103m asupra aspectelor unde putem direc\u021biona eforturile pentru a \u00eembun\u0103t\u0103\u021bi performan\u021ba bazei de date \u00een mod corespunz\u0103tor. Dup\u0103 c\u00e2teva itera\u021bii, am \u00eenceput s\u0103 clasific\u0103m cererile pe tipuri.<\/p>\n<h4>CERERILE TOP<\/h4>\n<p>\nAcestea sunt cele mai grele cereri, care consum\u0103 cel mai mult timp (timp total). Acestea sunt cereri care fie sunt foarte frecvente, fie cereri care dureaz\u0103 foarte mult s\u0103 se execute (cereri lungi \u0219i frecvente au fost optimizate \u00eenc\u0103 de la primele itera\u021bii \u00een c\u0103utarea vitezei). Ca rezultat, serverul cheltuie cel mai mult timp pentru executarea lor. Este important s\u0103 separ\u0103m cererile de top dup\u0103 timpul total de execu\u021bie \u0219i separat dup\u0103 timpul IO. Metodele de optimizare a acestor cereri sunt pu\u021bin diferite.<\/p>\n<p>Practicile obi\u0219nuite ale tuturor companiilor constau \u00een a lucra cu cererile TOP. Acestea sunt pu\u021bine, optimizarea chiar \u0219i a unei singure cereri poate elibera 5-10% din resurse. Totu\u0219i, pe m\u0103sur\u0103 ce proiectul \u201e\u00eemb\u0103tr\u00e2ne\u0219te\u201d, optimizarea cererilor TOP devine o sarcin\u0103 din ce \u00een ce mai complicat\u0103. Toate metodele simple au fost deja aplicate, iar cea mai \u201egreu\u201d cerere consum\u0103 \u201edoar\u201d 3-5% din resurse. Dac\u0103 cererile TOP, \u00een total, reprezint\u0103 mai pu\u021bin de 30-40% din timp, este foarte probabil c\u0103 deja a\u021bi depus eforturi pentru a le face s\u0103 func\u021bioneze rapid \u0219i a venit momentul s\u0103 trece\u021bi la optimizarea cererilor din urm\u0103toarea grup\u0103.<br \/>\nR\u0103m\u00e2ne de r\u0103spuns la \u00eentrebarea c\u00e2te cereri de top s\u0103 includem \u00een aceast\u0103 grup\u0103. De obicei, iau nu mai pu\u021bin de 10, dar nu mai mult de 20. \u00cencerc s\u0103 m\u0103 asigur c\u0103 timpul primului \u0219i celui din urm\u0103 din grup\u0103 TOP difer\u0103 cu nu mai mult de 10 ori. A\u0219adar, dac\u0103 timpul de execu\u021bie al cererilor scade brusc de la locul 1 la 10, iau TOP-10; dac\u0103 sc\u0103derea este mai lin\u0103, atunci m\u0103resc dimensiunea grupului la 15 sau 20.<br \/>\n<img decoding=\"async\" alt=\"Optimizarea interog\u0103rilor de baz\u0103 de date pe exemplul unui serviciu B2B pentru constructori\" src=\"\/wp-content\/uploads\/2019\/08\/2a9d9e6053d1aebb71aa213757bd2393.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>Cererile medii<\/h4>\n<p>\nAcestea sunt toate cererile care vin imediat dup\u0103 cererile TOP, cu excep\u021bia ultimelor 5-10%. De obicei, \u00een optimizarea acestor cereri se afl\u0103 oportunitatea de a cre\u0219te semnificativ performan\u021ba serverului. Aceste cereri pot \u201eintra\u201d p\u00e2n\u0103 la 80%. Dar chiar dac\u0103 ponderea lor dep\u0103\u0219e\u0219te 50%, \u00eenseamn\u0103 c\u0103 este timpul s\u0103 le privim mai atent.<\/p>\n<h4>Coad\u0103<\/h4>\n<p>\nA\u0219a cum a fost men\u021bionat, aceste interog\u0103ri sunt la final \u0219i dureaz\u0103 5-10% din timp. Le po\u021bi uita, doar dac\u0103 nu folose\u0219ti instrumente automate de analiz\u0103 a interog\u0103rilor, atunci optimizarea lor poate fi ieftin\u0103.<\/p>\n<p>Cum s\u0103 evalu\u0103m fiecare grup\u0103?<\/p>\n<p>Folosesc o interogare SQL, care ajut\u0103 la evaluarea acesteia pentru PostgreSQL (sunt sigur c\u0103 pentru multe alte SGBD-uri se poate scrie o interogare similar\u0103).<\/p>\n<p><b class=\"spoiler_title\">Interogare SQL pentru evaluarea dimensiunii grupelor TOP-MEDIUM-TAIL<\/b><\/p>\n<pre><code class=\"sql\">SELECT sum(time_top) AS sum_top, sum(time_medium) AS sum_medium, sum(time_tail) AS sum_tail\nFROM\n(\n  SELECT CASE WHEN rn  20 AND rn  800 THEN tt_percent ELSE 0 END AS time_tail\n  FROM (\n    SELECT total_time \/ (SELECT sum(total_time) FROM pg_stat_statements) * 100 AS tt_percent, query,\n    ROW_NUMBER () OVER (ORDER BY total_time DESC) AS rn\n    FROM pg_stat_statements\n    ORDER BY total_time DESC\n  ) AS t\n)\nAS ts\n<\/code><\/pre>\n<p>Rezultatul interog\u0103rii - trei coloane, fiecare con\u021bin\u00e2nd procentajul de timp care este folosit pentru procesarea interog\u0103rilor din acest grup. \u00cen interiorul interog\u0103rii sunt dou\u0103 numere (\u00een cazul meu, acestea sunt 20 \u0219i 800), care separ\u0103 interog\u0103rile unei grupe de alta.<\/p>\n<p>A\u0219a arat\u0103 propor\u021biile interog\u0103rilor la \u00eenceputul lucr\u0103rilor de optimizare \u0219i acum.<\/p>\n<p><img decoding=\"async\" alt=\"Optimizarea interog\u0103rilor de baz\u0103 de date pe exemplul unui serviciu B2B pentru constructori\" src=\"\/wp-content\/uploads\/2019\/08\/9c70ad9aba8b835c94729c9dda656eab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDin diagram\u0103 se observ\u0103 c\u0103 ponderea interog\u0103rilor TOP a sc\u0103zut brusc, \u00een schimb au crescut \u201eintermediarele\u201d.<br \/>\nLa \u00eenceput, interog\u0103rile TOP con\u021bineau evidente erori. \u00cen timp, bolile copil\u0103riei au disp\u0103rut, ponderea interog\u0103rilor TOP a sc\u0103zut, a fost necesar s\u0103 depunem din ce \u00een ce mai multe eforturi pentru a accelera interog\u0103rile dificile. <\/p>\n<p><b class=\"spoiler_title\">Pentru a ob\u021bine textul interog\u0103rilor, folosim urm\u0103toarea interogare.<\/b><\/p>\n<pre><code class=\"sql\">SELECT * FROM (\n  SELECT ROW_NUMBER () OVER (ORDER BY total_time DESC) AS rn, total_time \/ (SELECT sum(total_time) FROM pg_stat_statements) * 100 AS tt_percent, query\n  FROM pg_stat_statements\n  ORDER BY total_time DESC\n) AS T\nWHERE\nrn  20 AND rn  800  -- TAIL\n<\/code><\/pre>\n<p>Iat\u0103 lista celor mai frecvent utilizate metode, care ne-au ajutat s\u0103 acceler\u0103m interog\u0103rile TOP:<\/p>\n<ul>\n<li>Redesign al sistemului, de exemplu, refacerea logicii notific\u0103rilor pe un message broker \u00een loc de interog\u0103ri periodice c\u0103tre baza de date.<\/li>\n<li>Ad\u0103ugarea sau modificarea indec\u0219ilor.<\/li>\n<li>Rescrierea interog\u0103rilor ORM \u00een SQL simplu.<\/li>\n<li>Rescrierea logicii de \u00eenc\u0103rcare lazy a datelor.<\/li>\n<li>Cache prin denormalizarea datelor. De exemplu, avem o leg\u0103tur\u0103 \u00eentre tabelele Livrare -&gt; Factur\u0103 -&gt; Interogare -&gt; Cerere. Asta \u00eenseamn\u0103 c\u0103 fiecare livrare este legat\u0103 de o cerere prin alte tabele. Pentru a nu lega toate tabelele \u00een fiecare interogare, am duplicat referin\u021ba la cerere \u00een tabela Livrare.<\/li>\n<li>Cache-ul tabelelor statice cu referin\u021be \u0219i tabele rareori modificate \u00een memoria programului.<\/li>\n<\/ul>\n<p>\nUneori, modific\u0103rile duceau la un redesign semnificativ, dar ofereau o reducere de 5-10% a sarcinii sistemului \u0219i erau justificate. Cu timpul, beneficiile deveneau din ce \u00een ce mai mici, iar redesignul necesita o aten\u021bie mai serioas\u0103.<\/p>\n<p>Atunci am observat a doua grup\u0103 de cereri - grupul mijlociu. Aceasta con\u021binea mult mai multe cereri \u0219i p\u0103rea c\u0103 analiza \u00eentregii grupe va dura foarte mult timp. Cu toate acestea, majoritatea cererilor s-au dovedit a fi foarte simple pentru optimizare, iar multe probleme se repetau zeci de ori \u00een diverse varia\u021bii. Iat\u0103 exemple de optimiz\u0103ri tipice pe care le-am aplicat la zeci de cereri asem\u0103n\u0103toare, fiecare grup\u0103 de cereri optimizate reduc\u00e2nd sarcina bazei de date cu 3-5%.<\/p>\n<ul>\n<li> \u00cen loc s\u0103 verific\u0103m existen\u021ba \u00eenregistr\u0103rilor prin COUNT \u0219i s\u0103 facem o scanare complet\u0103 a tabelei, am \u00eenceput s\u0103 folosim EXISTS.\n <\/li>\n<li>Ne-am descurcat de DISTINCT (nu exist\u0103 o re\u021bet\u0103 universal\u0103, dar uneori se poate renun\u021ba la el cu u\u0219urin\u021b\u0103, acceler\u00e2nd cererea de 10-100 de ori).\n<p>De exemplu, \u00een loc de cererea pentru extragerea tuturor \u0219oferilor dintr-o mare tabel\u0103 de livr\u0103ri (DELIVERY) <\/p>\n<pre><code class=\"sql\">SELECT DISTINCT P.ID, P.FIRST_NAME, P.LAST_NAME\nFROM DELIVERY D JOIN PERSON P ON D.DRIVER_ID = P.ID\n<\/code><\/pre>\n<p>\nam realizat cererea pe o tabel\u0103 relativ mic\u0103 de PERSON<\/p>\n<pre><code class=\"sql\">SELECT P.ID, P.FIRST_NAME, P.LAST_NAME\nFROM PERSON\nWHERE EXISTS(SELECT D.ID FROM DELIVERY WHERE D.DRIVER_ID = P.ID)\n<\/code><\/pre>\n<p>\nP\u0103rea c\u0103 am folosit un subquery corelat, dar acesta ofer\u0103 un avans de peste 10 ori.\n <\/li>\n<li>\u00cen multe cazuri am renun\u021bat complet la COUNT \u0219i <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.citusdata.com\/blog\/2016\/10\/12\/count-performance\/#dup_counts_estimated_filtered\">am \u00eenlocuit-o cu o estimare aproximativ\u0103.<\/a><\/noindex>\n <\/li>\n<li>\u00een loc de\n<pre><code class=\"sql\">UPPER(s) LIKE JOHN% \n<\/code><\/pre>\n<p>\nfolosim <\/p>\n<pre><code class=\"sql\">s ILIKE \u201cJohn%\u201d,\n<\/code><\/pre>\n<p>\n <\/li>\n<\/ul>\n<p>\nFiecare cerere specific\u0103 a fost accelerat\u0103 de 3-1000 de ori. \u00cen ciuda statisticilor impresionante, la \u00eenceput ne-a p\u0103rut c\u0103 nu are sens optimizarea unei cereri care se execut\u0103 \u00een 10 ms, se afl\u0103 \u00een a treia sut\u0103 dintre cele mai grele cereri \u0219i \u00een ansamblul timpului de \u00eenc\u0103rcare a bazei de date ocup\u0103 procente mici. Dar aplic\u00e2nd aceea\u0219i re\u021bet\u0103 unui grup de cereri omogene, ne-am rec\u00e2\u0219tigat c\u00e2teva procente. Pentru a nu pierde timp cu vizionarea manual\u0103 a tuturor sutelor de cereri, am scris c\u00e2teva scripturi simple care, prin expresii regulate, g\u0103seau cereri similare. Ca rezultat, c\u0103utarea automat\u0103 a grupurilor de cereri ne-a permis s\u0103 \u00eembun\u0103t\u0103\u021bim \u0219i mai mult performan\u021ba noastr\u0103, investind eforturi modeste.<\/p>\n<p>\u00cen cele din urm\u0103, am lucrat timp de trei ani pe acela\u0219i hardware. Sarcina medie zilnic\u0103 este de aproximativ 30%, iar \u00een momentele de v\u00e2rf ajunge la 70%. Num\u0103rul de solicit\u0103ri, la fel ca \u0219i num\u0103rul de utilizatori, a crescut de aproximativ 10 ori. \u0218i toate acestea datorit\u0103 monitoriz\u0103rii constante a grupurilor de solicit\u0103ri TOP-MEDIUM. De \u00eendat\u0103 ce apare o nou\u0103 solicitare \u00een grupul TOP, o analiz\u0103m imediat \u0219i \u00eencerc\u0103m s\u0103 o acceler\u0103m. Grupul MEDIUM este revizuit o dat\u0103 pe s\u0103pt\u0103m\u00e2n\u0103 cu ajutorul scripturilor de analiz\u0103 a solicit\u0103rilor. Dac\u0103 g\u0103sim noi solicit\u0103ri pe care \u0219tim deja cum s\u0103 le optimiz\u0103m, le modific\u0103m rapid. Uneori g\u0103sim noi metode de optimizare care pot fi aplicate imediat mai multor solicit\u0103ri. <\/p>\n<p>Conform prognozelor noastre, serverul actual va suporta o cre\u0219tere a num\u0103rului de utilizatori de \u00eenc\u0103 3-5 ori. Cu toate acestea, mai avem un atu \u00een m\u00e2nec\u0103 - nu am migrat \u00eenc\u0103 solicit\u0103rile SELECT pe oglind\u0103, a\u0219a cum se recomand\u0103. Dar nu facem acest lucru \u00een mod con\u0219tient, deoarece dorim s\u0103 epuiz\u0103m mai \u00eent\u00e2i posibilit\u0103\u021bile de optimizare \u201einteligent\u0103\u201d, \u00eenainte de a activa \u201earta grea\u201d.<br \/>\nO privire critic\u0103 asupra muncii efectuate poate sugera utilizarea scal\u0103rii verticale. S\u0103 cump\u0103r\u0103m un server mai puternic, \u00een loc s\u0103 pierdem timpul speciali\u0219tilor. Un server nu poate costa at\u00e2t de mult, mai ales c\u0103 limitele scal\u0103rii verticale nu sunt \u00eenc\u0103 epuizate. Totu\u0219i, num\u0103rul solicit\u0103rilor a crescut de 10 ori. \u00cen c\u00e2\u021biva ani, func\u021bionalitatea sistemului a crescut \u0219i acum variet\u0103\u021bile de solicit\u0103ri s-au \u00eenmul\u021bit. Func\u021bionalitatea existent\u0103, datorit\u0103 memoriz\u0103rii cache, este realizat\u0103 cu un num\u0103r mai mic de solicit\u0103ri, iar dezechilibrat mai eficient. A\u0219adar, putem s\u0103 multiplic\u0103m cu 5 pentru a ob\u021bine un coeficient real de accelerare. Astfel, \u00een cele mai modeste estim\u0103ri, se poate spune c\u0103 accelerarea a fost de 50 de ori sau mai mult. A scala vertical un server de 50 de ori ar costa mai mult. \u00cen special av\u00e2nd \u00een vedere c\u0103 o optimizare realizat\u0103 odat\u0103 func\u021bioneaz\u0103 tot timpul, iar factura pentru serverul \u00eenchiriat vine \u00een fiecare lun\u0103.<br \/>\n<br \/>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/461071\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u0430\u043a \u0432\u044b\u0440\u0430\u0441\u0442\u0438 \u0432 10 \u0440\u0430\u0437 \u043f\u043e\u0434 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0411\u0414 \u043d\u0435 \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u044f \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b? \u042f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u044b \u0431\u043e\u0440\u043e\u043b\u0438\u0441\u044c \u0441 \u043f\u0430\u0434\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0448\u0435\u0439 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u0430\u043a \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 SQL \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043d\u0435 \u043f\u043e\u0432\u044b\u0448\u0430\u0442\u044c \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b. \u042f \u0434\u0435\u043b\u0430\u044e \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":27493,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-36704","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041a\u0430\u043a \u0432\u044b\u0440\u0430\u0441\u0442\u0438 \u0432 10 \u0440\u0430\u0437 \u043f\u043e\u0434 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0411\u0414 \u043d\u0435 \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u044f \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b?\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 B2B \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u0435\u0439 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041a\u0430\u043a \u0432\u044b\u0440\u0430\u0441\u0442\u0438 \u0432 10 \u0440\u0430\u0437 \u043f\u043e\u0434 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0411\u0414 \u043d\u0435 \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u044f \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b?\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:13:15+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:13:15+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Optimizarea interog\u0103rilor de baze de date pe exemplul unui serviciu B2B pentru constructori | ProHoster","description":"Cum s\u0103 cre\u0219ti de 10 ori num\u0103rul de solicit\u0103ri c\u0103tre baza de date f\u0103r\u0103 a trece pe un server mai performant \u0219i s\u0103 men\u021bii func\u021bionalitatea sistemului?","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 B2B \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u0435\u0439 | ProHoster","og:description":"\u041a\u0430\u043a \u0432\u044b\u0440\u0430\u0441\u0442\u0438 \u0432 10 \u0440\u0430\u0437 \u043f\u043e\u0434 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0411\u0414 \u043d\u0435 \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u044f \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b?","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:13:15+00:00","article:modified_time":"2019-10-31T19:13:15+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"36704","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 04:30:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:40:22","updated":"2026-01-22 04:30:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/36704","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=36704"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/36704\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/27493"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=36704"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=36704"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=36704"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}