{"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\/pt\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej","title":{"rendered":"Otimiza\u00e7\u00e3o de consultas de banco de dados com base em um servi\u00e7o B2B para construtores","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Como crescer 10 vezes na quantidade de consultas ao banco de dados sem mudar para um servidor mais poderoso e mantendo a funcionalidade do sistema? Vou explicar como lutamos contra a queda de desempenho do nosso banco de dados, como otimizamos as consultas SQL para atender o maior n\u00famero poss\u00edvel de usu\u00e1rios e n\u00e3o aumentar os custos com recursos computacionais.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nEstou desenvolvendo um servi\u00e7o para gerenciar processos de neg\u00f3cios em empresas de constru\u00e7\u00e3o. Trabalhamos com cerca de 3.000 empresas. Mais de 10.000 pessoas utilizam nosso sistema todos os dias por 4-10 horas. Ele resolve diversas tarefas de planejamento, notifica\u00e7\u00e3o, alerta, valida\u00e7\u00e3o... Usamos PostgreSQL 9.6. Em nosso banco de dados, temos cerca de 300 tabelas e a cada dia recebemos at\u00e9 200 milh\u00f5es de consultas (10.000 diferentes). Em m\u00e9dia, temos de 3-4 mil consultas por segundo, e nos momentos mais ativos, mais de 10.000 consultas por segundo. A maior parte das consultas \u00e9 OLAP. Adi\u00e7\u00f5es, modifica\u00e7\u00f5es e remo\u00e7\u00f5es s\u00e3o muito menores, ou seja, a carga OLTP \u00e9 relativamente pequena. Todos esses n\u00fameros que citei servem para que voc\u00ea possa avaliar a escala do nosso projeto e entender qu\u00e3o \u00fatil nossa experi\u00eancia pode ser para voc\u00ea.<\/p>\n<h3>Cena um. L\u00edrica<\/h3>\n<p>\nQuando come\u00e7amos o desenvolvimento, n\u00e3o pensamos muito sobre a carga que recairia sobre o banco de dados e o que far\u00edamos se o servidor parasse de suportar. Ao projetar o banco de dados, seguimos as recomenda\u00e7\u00f5es gerais e tentamos n\u00e3o nos prejudicar, mas n\u00e3o fomos al\u00e9m de conselhos gerais como \"n\u00e3o use o padr\u00e3o <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity%E2%80%93attribute%E2%80%93value_model\">Entity Attribute Values<\/a><\/noindex> ,\" n\u00e3o exploramos. Projetamos com base nos princ\u00edpios de normaliza\u00e7\u00e3o, evitando a redund\u00e2ncia de dados e n\u00e3o nos preocupamos em acelerar certas consultas. Assim que os primeiros usu\u00e1rios chegaram, nos deparamos com problemas de desempenho. Como de costume, est\u00e1vamos absolutamente despreparados para isso. Os primeiros problemas eram simples. Geralmente, tudo se resolvia com a adi\u00e7\u00e3o de um novo \u00edndice. Mas chegou um momento em que as solu\u00e7\u00f5es simples deixaram de funcionar. Percebendo que nos faltava experi\u00eancia e que era cada vez mais dif\u00edcil entender a causa dos problemas, contratamos especialistas que nos ajudaram a configurar corretamente o servidor, ativar o monitoramento e nos mostraram onde olhar para obter <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/9.6\/pgstatstatements.html\">estat\u00edsticas<\/a><\/noindex>.<\/p>\n<h3>Cena dois. Estat\u00edstica<\/h3>\n<p>\nTemos cerca de 10 mil consultas diferentes que s\u00e3o executadas em nosso banco de dados diariamente. Destas 10 mil, existem monstros que s\u00e3o executados de 2 a 3 milh\u00f5es de vezes, com um tempo m\u00e9dio de execu\u00e7\u00e3o de 0,1 a 0,3 ms, e h\u00e1 consultas com um tempo m\u00e9dio de execu\u00e7\u00e3o de 30 segundos, que s\u00e3o chamadas 100 vezes por dia.<\/p>\n<p>Otimizar todas as 10 mil consultas n\u00e3o era vi\u00e1vel, ent\u00e3o decidimos entender onde direcionar nossos esfor\u00e7os para aumentar a performance do banco de dados corretamente. Ap\u00f3s v\u00e1rias itera\u00e7\u00f5es, come\u00e7amos a classificar as consultas por tipos.<\/p>\n<h4>CONSULTAS TOP<\/h4>\n<p>\nEstas s\u00e3o as consultas mais pesadas, que consomem mais tempo (tempo total). S\u00e3o consultas que ou s\u00e3o muito frequentemente chamadas ou que demoram muito para serem executadas (consultas longas e frequentes j\u00e1 foram otimizadas nas primeiras itera\u00e7\u00f5es de busca por velocidade). No total, o servidor gasta mais tempo na execu\u00e7\u00e3o dessas consultas. \u00c9 importante separar as consultas top por tempo total de execu\u00e7\u00e3o e separadamente por tempo de I\/O. As formas de otimiza\u00e7\u00e3o para essas consultas s\u00e3o um pouco diferentes.<\/p>\n<p>A pr\u00e1tica comum de todas as empresas \u00e9 trabalhar com as CONSULTAS TOP. Elas s\u00e3o poucas e a otimiza\u00e7\u00e3o de mesmo uma \u00fanica consulta pode liberar de 5 a 10% dos recursos. No entanto, \u00e0 medida que o projeto \"amadurece\", a otimiza\u00e7\u00e3o das CONSULTAS TOP se torna uma tarefa cada vez mais n\u00e3o trivial. Todos os m\u00e9todos simples j\u00e1 foram explorados e a consulta mais \u201cpesada\u201d consome \u201capenas\u201d 3 a 5% dos recursos. Se as consultas TOP, em soma, ocupam menos de 30 a 40% do tempo, \u00e9 prov\u00e1vel que voc\u00ea j\u00e1 tenha se esfor\u00e7ado para que funcionem rapidamente e \u00e9 hora de passar para a otimiza\u00e7\u00e3o das consultas do pr\u00f3ximo grupo.<br \/>\nResta responder \u00e0 pergunta de quantas consultas superiores incluir neste grupo. Eu geralmente considero n\u00e3o menos de 10, mas n\u00e3o mais de 20. Procuro garantir que o tempo do primeiro e do \u00faltimo na lista TOP n\u00e3o difira mais do que 10 vezes. Ou seja, se o tempo de execu\u00e7\u00e3o das consultas cai abruptamente do 1\u00ba para o 10\u00ba lugar, eu pego o TOP-10; se a queda for mais gradual, aumento o tamanho do grupo para 15 ou 20.<br \/>\n<img decoding=\"async\" alt=\"Otimiza\u00e7\u00e3o de consultas de banco de dados com base em um servi\u00e7o B2B para construtores\" src=\"\/wp-content\/uploads\/2019\/08\/2a9d9e6053d1aebb71aa213757bd2393.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>CONSULTAS M\u00c9DIAS<\/h4>\n<p>\nEstas s\u00e3o todas as consultas que v\u00eam imediatamente ap\u00f3s as TOP, exceto as \u00faltimas 5-10%. Normalmente, a otimiza\u00e7\u00e3o exatamente dessas consultas \u00e9 onde se encontra a possibilidade de aumentar significativamente a performance do servidor. Essas consultas podem \u201cpesar\u201d at\u00e9 80%. Mas mesmo que sua participa\u00e7\u00e3o ultrapasse 50%, \u00e9 hora de olh\u00e1-las com mais aten\u00e7\u00e3o.<\/p>\n<h4>CAUDA<\/h4>\n<p>\nComo foi mencionado, essas consultas ocorrem no final e consomem de 5 a 10% do tempo. Voc\u00ea pode esquec\u00ea-las, a menos que utilize ferramentas autom\u00e1ticas de an\u00e1lise de consultas, pois a otimiza\u00e7\u00e3o tamb\u00e9m pode sair barata.<\/p>\n<p>Como avaliar cada grupo?<\/p>\n<p>Eu uso uma consulta SQL que ajuda a fazer essa avalia\u00e7\u00e3o para PostgreSQL (tenho certeza de que para muitos outros SGBDs \u00e9 poss\u00edvel escrever uma consulta semelhante).<\/p>\n<p><b class=\"spoiler_title\">Consulta SQL para avaliar o tamanho dos grupos 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>O resultado da consulta \u00e9 tr\u00eas colunas, cada uma contendo a porcentagem do tempo gasto no processamento das consultas desse grupo. Dentro da consulta, h\u00e1 dois n\u00fameros (neste caso, 20 e 800), que separam as consultas de um grupo das do outro.<\/p>\n<p>Assim, aproximadamente, as propor\u00e7\u00f5es das consultas no in\u00edcio do trabalho de otimiza\u00e7\u00e3o em compara\u00e7\u00e3o com agora.<\/p>\n<p><img decoding=\"async\" alt=\"Otimiza\u00e7\u00e3o de consultas de banco de dados com base em um servi\u00e7o B2B para construtores\" src=\"\/wp-content\/uploads\/2019\/08\/9c70ad9aba8b835c94729c9dda656eab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDo gr\u00e1fico, fica evidente que a participa\u00e7\u00e3o das consultas TOP diminuiu acentuadamente, enquanto os 'intermedi\u00e1rios' cresceram.<br \/>\nInicialmente, as consultas TOP inclu\u00edam erros grosseiros. Com o tempo, as doen\u00e7as infantis desapareceram, a participa\u00e7\u00e3o das consultas TOP foi reduzida e esfor\u00e7os cada vez maiores foram necess\u00e1rios para acelerar as consultas mais pesadas. <\/p>\n<p><b class=\"spoiler_title\">Para obter o texto das consultas, usamos a seguinte consulta:<\/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>Aqui est\u00e1 uma lista das t\u00e9cnicas mais frequentemente utilizadas que nos ajudaram a acelerar as consultas TOP:<\/p>\n<ul>\n<li>Redesenho do sistema, por exemplo, reformula\u00e7\u00e3o da l\u00f3gica de notifica\u00e7\u00f5es usando um message broker em vez de consultas peri\u00f3dicas ao banco de dados.<\/li>\n<li>Adi\u00e7\u00e3o ou altera\u00e7\u00e3o de \u00edndices.<\/li>\n<li>Reescrita de consultas ORM para SQL puro.<\/li>\n<li>Reescrita da l\u00f3gica de carregamento pregui\u00e7oso de dados.<\/li>\n<li>Cache atrav\u00e9s da desnormaliza\u00e7\u00e3o dos dados. Por exemplo, temos uma rela\u00e7\u00e3o entre tabelas Entrega -&gt; Fatura -&gt; Consulta -&gt; Solicita\u00e7\u00e3o. Ou seja, cada entrega est\u00e1 relacionada a uma solicita\u00e7\u00e3o atrav\u00e9s de outras tabelas. Para n\u00e3o conectar todas as tabelas em cada consulta, duplicamos a refer\u00eancia \u00e0 solicita\u00e7\u00e3o na tabela Entrega.<\/li>\n<li>O cache de tabelas est\u00e1ticas com diret\u00f3rios e tabelas que mudam raramente na mem\u00f3ria do programa.<\/li>\n<\/ul>\n<p>\n\u00c0s vezes, as mudan\u00e7as levavam a uma reformula\u00e7\u00e3o significativa, mas proporcionavam uma redu\u00e7\u00e3o de 5 a 10% na carga do sistema e eram justificadas. Com o tempo, o retorno diminu\u00eda cada vez mais, e a reformula\u00e7\u00e3o exigia um esfor\u00e7o maior.<\/p>\n<p>Ent\u00e3o, come\u00e7amos a prestar aten\u00e7\u00e3o ao segundo grupo de consultas - o grupo intermedi\u00e1rio. Havia muito mais consultas nele e parecia que a an\u00e1lise de todo o grupo levaria muito tempo. No entanto, a maioria das consultas se revelou muito simples para otimiza\u00e7\u00e3o, e muitos problemas se repetiam dezenas de vezes em diferentes varia\u00e7\u00f5es. Aqui est\u00e3o exemplos de algumas otimiza\u00e7\u00f5es t\u00edpicas que aplicamos a dezenas de consultas semelhantes e cada grupo de consultas otimizadas aliviou o banco de dados em 3-5%.<\/p>\n<ul>\n<li> Em vez de verificar a exist\u00eancia de registros usando COUNT e fazer uma varredura completa na tabela, come\u00e7amos a usar EXISTS.\n <\/li>\n<li>Eliminamos o DISTINCT (n\u00e3o h\u00e1 uma receita geral, mas \u00e0s vezes \u00e9 f\u00e1cil se livrar dele, acelerando a consulta de 10 a 100 vezes).\n<p>Por exemplo, em vez de uma consulta para selecionar todos os motoristas de uma grande tabela de entregas (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>\nfizemos uma consulta em uma tabela relativamente pequena, 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>\nEmbora parecesse que est\u00e1vamos usando uma subconsulta correlacionada, ela proporcionava um aumento de desempenho de mais de 10 vezes.\n <\/li>\n<li>Em muitos casos, at\u00e9 abandonamos o COUNT e <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.citusdata.com\/blog\/2016\/10\/12\/count-performance\/#dup_counts_estimated_filtered\">substitu\u00edmos por um c\u00e1lculo aproximado.<\/a><\/noindex>\n <\/li>\n<li>em vez de\n<pre><code class=\"sql\">UPPER(s) LIKE JOHN% \n<\/code><\/pre>\n<p>\nusamos <\/p>\n<pre><code class=\"sql\">s ILIKE \"John%\"\n<\/code><\/pre>\n<p>\n <\/li>\n<\/ul>\n<p>\nCada consulta particular conseguiu ser acelerada de 3 a 1000 vezes. Apesar dos resultados impressionantes, no in\u00edcio parecia n\u00e3o haver sentido na otimiza\u00e7\u00e3o de uma consulta que leva 10 ms, entra na terceira centena de consultas mais pesadas e no tempo total de carga do banco de dados ocupa fra\u00e7\u00f5es de porcentagem. Mas, aplicando a mesma receita a um grupo de consultas semelhantes, conseguimos recuperar alguns porcentuais. Para n\u00e3o perder tempo revisando manualmente todas as centenas de consultas, escrevemos alguns scripts simples que, usando express\u00f5es regulares, encontravam consultas semelhantes. Como resultado, a busca autom\u00e1tica por grupos de consultas nos permitiu melhorar ainda mais nosso desempenho com esfor\u00e7o modesto.<\/p>\n<p>No final, j\u00e1 estamos h\u00e1 tr\u00eas anos trabalhando com o mesmo hardware. A carga m\u00e9dia di\u00e1ria \u00e9 de cerca de 30%, chegando a 70% em picos. O n\u00famero de solicita\u00e7\u00f5es e usu\u00e1rios cresceu cerca de 10 vezes. E tudo isso gra\u00e7as ao monitoramento constante desses grupos de solicita\u00e7\u00f5es TOP-MEDIUM. Assim que um novo pedido aparece no grupo TOP, o analisamos imediatamente e tentamos aceler\u00e1-lo. O grupo MEDIUM \u00e9 revisado semanalmente com scripts de an\u00e1lise de solicita\u00e7\u00f5es. Se surgem novos pedidos que j\u00e1 sabemos como otimizar, fazemos as mudan\u00e7as rapidamente. \u00c0s vezes, encontramos novas maneiras de otimizar que podem ser aplicadas imediatamente a v\u00e1rias solicita\u00e7\u00f5es. <\/p>\n<p>De acordo com nossas previs\u00f5es, o servidor atual suportar\u00e1 um aumento no n\u00famero de usu\u00e1rios de 3 a 5 vezes. No entanto, temos outra carta na manga - ainda n\u00e3o migramos as consultas SELECT para o espelho, como \u00e9 recomendado. Mas n\u00e3o estamos fazendo isso intencionalmente, pois queremos primeiro explorar ao m\u00e1ximo as possibilidades de otimiza\u00e7\u00e3o 'inteligente', antes de ativar a 'artilharia pesada'.<br \/>\nUm olhar cr\u00edtico sobre o trabalho realizado pode sugerir o uso da escalabilidade vertical. Comprar um servidor mais potente em vez de gastar o tempo dos especialistas. Um servidor pode n\u00e3o custar tanto, especialmente considerando que os limites da escalabilidade vertical ainda n\u00e3o foram atingidos. No entanto, o n\u00famero de solicita\u00e7\u00f5es cresceu apenas 10 vezes. Ao longo de alguns anos, a funcionalidade do sistema aumentou e agora existem mais variedades de solicita\u00e7\u00f5es. A funcionalidade que existia, gra\u00e7as ao cache, \u00e9 executada com um menor n\u00famero de solicita\u00e7\u00f5es, al\u00e9m de serem mais eficazes. Portanto, pode-se multiplicar por 5 para obter um verdadeiro fator de acelera\u00e7\u00e3o. Assim, com os c\u00e1lculos mais modestos, pode-se dizer que a acelera\u00e7\u00e3o foi de 50 vezes ou mais. Fazer a escalabilidade vertical do servidor em 50 vezes custaria mais. Especialmente considerando que uma otimiza\u00e7\u00e3o realizada uma vez funciona continuamente, enquanto a conta pelo servidor alugado chega todo m\u00eas.<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.3 - 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\/pt\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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\udd47Otimiza\u00e7\u00e3o de consultas de banco de dados no exemplo de um servi\u00e7o B2B para construtores | ProHoster","description":"Como crescer 10 vezes no n\u00famero de solicita\u00e7\u00f5es ao banco de dados sem migrar para um servidor mais potente e manter a funcionalidade do sistema?","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/36704","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=36704"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/36704\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/27493"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=36704"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=36704"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=36704"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}