{"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\/it\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej","title":{"rendered":"Ottimizzazione delle query del database con un esempio di servizio B2B per costruttori","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Come crescere dieci volte il numero di richieste al database senza passare a un server pi\u00f9 potente, mantenendo al contempo la funzionalit\u00e0 del sistema? Vi racconter\u00f2 come abbiamo affrontato il calo delle prestazioni del nostro database, come abbiamo ottimizzato le query SQL per servire il maggior numero possibile di utenti senza aumentare i costi delle risorse di calcolo.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nSto sviluppando un servizio per la gestione dei processi aziendali nelle imprese di costruzione. Operiamo con circa 3.000 aziende. Oltre 10.000 persone utilizzano il nostro sistema ogni giorno, per 4-10 ore. Esso risolve varie attivit\u00e0 di pianificazione, notifiche, avvisi, convalide... Utilizziamo PostgreSQL 9.6. Nel nostro database abbiamo circa 300 tabelle e ogni giorno riceve fino a 200 milioni di richieste (10.000 diverse). In media, abbiamo 3.000-4.000 richieste al secondo, nei momenti di maggior attivit\u00e0 oltre 10.000 richieste al secondo. La maggior parte delle richieste sono OLAP. Aggiunte, modifiche e cancellazioni sono molto meno comuni, quindi il carico OLTP \u00e8 relativamente ridotto. Ho fornito tutte queste cifre affinch\u00e9 possiate valutare la portata del nostro progetto e capire quanto la nostra esperienza possa essere utile per voi.<\/p>\n<h3>Primo quadro. Lirico<\/h3>\n<p>\nQuando abbiamo iniziato lo sviluppo, non ci siamo particolarmente preoccupati del carico che la base dati avrebbe dovuto sostenere e di cosa avremmo fatto se il server non avesse pi\u00f9 retto. Durante la progettazione della base dati, abbiamo seguito raccomandazioni generali e cercato di non spararci sui piedi, ma oltre ai consigli generali come \"non utilizzare il pattern <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity%E2%80%93attribute%E2%80%93value_model\">Entity Attribute Values<\/a><\/noindex> , non siamo andati. Abbiamo progettato sulla base dei principi di normalizzazione, evitando la ridondanza dei dati e non ci siamo preoccupati di velocizzare determinate query. Non appena sono arrivati i primi utenti, ci siamo trovati di fronte a problemi di prestazioni. Come al solito, ci siamo trovati completamente impreparati. I primi problemi sono stati semplici. Di norma, tutto \u00e8 stato risolto con l'aggiunta di un nuovo indice. Ma \u00e8 arrivato un momento in cui le semplici soluzioni hanno smesso di funzionare. Rendendoci conto che non avevamo esperienza e che era sempre pi\u00f9 difficile capire quale fosse la causa dei problemi, abbiamo assunto specialisti che ci hanno aiutato a configurare correttamente il server, collegare il monitoraggio, e ci hanno mostrato dove guardare per ottenere <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/9.6\/pgstatstatements.html\">statistiche<\/a><\/noindex>.<\/p>\n<h3>Secondo quadro. Statistico<\/h3>\n<p>\nAbbiamo circa 10.000 diverse query che vengono eseguite nel nostro database ogni giorno. Di queste 10.000, ci sono mostri che vengono eseguiti 2-3 milioni di volte con tempi di esecuzione medi di 0,1-0,3 ms, e ci sono query con tempi di esecuzione medi di 30 secondi, che vengono chiamate 100 volte al giorno.<\/p>\n<p>Ottimizzare tutte le 10.000 query non era possibile, quindi abbiamo deciso di capire dove concentrare gli sforzi per migliorare correttamente le performance del database. Dopo diverse iterazioni, abbiamo iniziato a suddividere le query in categorie.<\/p>\n<h4>QUERY TOP<\/h4>\n<p>\nQueste sono le query pi\u00f9 pesanti, che richiedono pi\u00f9 tempo (tempo totale). Sono query che vengono chiamate molto frequentemente o query che impiegano molto tempo per essere eseguite (quelle lunghe e frequenti erano state ottimizzate gi\u00e0 nelle prime iterazioni per migliorare la velocit\u00e0). Alla fine, il server spende complessivamente pi\u00f9 tempo per eseguirle. \u00c8 importante distinguere le query top per il tempo di esecuzione totale e separatamente per il tempo IO. I metodi di ottimizzazione per queste query sono leggermente diversi.<\/p>\n<p>\u00c8 pratica comune per tutte le aziende lavorare con le parole chiave TOP. Ce ne sono poche, e l'ottimizzazione anche di una sola parola chiave pu\u00f2 liberare il 5-10% delle risorse. Tuttavia, man mano che il progetto 'cresce', l'ottimizzazione delle parole chiave TOP diventa sempre pi\u00f9 una sfida non banale. Tutti i metodi semplici sono gi\u00e0 stati esauriti, e persino la parola chiave pi\u00f9 'pesante' consuma 'solo' il 3-5% delle risorse. Se le parole chiave TOP occupano complessivamente meno del 30-40% del tempo, \u00e8 probabile che tu abbia gi\u00e0 fatto uno sforzo affinch\u00e9 funzionassero rapidamente, e sia giunto il momento di passare all'ottimizzazione delle parole chiave del gruppo successivo.<br \/>\nRimane da rispondere alla domanda su quante parole chiave nella parte alta includere in questo gruppo. Di solito ne prendo almeno 10, ma non pi\u00f9 di 20. Cerco di fare in modo che il tempo di esecuzione del primo e dell'ultimo nella TOP group non differisca di pi\u00f9 di dieci volte. Cio\u00e8, se il tempo di esecuzione delle query diminuisce nettamente dal primo al decimo posto, prendo il TOP-10; se la diminuzione \u00e8 pi\u00f9 graduale, aumento il numero del gruppo a 15 o 20.<br \/>\n<img decoding=\"async\" alt=\"Ottimizzazione delle query del database con un esempio di servizio B2B per costruttori\" src=\"\/wp-content\/uploads\/2019\/08\/2a9d9e6053d1aebb71aa213757bd2393.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>Parole chiave medie (medium)<\/h4>\n<p>\nQueste sono tutte le query che seguono immediatamente TOP, escluse le ultime 5-10%. Di solito, l'ottimizzazione di queste query offre l'opportunit\u00e0 di migliorare significativamente le prestazioni del server. Queste query possono costituire fino all'80%. Ma anche se la loro percentuale supera il 50%, \u00e8 il momento di osservarle pi\u00f9 da vicino.<\/p>\n<h4>Coda (tail)<\/h4>\n<p>\nCome detto, queste query si trovano alla fine e richiedono il 5-10% del tempo. Possono essere ignorate, a meno che non si utilizzino strumenti analitici automatici; in tal caso, la loro ottimizzazione pu\u00f2 essere comunque a basso costo.<\/p>\n<p>Come valutare ogni gruppo?<\/p>\n<p>Utilizzo una query SQL che aiuta a fare tale valutazione per PostgreSQL (sono sicuro che si possa scrivere una query simile per molti altri DBMS)<\/p>\n<p><b class=\"spoiler_title\">Query SQL per valutare la dimensione dei gruppi 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>Il risultato della query consiste in tre colonne, ciascuna delle quali contiene la percentuale di tempo impiegato per elaborare le richieste di questo gruppo. All'interno della query ci sono due numeri (nel mio caso sono 20 e 800) che separano le richieste di un gruppo dall'altra.<\/p>\n<p>Ecco come si rapportano le quote delle richieste al momento dell'inizio dei lavori di ottimizzazione e adesso.<\/p>\n<p><img decoding=\"async\" alt=\"Ottimizzazione delle query del database con un esempio di servizio B2B per costruttori\" src=\"\/wp-content\/uploads\/2019\/08\/9c70ad9aba8b835c94729c9dda656eab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDal grafico si evince che la quota delle richieste TOP \u00e8 diminuita drasticamente, mentre sono aumentate le \"richieste medie\".<br \/>\nInizialmente, le richieste TOP includevano evidenti errori. Col tempo, i difetti iniziali sono scomparsi, la quota delle richieste TOP si \u00e8 ridotta, e abbiamo dovuto fare sempre pi\u00f9 sforzi per velocizzare le richieste pesanti. <\/p>\n<p><b class=\"spoiler_title\">Per ottenere il testo delle richieste, utilizziamo questa query<\/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>Ecco l'elenco delle tecniche pi\u00f9 comunemente utilizzate che ci hanno aiutato a velocizzare le richieste TOP:<\/p>\n<ul>\n<li>Ridefinire il sistema, ad esempio ripensare la logica delle notifiche su un message broker invece di fare richieste periodiche al database.<\/li>\n<li>Aggiunta o modifica degli indici<\/li>\n<li>Riscrivere le query ORM in SQL puro<\/li>\n<li>Riscrittura della logica di caricamento lazy dei dati<\/li>\n<li>Caching tramite denormalizzazione dei dati. Ad esempio, abbiamo una relazione tra le tabelle Spedizione -&gt; Fattura -&gt; Richiesta -&gt; Domanda. Ogni spedizione \u00e8 collegata alla domanda attraverso altre tabelle. Per evitare di collegare tutte le tabelle in ogni richiesta, abbiamo duplicato il riferimento alla domanda nella tabella Spedizione.<\/li>\n<li>Caching delle tabelle statiche con riferimenti e di quelle che cambiano raramente nella memoria del programma.<\/li>\n<\/ul>\n<p>\nA volte le modifiche iniziavano a richiedere un notevole redesign, ma offrivano solo un aumento del 5-10% nel carico del sistema e risultavano giustificate. Col tempo, i ritorni divenivano sempre minori e si richiedeva un redesign sempre pi\u00f9 serio.<\/p>\n<p>In quel momento abbiamo prestato attenzione al secondo gruppo di richieste, il gruppo degli intermedi. Ci sono molte pi\u00f9 richieste in questo gruppo e sembrava che l'analisi di tutto il gruppo richiedesse molto tempo. Tuttavia, la maggior parte delle richieste si \u00e8 rivelata molto semplice da ottimizzare e molti problemi si ripetevano decine di volte in diverse variazioni. Ecco alcuni esempi di ottimizzazioni tipiche che abbiamo applicato a decine di richieste simili e ogni gruppo di richieste ottimizzate ha ridotto il carico del DB del 3-5%.<\/p>\n<ul>\n<li> Invece di controllare la presenza di record con COUNT e scansionare completamente la tabella, abbiamo iniziato a utilizzare EXISTS\n <\/li>\n<li>Ci siamo liberati di DISTINCT (non esiste una soluzione generale, ma a volte \u00e8 possibile eliminarlo facilmente accelerando la query di 10-100 volte).\n<p>Ad esempio, invece di una query per selezionare tutti i conducenti da una grande tabella di consegne (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>\nabbiamo effettuato la query su una tabella PERSON relativamente piccola<\/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>\nSembrerebbe che avessimo utilizzato una sottoselezione correlata, ma offre un'accelerazione di oltre 10 volte.\n <\/li>\n<li>In molti casi abbiamo completamente abbandonato COUNT e <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.citusdata.com\/blog\/2016\/10\/12\/count-performance\/#dup_counts_estimated_filtered\">sostituito con il calcolo di un valore approssimato<\/a><\/noindex>\n <\/li>\n<li>invece di\n<pre><code class=\"sql\">UPPER(s) LIKE JOHN% \n<\/code><\/pre>\n<p>\nutilizziamo <\/p>\n<pre><code class=\"sql\">s ILIKE \"John%\"\n<\/code><\/pre>\n<p>\n <\/li>\n<\/ul>\n<p>\nSiamo riusciti ad accelerare ogni singola query da 3 a 1000 volte. Nonostante le performance impressionanti, inizialmente pensavamo che non avesse senso ottimizzare una query che impiega 10 ms, che rientra tra le 300 query pi\u00f9 complesse e che occupa solo una frazione percentuale del tempo di carico del database. Applicando la stessa strategia a un gruppo di query simili, siamo riusciti a migliorare il rendimento di alcuni punti percentuali. Per evitare di perdere tempo a controllare manualmente centinaia di query, abbiamo creato alcuni semplici script che, utilizzando espressioni regolari, trovano query simili. Alla fine, la ricerca automatica di gruppi di query ci ha permesso di migliorare ulteriormente le nostre performance con sforzi modesti.<\/p>\n<p>Di fatto, siamo gi\u00e0 tre anni che utilizziamo la stessa infrastruttura. Il carico medio giornaliero \u00e8 di circa il 30%, con punte che arrivano fino al 70%. Il numero di richieste e utenti \u00e8 aumentato di circa 10 volte. E tutto questo grazie al monitoraggio costante dei gruppi di richieste TOP-MEDIUM. Non appena compare una nuova richiesta nel gruppo TOP, la analizziamo immediatamente e cerchiamo di migliorarla. Ogni settimana esaminiamo il gruppo MEDIUM tramite script di analisi delle richieste. Se troviamo nuove richieste che conosciamo gi\u00e0 come ottimizzare, le cambiamo rapidamente. A volte scopriamo nuovi modi di ottimizzazione che possono essere applicati subito a pi\u00f9 richieste. <\/p>\n<p>Secondo le nostre previsioni, il server attuale pu\u00f2 gestire un ulteriore incremento di utenti da 3 a 5 volte. Tuttavia, abbiamo ancora un asso nella manica: non abbiamo ancora trasferito le query SELECT sul mirror, come si raccomanda di fare. Ma lo facciamo intenzionalmente, poich\u00e9 vogliamo prima sfruttare al massimo le opportunit\u00e0 di ottimizzazione 'intelligente' prima di attivare la 'pesante artiglieria'.<br \/>\nUna valutazione critica del lavoro svolto pu\u00f2 suggerire di adottare la scalabilit\u00e0 verticale. Acquistare un server pi\u00f9 potente, anzich\u00e9 far spendere tempo agli specialisti. Un server pu\u00f2 non costare molto, soprattutto considerando che i limiti della scalabilit\u00e0 verticale non sono stati ancora esauriti. Tuttavia, il numero di richieste \u00e8 aumentato di dieci volte. Nel corso degli anni, la funzionalit\u00e0 del sistema \u00e8 cresciuta e ora ci sono pi\u00f9 varianti di richieste. La funzionalit\u00e0 precedente viene ora eseguita con un numero inferiore di richieste grazie alla memorizzazione nella cache, ed \u00e8 anche pi\u00f9 efficiente. Questo significa che possiamo moltiplicare per 5 per ottenere un reale coefficiente di accelerazione. Pertanto, con le stime pi\u00f9 conservative, si pu\u00f2 affermare che l'accelerazione \u00e8 stata di 50 volte o pi\u00f9. Scendere a scalare verticalmente il server di 50 volte costerebbe di pi\u00f9. Soprattutto considerando che un'ottimizzazione una volta effettuata continua a funzionare nel tempo, mentre la bolletta per il server affittato arriva ogni mese.<br \/>\n<br \/>Fonte: <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 4.9.10 - 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? \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\" \/>\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\/it\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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? \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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/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\udd47 Ottimizzazione delle query del database con un esempio di servizio B2B per costruttori | ProHoster","description":"Come crescere di 10 volte il numero di query al database senza dover migrare su server pi\u00f9 performanti, mantenendo la funzionalit\u00e0 del sistema? Vi racconter\u00f2 come abbiamo affrontato il calo delle prestazioni del nostro database, come abbiamo ottimizzato le query SQL per servire il maggior numero possibile di utenti senza aumentare i costi delle risorse computazionali. Offro un servizio per la gestione dei processi aziendali.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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? \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","og:url":"https:\/\/prohoster.info\/it\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/36704","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=36704"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/36704\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/27493"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=36704"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=36704"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=36704"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}