{"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 nell'esempio di un servizio B2B per costruttori","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Come far crescere le richieste al database dieci volte senza passare a un server pi\u00f9 potente e 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 le spese per le risorse di calcolo.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nFaccio un servizio per la gestione dei processi aziendali nelle aziende di costruzione. Collaboriamo con circa 3.000 aziende. Oltre 10.000 persone lavorano ogni giorno con il nostro sistema per 4-10 ore. Risolve vari compiti di pianificazione, avviso, allerta, convalida... Utilizziamo PostgreSQL 9.6. Nel nostro database ci sono circa 300 tabelle e ogni giorno riceve fino a 200 milioni di richieste (10.000 diverse). In media abbiamo 3-4.000 richieste al secondo, nei momenti pi\u00f9 attivi oltre 10.000 richieste al secondo. La maggior parte delle richieste \u00e8 OLAP. Aggiunte, modifiche e cancellazioni sono di gran lunga inferiori, cio\u00e8 il carico OLTP \u00e8 relativamente ridotto. Ho fornito tutti questi numeri per darvi un'idea della portata del nostro progetto e per capire quanto la nostra esperienza possa esservi utile.<\/p>\n<h3>Immagine prima. Lirica<\/h3>\n<p>\nQuando abbiamo iniziato lo sviluppo, non ci siamo particolarmente preoccupati del carico che avrebbe sopportato il database e di cosa avremmo fatto se il server non ce l'avesse fatta. Nella progettazione del database siamo stati guidati da raccomandazioni generali e abbiamo cercato di non spararci nelle piedi, ma oltre ai consigli generali come 'non usare 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 basandoci sui principi di normalizzazione evitando la ridondanza dei dati e non ci siamo preoccupati di accelerare determinate richieste. Non appena sono arrivati i primi utenti, ci siamo trovati di fronte a problemi di prestazioni. Come al solito, eravamo assolutamente impreparati. I primi problemi si sono rivelati semplici. In genere, tutto si risolveva aggiungendo un nuovo indice. Ma \u00e8 arrivato un momento in cui le semplici soluzioni hanno smesso di funzionare. Rendendoci conto che ci mancava esperienza e che era sempre pi\u00f9 difficile capire qual era la causa dei problemi, abbiamo assunto specialisti che ci hanno aiutato a configurare correttamente il server, a collegare il monitoraggio, 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>Immagine seconda. Statistica<\/h3>\n<p>\nAbbiamo quindi circa 10.000 diverse query che vengono eseguite sul nostro DB in un giorno. Di queste 10.000 ci sono dei mostri che vengono eseguiti 2-3 milioni di volte con un tempo medio di esecuzione di 0,1-0,3 ms e ci sono query con un tempo medio di esecuzione di 30 secondi, invocate 100 volte al giorno.<\/p>\n<p>Ottimizzare tutte e 10.000 le query non si \u00e8 rivelato possibile, quindi abbiamo deciso di capire dove concentrare gli sforzi per migliorare correttamente le prestazioni del DB. Dopo alcune 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 invocate molto frequentemente o query che richiedono molto tempo per essere completate (le query lunghe e frequenti sono state ottimizzate nelle prime iterazioni nella corsa per la velocit\u00e0). Di conseguenza, il server spende pi\u00f9 tempo sulla loro esecuzione. \u00c8 importante separare le query top in base al tempo di esecuzione totale e separatamente in base al tempo di IO. I metodi di ottimizzazione per queste query sono leggermente diversi.<\/p>\n<p>La pratica comune di tutte le aziende \u00e8 lavorare con le QUERY TOP. Ce ne sono poche, l'ottimizzazione anche di una sola query pu\u00f2 liberare il 5-10% delle risorse. Tuttavia, man mano che il progetto \u201ccresce\u201d, l'ottimizzazione delle QUERY TOP diventa un compito sempre pi\u00f9 non banale. Tutti i metodi semplici sono gi\u00e0 stati sfruttati, e la query \u201cpi\u00f9 pesante\u201d consuma \u201csolo\u201d il 3-5% delle risorse. Se le QUERY TOP occupano complessivamente meno del 30-40% del tempo, \u00e8 probabile che abbiate gi\u00e0 fatto uno sforzo per farle funzionare rapidamente e sia giunto il momento di passare all'ottimizzazione delle query del gruppo successivo.<br \/>\nRimane da rispondere alla domanda su quante query superiori includere in questo gruppo. Di solito prendo non meno di 10, ma non pi\u00f9 di 20. Cerco di fare in modo che il tempo della prima e dell'ultima query nel gruppo TOP non differisca pi\u00f9 di 10 volte. Quindi, se il tempo di esecuzione delle query scende bruscamente dal 1\u00b0 posto al 10\u00b0, prendo il TOP-10; se il calo \u00e8 pi\u00f9 graduale, aumento le dimensioni del gruppo a 15 o 20.<br \/>\n<img decoding=\"async\" alt=\"Ottimizzazione delle query del database nell&#039;esempio di un servizio B2B per costruttori\" src=\"\/wp-content\/uploads\/2019\/08\/2a9d9e6053d1aebb71aa213757bd2393.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>MEDIO<\/h4>\n<p>\nQueste sono tutte le query che seguono immediatamente le QUERY TOP, escluse le ultime 5-10%. Di solito, nell'ottimizzazione di queste query si trova la possibilit\u00e0 di aumentare notevolmente le prestazioni del server. Queste query possono rappresentare fino all'80%. Ma anche se la loro quota supera il 50%, \u00e8 tempo di esaminarle con maggiore attenzione.<\/p>\n<h4>CODA<\/h4>\n<p>\nCome detto, queste richieste arrivano alla fine e richiedono il 5-10% del tempo. Si possono dimenticare, a meno che non si utilizzino strumenti automatici per l'analisi delle richieste; in tal caso, l'ottimizzazione potrebbe anche risultare poco costosa.<\/p>\n<p>Come valutare ogni gruppo?<\/p>\n<p>Uso una query SQL che aiuta a fare tale valutazione per PostgreSQL (sono sicuro che per molti altri DBMS si possa scrivere una query simile)<\/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) FROM ( SELECT CASE WHEN rn  20 AND rn  800 THEN tt_percent ELSE 0 END AS time_tail FROM ( SELECT total_time \/ (SELECT sum(total_time) FROM pg_stat_statements) * 100 AS tt_percent, query, ROW_NUMBER () OVER (ORDER BY total_time DESC) AS rn FROM pg_stat_statements ORDER BY total_time DESC ) AS t ) AS ts\n<\/code><\/pre>\n<p>Il risultato della query consiste in tre colonne, ognuna delle quali contiene la percentuale di tempo spesa per trattare le richieste di questo gruppo. All'interno della query ci sono due numeri (nel mio caso 20 e 800), che separano le richieste di un gruppo da un altro.<\/p>\n<p>Ecco come si rapportano le quote delle richieste all'inizio dei lavori di ottimizzazione e ora.<\/p>\n<p><img decoding=\"async\" alt=\"Ottimizzazione delle query del database nell&#039;esempio di un servizio B2B per costruttori\" src=\"\/wp-content\/uploads\/2019\/08\/9c70ad9aba8b835c94729c9dda656eab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDal diagramma \u00e8 evidente che la quota delle richieste TOP \u00e8 drasticamente diminuita, mentre sono aumentate quelle \"medie\".<br \/>\nAll'inizio le richieste TOP includevano evidenti errori. Col tempo, i problemi iniziali sono scomparsi, la quota delle richieste TOP si \u00e8 ridotta e abbiamo dovuto impegnarci sempre di pi\u00f9 per velocizzare le richieste pesanti. <\/p>\n<p><b class=\"spoiler_title\">Per ottenere il testo delle richieste utilizziamo la seguente query<\/b><\/p>\n<pre><code class=\"sql\">SELECT * FROM ( 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 FROM pg_stat_statements ORDER BY total_time DESC ) AS T WHERE rn  20 AND rn  800  -- TAIL\n<\/code><\/pre>\n<p>Ecco un elenco delle tecniche pi\u00f9 comunemente utilizzate che ci hanno aiutato a velocizzare le richieste TOP:<\/p>\n<ul>\n<li>Ridefinizione del sistema, ad esempio, rifacendo la logica delle notifiche su un message broker invece di effettuare richieste periodiche al DB<\/li>\n<li>Aggiunta o modifica degli indici<\/li>\n<li>Riscrittura delle query ORM in SQL puro<\/li>\n<li>Riscrittura della logica di lazy loading dei dati<\/li>\n<li>Caching tramite denormalizzazione dei dati. Ad esempio, abbiamo una relazione tra le tabelle Consegna -&gt; Fattura -&gt; Richiesta -&gt; Domanda. Cio\u00e8, ogni consegna \u00e8 collegata a una domanda attraverso altre tabelle. Per non dover collegare tutte le tabelle in ogni richiesta, abbiamo duplicato il riferimento alla domanda nella tabella Consegna.<\/li>\n<li>La memorizzazione delle tabelle statiche con le directory e delle tabelle che cambiano raramente nella memoria del programma.<\/li>\n<\/ul>\n<p>\nA volte le modifiche richiedevano un ridisegno sostanziale, ma fornivano un alleggerimento del 5-10% del sistema, ed erano giustificate. Col passare del tempo, il rendimento diventava sempre minore e il ridisegno necessario era sempre pi\u00f9 serio.<\/p>\n<p>Allora abbiamo prestato attenzione al secondo gruppo di interrogazioni - il gruppo degli intermedi. In esso c'erano molte pi\u00f9 interrogazioni e sembrava che l'analisi di tutto il gruppo richiedesse molto tempo. Tuttavia, la maggior parte delle interrogazioni si \u00e8 rivelata molto semplice da ottimizzare e molti problemi si ripetevano decine di volte in varie variazioni. Ecco alcuni esempi di ottimizzazioni tipiche che abbiamo applicato a decine di interrogazioni simili, ognuna delle quali alleggeriva il database del 3-5%.<\/p>\n<ul>\n<li> Invece di controllare la presenza di record utilizzando COUNT e una scansione completa della tabella, abbiamo iniziato a utilizzare EXISTS.\n <\/li>\n<li>Abbiamo eliminato DISTINCT (non c'\u00e8 una ricetta generale, ma a volte si pu\u00f2 facilmente eliminarlo aumentando la velocit\u00e0 della query di 10-100 volte).\n<p>Ad esempio, invece di fare una query per ottenere tutti i conducenti da una grande tabella delle 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 una query su una tabella relativamente piccola, 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>\nSembrerebbe che avessimo utilizzato una sottoselezione correlata, ma essa offre un'accelerazione di oltre 10 volte.\n <\/li>\n<li>In molti casi abbiamo persino rinunciato a 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>anzich\u00e9\n<pre><code class=\"sql\">UPPER(s) LIKE JOHN% \n<\/code><\/pre>\n<p>\nusiamo <\/p>\n<pre><code class=\"sql\">s ILIKE \u201cJohn%\u201d\n<\/code><\/pre>\n<p>\n <\/li>\n<\/ul>\n<p>\nOgni singola query \u00e8 stata talvolta velocizzata da 3 a 1000 volte. Nonostante i risultati impressionanti, inizialmente ci sembrava che non ci fosse senso nell'ottimizzare una query che viene eseguita in 10 ms, rientra nella terza centinaia delle query pi\u00f9 pesanti e occupa nel tempo di carico sul database frazioni di percentuale. Ma applicando lo stesso rimedio a un gruppo di query analoghe, recuperavamo diversi punti percentuali. Per non perdere tempo a esaminare manualmente tutte le centinaia di query, abbiamo scritto alcuni semplici script che trovavano query simili utilizzando espressioni regolari. Alla fine, la ricerca automatica di gruppi di query ci ha permesso di migliorare ulteriormente le nostre prestazioni investendo sforzi modestissimi.<\/p>\n<p>Alla fine, abbiamo gi\u00e0 lavorato per tre anni con lo stesso hardware. Il carico medio giornaliero \u00e8 di circa il 30%, con punte che arrivano fino al 70%. Il numero di richieste e il numero di utenti sono aumentati di circa 10 volte. E tutto ci\u00f2 grazie al monitoraggio costante di questi gruppi di richieste TOP-MEDIUM. Non appena appare una nuova richiesta nel gruppo TOP, la analizziamo immediatamente e cerchiamo di velocizzarla. Il gruppo MEDIUM lo esaminiamo settimanalmente tramite script di analisi delle richieste. Se troviamo nuove richieste che gi\u00e0 sappiamo ottimizzare, le modifichiamo rapidamente. A volte troviamo nuovi modi di ottimizzazione che possono essere applicati subito a pi\u00f9 richieste. <\/p>\n<p>Secondo le nostre previsioni, il server attuale regger\u00e0 un aumento del numero di utenti di ulteriori 3-5 volte. Tuttavia, abbiamo un ulteriore asso nella manica: non abbiamo ancora trasferito le richieste SELECT sul mirror, come \u00e8 consigliato fare. Ma non lo facciamo intenzionalmente, poich\u00e9 vogliamo prima sfruttare fino in fondo le possibilit\u00e0 di ottimizzazione \"intelligente\" prima di attivare l' \"artiglieria pesante\".<br \/>\nUno sguardo critico al lavoro svolto potrebbe suggerire di utilizzare la scalabilit\u00e0 verticale. Comprare un server pi\u00f9 potente, invece di far perdere tempo agli specialisti. Un server potrebbe non costare tanto, soprattutto considerando che i limiti della scalabilit\u00e0 verticale non sono ancora stati esauriti. Tuttavia, il numero di richieste \u00e8 aumentato solo di 10 volte. Negli ultimi anni, le funzionalit\u00e0 del sistema sono aumentate e ora ci sono pi\u00f9 varianti di richieste. Le funzionalit\u00e0 precedenti, grazie alla memorizzazione nella cache, vengono eseguite con un minor numero di richieste, inoltre, richieste pi\u00f9 efficaci. Quindi si pu\u00f2 moltiplicare tranquillamente per 5, per ottenere il vero coefficiente di accelerazione. Pertanto, dai calcoli pi\u00f9 modesti, si pu\u00f2 dire che l'accelerazione \u00e8 stata di 50 volte o pi\u00f9. Scalare verticalmente il server di 50 volte costerebbe di pi\u00f9. Soprattutto considerando che un'ottimizzazione una volta eseguita funziona continuamente, mentre la bolletta del server noleggiato 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 5.0.1.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\/it\/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.1.1\" \/>\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?\" \/>\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\udd47Ottimizzazione delle query di database tramite un servizio B2B per costruttori | ProHoster","description":"Come crescere di dieci volte il numero di richieste al database senza migrare su un server pi\u00f9 performante e mantenere la funzionalit\u00e0 del sistema?","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?","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}