{"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\/de\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej","title":{"rendered":"Optimierung von Datenbankanfragen am Beispiel eines B2B-Dienstes f\u00fcr Bauunternehmen","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Wie k\u00f6nnen Sie die Anzahl der Datenbankanfragen verzehnfachen, ohne auf einen leistungsst\u00e4rkeren Server umzuziehen und dabei die Systemstabilit\u00e4t zu gew\u00e4hrleisten? Ich werde Ihnen erz\u00e4hlen, wie wir mit dem Leistungsabfall unserer Datenbank umgegangen sind, wie wir SQL-Anfragen optimiert haben, um m\u00f6glichst viele Benutzer zu bedienen, ohne die Kosten f\u00fcr Rechenressourcen zu erh\u00f6hen.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nIch entwickle einen Service zur Verwaltung von Gesch\u00e4ftsprozessen in Bauunternehmen. Etwa 3.000 Unternehmen arbeiten mit uns zusammen. \u00dcber 10.000 Menschen nutzen unser System t\u00e4glich 4-10 Stunden lang. Es l\u00f6st verschiedene Aufgaben in den Bereichen Planung, Benachrichtigung, Warnung und Validierung\u2026 Wir verwenden PostgreSQL 9.6. In unserer Datenbank gibt es etwa 300 Tabellen, und t\u00e4glich gehen bis zu 200 Millionen Anfragen (10.000 verschiedene) ein. Im Durchschnitt haben wir 3-4 Tausend Anfragen pro Sekunde, in den aktivsten Momenten \u00fcber 10.000 Anfragen pro Sekunde. Der Gro\u00dfteil der Anfragen sind OLAP. Neuzug\u00e4nge, Modifikationen und L\u00f6schungen sind deutlich weniger, das hei\u00dft, die OLTP-Belastung ist relativ gering. Ich habe diese Zahlen angef\u00fchrt, damit Sie das Ausma\u00df unseres Projekts einsch\u00e4tzen und verstehen k\u00f6nnen, wie wertvoll unsere Erfahrung f\u00fcr Sie sein k\u00f6nnte.<\/p>\n<h3>Erster Eindruck. Lyrisch<\/h3>\n<p>\nAls wir mit der Entwicklung begannen, dachten wir nicht wirklich dar\u00fcber nach, welche Last auf die Datenbank zukommen w\u00fcrde und was wir tun w\u00fcrden, wenn der Server nicht mehr leistungsf\u00e4hig genug ist. Bei der Gestaltung der Datenbank hielten wir uns an allgemeine Empfehlungen und versuchten, nicht in die falsche Richtung zu steuern. Aber \u00fcber allgemeine Ratschl\u00e4ge wie \"verwenden Sie kein Muster\" hinaus, <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity%E2%80%93attribute%E2%80%93value_model\">Entity Attribute Values<\/a><\/noindex> gingen wir nicht hinaus. Wir planen mit den Prinzipien der Normalisierung und vermeiden Datenredundanz, ohne uns um die Beschleunigung bestimmter Abfragen zu k\u00fcmmern. Sobald die ersten Benutzer kamen, hatten wir mit Leistungsproblemen zu k\u00e4mpfen. Wie immer waren wir daf\u00fcr absolut unvorbereitet. Die ersten Probleme waren einfach zu l\u00f6sen. In der Regel lie\u00df sich alles durch das Hinzuf\u00fcgen eines neuen Index l\u00f6sen. Aber es kam der Moment, als einfache L\u00f6sungen nicht mehr funktionierten. Als wir merkten, dass uns die Erfahrung fehlte und es immer schwieriger wurde zu verstehen, wo die Probleme lagen, stellten wir Spezialisten ein, die uns halfen, den Server richtig einzurichten, Monitoring einzurichten und uns zeigten, wo wir hinschauen sollten, um die <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/9.6\/pgstatstatements.html\">Statistiken<\/a><\/noindex>.<\/p>\n<h3>Zweiter Eindruck. Statistisch<\/h3>\n<p>\nWir haben also etwa 10.000 verschiedene Anfragen, die t\u00e4glich in unserer Datenbank verarbeitet werden. Unter diesen 10.000 Anfragen gibt es \"Monsteranfragen\", die 2-3 Millionen Mal ausgef\u00fchrt werden, mit einer durchschnittlichen Ausf\u00fchrungszeit von 0,1-0,3 ms, und es gibt Anfragen mit einer durchschnittlichen Ausf\u00fchrungszeit von 30 Sekunden, die 100 Mal pro Tag aufgerufen werden.<\/p>\n<p>Es war nicht m\u00f6glich, alle 10.000 Anfragen zu optimieren, deshalb haben wir beschlossen, zu analysieren, wo wir unsere Anstrengungen konzentrieren sollten, um die Leistung der Datenbank gezielt zu verbessern. Nach mehreren Iterationen begannen wir, die Anfragen nach Typen zu kategorisieren.<\/p>\n<h4>TOP Anfragen<\/h4>\n<p>\nDies sind die anspruchsvollsten Anfragen, die die meiste Zeit in Anspruch nehmen (Gesamtzeit). Es handelt sich um Anfragen, die entweder sehr h\u00e4ufig aufgerufen werden oder solche, die sehr lange zur Verarbeitung ben\u00f6tigen (lange und h\u00e4ufige Anfragen wurden bereits in den ersten Iterationen der Geschwindigkeitsoptimierung bearbeitet). Insgesamt ben\u00f6tigt der Server somit die meiste Zeit f\u00fcr deren Ausf\u00fchrung. Es ist wichtig, die Top-Anfragen sowohl nach der Gesamt-Ausf\u00fchrungszeit als auch nach der IO-Zeit zu trennen. Die Optimierungsmethoden f\u00fcr solche Anfragen sind unterschiedlichen.<\/p>\n<p>Es ist g\u00e4ngige Praxis unter Unternehmen, mit TOP-Anfragen zu arbeiten. Es sind nicht viele, aber die Optimierung auch nur einer Anfrage kann 5-10 % der Ressourcen freisetzen. Mit dem \"Wachsen\" eines Projekts wird die Optimierung der TOP-Anfragen jedoch zunehmend zu einer anspruchsvollen Aufgabe. Alle einfachen Methoden sind bereits ausgesch\u00f6pft, und selbst die \"schwerste\" Anfrage beansprucht lediglich 3-5 % der Ressourcen. Wenn die TOP-Anfragen insgesamt weniger als 30-40 % der Zeit in Anspruch nehmen, haben Sie wahrscheinlich bereits Anstrengungen unternommen, um diese schnell zu gestalten, und es ist an der Zeit, sich der Optimierung der Anfragen der n\u00e4chsten Gruppe zu widmen.<br \/>\nEs bleibt die Frage zu beantworten, wie viele TOP-Anfragen in diese Gruppe aufgenommen werden sollen. Ich nehme normalerweise nicht weniger als 10, aber nicht mehr als 20. Ich achte darauf, dass die Ausf\u00fchrungszeit der ersten und der letzten Anfrage in der TOP-Gruppe sich nicht mehr als zehnmal unterscheidet. Das hei\u00dft, wenn die Ausf\u00fchrungszeit der Anfragen vom 1. Platz auf den 10. Platz drastisch sinkt, nehme ich die TOP-10; wenn der R\u00fcckgang allm\u00e4hlicher ist, erh\u00f6he ich die Gruppengr\u00f6\u00dfe auf 15 oder 20.<br \/>\n<img decoding=\"async\" alt=\"Optimierung von Datenbankanfragen am Beispiel eines B2B-Dienstes f\u00fcr Bauunternehmen\" src=\"\/wp-content\/uploads\/2019\/08\/2a9d9e6053d1aebb71aa213757bd2393.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>Mittelst\u00e4ndische Anfragen (medium)<\/h4>\n<p>\nDies sind alle Abfragen, die unmittelbar nach TOP kommen, mit Ausnahme der letzten 5-10 %. In der Optimierung dieser Abfragen liegt oft die M\u00f6glichkeit, die Serverleistung erheblich zu steigern. Diese Abfragen k\u00f6nnen bis zu 80 % des Gesamtvolumens ausmachen. Wenn ihr Anteil jedoch \u00fcber 50 % liegt, ist es an der Zeit, ihnen mehr Aufmerksamkeit zu schenken.<\/p>\n<h4>Schwanz (tail)<\/h4>\n<p>\nWie bereits erw\u00e4hnt, erfolgen diese Abfragen am Ende und ben\u00f6tigen 5-10 % der Zeit. Man kann sie ignorieren, es sei denn, man nutzt automatische Analysewerkzeuge, dann kann deren Optimierung ebenfalls kosteng\u00fcnstig sein.<\/p>\n<p>Wie bewertet man jede Gruppe?<\/p>\n<p>Ich verwende eine SQL-Abfrage, die hilft, eine solche Bewertung f\u00fcr PostgreSQL vorzunehmen (ich bin sicher, dass man f\u00fcr viele andere DBMS \u00e4hnliche Abfragen schreiben kann).<\/p>\n<p><b class=\"spoiler_title\">SQL-Abfrage zur Bewertung der Gr\u00f6\u00dfe von TOP-MEDIUM-TAIL-Gruppen<\/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>Das Ergebnis der Abfrage zeigt drei Spalten, von denen jede den Prozentsatz der Zeit anzeigt, die f\u00fcr die Verarbeitung von Anfragen aus dieser Gruppe aufgewendet wird. Innerhalb der Abfrage gibt es zwei Zahlen (in meinem Fall 20 und 800), die die Anfragen einer Gruppe von einer anderen trennen.<\/p>\n<p>So stehen die Anteile der Anfragen zum Zeitpunkt des Beginns der Optimierung und jetzt in etwa zueinander.<\/p>\n<p><img decoding=\"async\" alt=\"Optimierung von Datenbankanfragen am Beispiel eines B2B-Dienstes f\u00fcr Bauunternehmen\" src=\"\/wp-content\/uploads\/2019\/08\/9c70ad9aba8b835c94729c9dda656eab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAus dem Diagramm geht hervor, dass der Anteil der TOP-Anfragen deutlich gesunken ist, w\u00e4hrend die \u201emittelm\u00e4\u00dfigen\u201c Anfragen zugenommen haben.<br \/>\nAnfangs wurden in die TOP-Anfragen offenbare Fehler aufgenommen. Mit der Zeit verschwanden die Kinderkrankheiten, und der Anteil der TOP-Anfragen nahm ab. Es war erforderlich, immer mehr Anstrengungen zu unternehmen, um die schweren Anfragen zu beschleunigen. <\/p>\n<p><b class=\"spoiler_title\">Um den Text der Anfragen zu erhalten, verwenden wir folgende Abfrage:<\/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>Hier ist eine Liste der am h\u00e4ufigsten verwendeten Techniken, die uns geholfen haben, die TOP-Anfragen zu beschleunigen:<\/p>\n<ul>\n<li>Neugestaltung des Systems, beispielsweise die \u00dcberarbeitung der Logik der Benachrichtigungen auf einen Message Broker anstelle von regelm\u00e4\u00dfigen Anfragen an die Datenbank.<\/li>\n<li>Hinzuf\u00fcgen oder \u00c4ndern von Indizes.<\/li>\n<li>Umformulierung von ORM-Anfragen in reines SQL.<\/li>\n<li>Umstellung der Logik f\u00fcr das Lazy Loading von Daten<\/li>\n<li>Caching durch Denormalisierung von Daten. Zum Beispiel haben wir eine Beziehung zwischen den Tabellen Lieferung -&gt; Rechnung -&gt; Anfrage -&gt; Antrag. Das hei\u00dft, jede Lieferung ist \u00fcber andere Tabellen mit dem Antrag verbunden. Um nicht in jeder Abfrage alle Tabellen zu verkn\u00fcpfen, haben wir den Verweis auf den Antrag in der Tabelle Lieferung dupliziert.<\/li>\n<li>Caching von statischen Tabellen mit Verzeichnissen und seltenen Tabellen im Programmspeicher.<\/li>\n<\/ul>\n<p>\nManchmal f\u00fchrten \u00c4nderungen zu einem signifikanten Redesign, brachten jedoch nur 5-10% Entlastung des Systems und waren gerechtfertigt. Mit der Zeit wurde die Ausbeute immer geringer, w\u00e4hrend ein ernsthafteres Redesign erforderlich wurde.<\/p>\n<p>Dann wendeten wir uns der zweiten Gruppe von Anfragen zu \u2013 der Gruppe der Mittelfeldspieler. In dieser Gruppe gibt es deutlich mehr Anfragen, und es schien, als w\u00fcrde die Analyse der gesamten Gruppe sehr viel Zeit in Anspruch nehmen. Dennoch erwiesen sich die meisten Anfragen als sehr einfach zu optimieren, und viele Probleme traten in unterschiedlichen Variationen dutzende Male auf. Hier sind Beispiele einiger typischer Optimierungen, die wir auf Dutzende \u00e4hnlicher Anfragen anwendeten, und jede Gruppe optimierter Anfragen entlastete die Datenbank um 3-5%.<\/p>\n<ul>\n<li> Anstelle der \u00dcberpr\u00fcfung der Verf\u00fcgbarkeit von Datens\u00e4tzen mit COUNT und eines vollst\u00e4ndigen Tabellenscans verwenden wir jetzt EXISTS.\n <\/li>\n<li>Wir haben DISTINCT entfernt (es gibt kein allgemeines Rezept, aber manchmal kann man leicht darauf verzichten und die Abfrage um das 10-100-Fache beschleunigen).\n<p>Zum Beispiel anstelle einer Abfrage zur Auswahl aller Fahrer aus einer gro\u00dfen Lieferdatenbank (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>\nstellten wir die Abfrage auf die vergleichsweise kleine Tabelle PERSON um.<\/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>\nEs scheint, dass wir eine korrelierte Unterabfrage verwendet haben, aber diese f\u00fchrt zu einer Beschleunigung von mehr als dem 10-fachen.\n <\/li>\n<li>In vielen F\u00e4llen haben wir COUNT ganz weggelassen und <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.citusdata.com\/blog\/2016\/10\/12\/count-performance\/#dup_counts_estimated_filtered\">durch die Berechnung eines ann\u00e4hernden Wertes ersetzt.<\/a><\/noindex>\n <\/li>\n<li>statt\n<pre><code class=\"sql\">UPPER(s) LIKE 'JOHN%' \n<\/code><\/pre>\n<p>\nVPS KVM <\/p>\n<pre><code class=\"sql\">s ILIKE 'John%'\n<\/code><\/pre>\n<p>\n <\/li>\n<\/ul>\n<p>\nWir konnten jede spezifische Anfrage manchmal um das 3- bis 1000-fache beschleunigen. Trotz der beeindruckenden Ergebnisse schien es uns zun\u00e4chst wenig sinnvoll, eine Anfrage zu optimieren, die in 10 ms ausgef\u00fchrt wird, zu den 300 schwersten Anfragen geh\u00f6rt und am Gesamtaufwand f\u00fcr die Datenbank nur einen Bruchteil Prozent ausmacht. Doch durch die Anwendung derselben Methode auf eine Gruppe \u00e4hnlicher Anfragen konnten wir mehrere Prozentpunkte zur\u00fcckgewinnen. Um keine Zeit mit der manuellen Durchsicht aller Hunderten von Anfragen zu verlieren, haben wir einige einfache Skripte geschrieben, die mithilfe von regul\u00e4ren Ausdr\u00fccken \u00e4hnliche Anfragen gefunden haben. Letztendlich erm\u00f6glichte die automatische Suche nach Anfragegruppen eine weitere Verbesserung unserer Leistung mit bescheidenem Aufwand.<\/p>\n<p>Insgesamt arbeiten wir seit drei Jahren mit der gleichen Hardware. Die durchschnittliche Auslastung liegt bei etwa 30 %, in Spitzenzeiten erreichen wir bis zu 70 %. Die Anzahl der Anfragen sowie die der Nutzer sind ungef\u00e4hr um das Zehnfache gestiegen. Das verdanken wir dem kontinuierlichen Monitoring dieser speziellen Anfragen der Gruppe TOP-MEDIUM. Sobald eine neue Anfrage in der TOP-Gruppe auftaucht, analysieren wir sie sofort und versuchen, die Antwortzeiten zu verbessern. Die MEDIUM-Gruppe \u00fcberpr\u00fcfen wir w\u00f6chentlich mit Hilfe von Analyse-Skripten. Wenn wir auf neue Anfragen sto\u00dfen, die wir bereits optimieren k\u00f6nnen, nehmen wir sofort Anpassungen vor. Manchmal entdecken wir neue Optimierungsmethoden, die wir sofort auf mehrere Anfragen anwenden k\u00f6nnen. <\/p>\n<p>Laut unseren Prognosen wird der aktuelle Server in der Lage sein, die Anzahl der Benutzer nochmals um das 3- bis 5-fache zu erh\u00f6hen. Allerdings haben wir noch einen weiteren Trumpf im \u00c4rmel \u2013 wir haben die SELECT-Abfragen noch nicht auf das Spiegel-System umgestellt, wie es empfohlen wird. Aber wir machen das bewusst nicht, da wir zun\u00e4chst die M\u00f6glichkeiten der \"intelligenten\" Optimierung vollst\u00e4ndig aussch\u00f6pfen m\u00f6chten, bevor wir auf die \"schwere Artillerie\" zur\u00fcckgreifen.<br \/>\nEin kritischer Blick auf die geleistete Arbeit kann nahelegen, vertikale Skalierung in Betracht zu ziehen. Statt die Zeit der Spezialisten zu verschwenden, k\u00f6nnte man einen leistungsst\u00e4rkeren Server erwerben. Server m\u00fcssen nicht teuer sein, insbesondere da unsere Grenzen f\u00fcr vertikale Skalierung noch nicht erreicht sind. Allerdings ist die Anzahl der Anfragen nur um das Zehnfache gestiegen. Im Laufe der Jahre hat sich die Funktionalit\u00e4t des Systems erheblich erh\u00f6ht, und die Vielfalt der Anfragen ist gewachsen. Die vorhandene Funktionalit\u00e4t wird durch Caching mit weniger, zudem effizienteren Anfragen durchgef\u00fchrt. Das bedeutet, dass man getrost den Wert um das F\u00fcnffache multiplizieren kann, um den tats\u00e4chlichen Beschleunigungsfaktor zu ermitteln. Somit l\u00e4sst sich konservativ sagen, dass die Beschleunigung bei 50 und mehr liegt. Eine vertikale Aufr\u00fcstung des Servers um das 50-fache w\u00e4re teurer gewesen. Besonders wenn man bedenkt, dass einmalige Optimierungen dauerhaft wirken, w\u00e4hrend die Rechnung f\u00fcr den gemieteten Server jeden Monat eintrifft.<br \/>\n<br \/>Quelle: <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\/de\/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=\"de_DE\" \/>\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\/de\/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\udd47Datenbankabfragen optimieren am Beispiel eines B2B-Services f\u00fcr Bauunternehmer | ProHoster","description":"Wie k\u00f6nnen Sie die Anzahl der Datenbankanfragen verzehnfachen, ohne auf einen leistungsst\u00e4rkeren Server umzusteigen und dabei die Systemleistung aufrechtzuerhalten? Ich werde dar\u00fcber berichten, wie wir mit den Leistungseinbu\u00dfen unserer Datenbank umgegangen sind, wie wir SQL-Abfragen optimiert haben, um so viele Benutzer wie m\u00f6glich zu bedienen, ohne die Kosten f\u00fcr Rechenressourcen zu erh\u00f6hen. Ich entwickle einen Service zur Verwaltung von Gesch\u00e4ftsprozessen.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/36704","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=36704"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/36704\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/27493"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=36704"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=36704"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=36704"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}