{"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 Datenbankabfragen am Beispiel eines B2B-Services f\u00fcr Bauunternehmer","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Wie kann man die Anzahl der Datenbankabfragen um das Zehnfache steigern, ohne auf einen leistungsst\u00e4rkeren Server umzuziehen und die Funktionalit\u00e4t des Systems aufrechtzuerhalten? Ich werde erkl\u00e4ren, wie wir mit dem Leistungsabfall unserer Datenbank umgegangen sind, wie wir SQL-Abfragen 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. T\u00e4glich nutzen \u00fcber 10.000 Personen unser System f\u00fcr 4\u201310 Stunden. Es l\u00f6st verschiedene Aufgaben wie Planung, Benachrichtigungen, Warnungen, Validierungen... Wir verwenden PostgreSQL 9.6. Unsere Datenbank enth\u00e4lt etwa 300 Tabellen, und t\u00e4glich kommen bis zu 200 Millionen Anfragen (10.000 unterschiedliche) hinzu. Im Durchschnitt haben wir 3-4.000 Anfragen pro Sekunde, zu den aktivsten Zeiten mehr als 10.000 Anfragen pro Sekunde. Der Gro\u00dfteil der Anfragen ist OLAP. Hinzuf\u00fcgungen, Modifikationen und L\u00f6schungen sind deutlich weniger, d.h. die OLTP-Belastung ist relativ gering. Ich habe all diese Zahlen angegeben, damit Sie den Umfang unseres Projekts verstehen und einsch\u00e4tzen k\u00f6nnen, wie n\u00fctzlich unsere Erfahrungen f\u00fcr Sie sein k\u00f6nnten.<\/p>\n<h3>Bild eins. Lyrisch<\/h3>\n<p>\nAls wir mit der Entwicklung begannen, dachten wir kaum dar\u00fcber nach, welche Last auf der Datenbank liegen w\u00fcrde und was wir tun w\u00fcrden, wenn der Server nicht mehr mithalten kann. Bei der Planung der Datenbank hielten wir uns an allgemeine Empfehlungen und versuchten, uns nicht selbst in die Quere zu kommen, aber weiter als zu allgemeinen Ratschl\u00e4gen wie \u201averwendet kein Muster\u2018 <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity%E2%80%93attribute%E2%80%93value_model\">Entity Attribute Values<\/a><\/noindex> sind wir nicht gegangen. Wir haben nach den Prinzipien der Normalisierung entworfen, um Datenredundanz zu vermeiden, und haben uns nicht um die Beschleunigung einzelner Abfragen gek\u00fcmmert. Sobald die ersten Benutzer kamen, standen wir vor dem Leistungsproblem. Wie so oft waren wir darauf absolut nicht vorbereitet. Die ersten Probleme waren einfach. In der Regel wurde alles durch das Hinzuf\u00fcgen eines neuen Indexes gel\u00f6st. Aber es kam der Zeitpunkt, an dem einfache L\u00f6sungen nicht mehr funktionierten. Als wir erkannten, dass uns die Erfahrung fehlte und es uns immer schwerer fiel, die Ursachen der Probleme zu verstehen, stellten wir Spezialisten ein, die uns halfen, den Server richtig einzurichten, das Monitoring zu verbinden, und die uns zeigten, wohin wir schauen sollten, um die <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/9.6\/pgstatstatements.html\">Statistik<\/a><\/noindex>.<\/p>\n<h3>Bild zwei. Statistisch<\/h3>\n<p>\nWir haben also etwa 10.000 verschiedene Abfragen, die t\u00e4glich in unserer Datenbank ausgef\u00fchrt werden. Von diesen 10.000 gibt es Monster, die 2-3 Millionen Mal mit einer durchschnittlichen Ausf\u00fchrungszeit von 0,1-0,3 ms ausgef\u00fchrt werden, und es gibt Abfragen mit einer durchschnittlichen Ausf\u00fchrungszeit von 30 Sekunden, die 100 Mal am Tag aufgerufen werden.<\/p>\n<p>Es war nicht m\u00f6glich, alle 10.000 Abfragen zu optimieren, daher haben wir beschlossen, herauszufinden, wo wir unsere Anstrengungen lenken sollten, um die Datenbankleistung richtig zu steigern. Nach mehreren Iterationen fingen wir an, die Abfragen in Typen zu unterteilen.<\/p>\n<h4>TOP-Abfragen<\/h4>\n<p>\nDies sind die schwersten Abfragen, die am meisten Zeit in Anspruch nehmen (Gesamtzeit). Es handelt sich um Abfragen, die entweder sehr h\u00e4ufig aufgerufen werden oder die sehr lange ausgef\u00fchrt werden (langsame und h\u00e4ufige Abfragen wurden bereits in den ersten Iterationen des Geschwindigkeitskampfes optimiert). Insgesamt ben\u00f6tigt der Server am meisten Zeit f\u00fcr deren Ausf\u00fchrung. Dabei ist es wichtig, die Top-Abfragen nach der gesamten Ausf\u00fchrungszeit und separat nach IO-Zeit zu trennen. Die Methoden zur Optimierung solcher Abfragen sind etwas unterschiedlich.<\/p>\n<p>Die g\u00e4ngige Praxis aller Unternehmen besteht darin, mit den TOP-Abfragen zu arbeiten. Es gibt nicht viele davon; selbst die Optimierung einer einzigen Abfrage kann 5-10% der Ressourcen freisetzen. Allerdings wird die Optimierung der TOP-Abfragen mit dem 'Wachstum' des Projekts immer weniger trivial. Alle einfachen Methoden wurden bereits angewendet, und die 'schwierigste' Abfrage ben\u00f6tigt 'nur' 3-5% der Ressourcen. Wenn die TOP-Abfragen insgesamt weniger als 30-40% der Zeit in Anspruch nehmen, haben Sie wahrscheinlich bereits Anstrengungen unternommen, um sie schnell zu gestalten, und es ist an der Zeit, mit der Optimierung der Abfragen aus der n\u00e4chsten Gruppe zu beginnen.<br \/>\nEs bleibt die Frage zu beantworten, wie viele obere Abfragen in diese Gruppe aufgenommen werden sollen. Ich nehme normalerweise nicht weniger als 10, aber nicht mehr als 20. Ich achte darauf, dass sich die Ausf\u00fchrungszeit der ersten und der letzten in der TOP-Gruppe nicht um mehr als den Faktor 10 unterscheidet. Das hei\u00dft, wenn die Ausf\u00fchrungszeiten der Abfragen von Platz 1 auf Platz 10 stark sinken, nehme ich TOP-10, wenn das Sinken allm\u00e4hlicher ist, erh\u00f6he ich die Gruppengr\u00f6\u00dfe auf 15 oder 20.<br \/>\n<img decoding=\"async\" alt=\"Optimierung von Datenbankabfragen am Beispiel eines B2B-Services f\u00fcr Bauunternehmer\" src=\"\/wp-content\/uploads\/2019\/08\/2a9d9e6053d1aebb71aa213757bd2393.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>Durchschnittliche Abfragen (medium)<\/h4>\n<p>\nDas sind alle Abfragen, die unmittelbar hinter den TOP-Abfragen kommen, mit Ausnahme der letzten 5-10%. In der Optimierung dieser Abfragen steckt oft die M\u00f6glichkeit, die Serverleistung erheblich zu steigern. Diese Abfragen k\u00f6nnen bis zu 80% ausmachen. Aber selbst wenn ihr Anteil \u00fcber 50% liegt, ist es Zeit, ihnen mehr Aufmerksamkeit zu schenken.<\/p>\n<h4>Schwanz (tail)<\/h4>\n<p>\nWie bereits erw\u00e4hnt, kommen diese Anfragen am Ende und ben\u00f6tigen 5-10% der Zeit. Man kann sie vergessen, es sei denn, Sie nutzen automatische Analysewerkzeuge f\u00fcr Anfragen, dann kann auch ihre Optimierung kosteng\u00fcnstig ausfallen.<\/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 f\u00fcr viele andere DBMS eine \u00e4hnliche Abfrage geschrieben werden kann).<\/p>\n<p><b class=\"spoiler_title\">SQL-Abfrage zur Bewertung der Gr\u00f6\u00dfe der 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 sind drei Spalten, von denen jede den Prozentsatz der Zeit enth\u00e4lt, der f\u00fcr die Verarbeitung der 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 ungef\u00e4hr verh\u00e4lt es sich mit den Anteilen der Anfragen zu Beginn der Optimierungsarbeiten und heute.<\/p>\n<p><img decoding=\"async\" alt=\"Optimierung von Datenbankabfragen am Beispiel eines B2B-Services f\u00fcr Bauunternehmer\" src=\"\/wp-content\/uploads\/2019\/08\/9c70ad9aba8b835c94729c9dda656eab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAus dem Diagramm ist ersichtlich, dass der Anteil der TOP-Anfragen stark gesunken ist, w\u00e4hrend die \u201eMittelm\u00e4\u00dfigen\u201c gestiegen sind.<br \/>\nAnfangs waren in den TOP-Anfragen offensichtliche Fehler dabei. Im Laufe der Zeit verschwanden die Kinderkrankheiten, der Anteil der TOP-Anfragen schrumpfte, und es war erforderlich, immer mehr Anstrengungen zu unternehmen, um die schweren Anfragen zu beschleunigen. <\/p>\n<p><b class=\"spoiler_title\">Um die Texte 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 h\u00e4ufigsten Methoden, die uns geholfen haben, die TOP-Anfragen zu beschleunigen:<\/p>\n<ul>\n<li>Neugestaltung des Systems, zum Beispiel die \u00dcberarbeitung der Logik f\u00fcr Benachrichtigungen auf einen Message Broker anstelle von regelm\u00e4\u00dfigen Anfragen an die DB.<\/li>\n<li>Hinzuf\u00fcgen oder \u00c4ndern von Indizes<\/li>\n<li>Umformulierung von ORM-Anfragen in reines SQL<\/li>\n<li>Umformulierung der Logik f\u00fcr das Lazy-Loading von Daten<\/li>\n<li>Caching durch Denormalisierung der 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 einem Antrag verbunden. Um nicht in jeder Anfrage alle Tabellen verkn\u00fcpfen zu m\u00fcssen, haben wir die Verkn\u00fcpfung zum Antrag in der Tabelle Lieferung dupliziert.<\/li>\n<li>Caching von statischen Tabellen mit Verzeichnissen und weniger h\u00e4ufig \u00e4ndernden Tabellen im Programmspeicher.<\/li>\n<\/ul>\n<p>\nManchmal f\u00fchrten \u00c4nderungen zu einem erheblichen Redesign, was jedoch eine Systementlastung von 5-10 % brachte und gerechtfertigt war. Mit der Zeit wurde der Nutzen immer geringer, und ein ernsthafteres Redesign wurde erforderlich.<\/p>\n<p>Dann richteten wir unsere Aufmerksamkeit auf die zweite Gruppe von Anfragen \u2013 die Gruppe der Durchschnittsanfragen. In ihr gab es deutlich mehr Anfragen, und es schien, dass die Analyse der gesamten Gruppe sehr viel Zeit in Anspruch nehmen w\u00fcrde. Dennoch erwiesen sich die meisten Anfragen als sehr einfach zu optimieren, und viele Probleme wiederholten sich in verschiedenen Variationen dutzende Male. Hier sind einige Beispiele f\u00fcr typische Optimierungen, die wir auf Dutzende \u00e4hnlicher Anfragen angewendet haben, wobei jede Gruppe optimierter Anfragen die DB um 3-5 % entlastete.<\/p>\n<ul>\n<li> Anstatt die Existenz von Datens\u00e4tzen mit COUNT zu \u00fcberpr\u00fcfen und die gesamte Tabelle zu scannen, begannen wir EXISTS zu verwenden.\n <\/li>\n<li>Wir haben auf DISTINCT verzichtet (es gibt kein allgemeines Rezept, aber manchmal kann man leicht darauf verzichten und die Anfrage um das 10-100-fache beschleunigen).\n<p>Zum Beispiel anstelle einer Anfrage zur Auswahl aller Fahrer aus einer gro\u00dfen Liefertabelle (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>\nerstellten wir eine Anfrage \u00fcber die vergleichsweise kleine Tabelle 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>\nEs schien zwar, als h\u00e4tten wir eine korrelierende Unterabfrage verwendet, aber sie sorgte f\u00fcr eine Beschleunigung von mehr als 10-fach.\n <\/li>\n<li>In vielen F\u00e4llen haben wir COUNT ganz aufgegeben und <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.citusdata.com\/blog\/2016\/10\/12\/count-performance\/#dup_counts_estimated_filtered\">es durch die Berechnung eines ungef\u00e4hren Wertes ersetzt.<\/a><\/noindex>\n <\/li>\n<li>anstatt\n<pre><code class=\"sql\">UPPER(s) LIKE JOHN%\u2019 \n<\/code><\/pre>\n<p>\nverwenden wir <\/p>\n<pre><code class=\"sql\">s ILIKE \u201cJohn%\u201d\n<\/code><\/pre>\n<p>\n <\/li>\n<\/ul>\n<p>\nEs gelang uns, jede einzelne Anfrage manchmal um das 3-1000-fache zu beschleunigen. Trotz beeindruckender Ergebnisse schien es uns anfangs, dass eine Optimierung von Anfragen, die in 10 ms ausgef\u00fchrt werden und zu den 300 schwersten Anfragen geh\u00f6ren, sowie einen minimalen Anteil an der Gesamtbelastung der DB ausmachen, keinen Sinn macht. Doch indem wir dasselbe Rezept auf eine Gruppe \u00e4hnlicher Anfragen anwendeten, konnten wir mehrere Prozent zur\u00fcckgewinnen. Um keine Zeit mit der manuellen \u00dcberpr\u00fcfung aller Hunderten von Anfragen zu verbringen, schrieben wir mehrere einfache Skripte, die mithilfe von regul\u00e4ren Ausdr\u00fccken \u00e4hnliche Anfragen fanden. Letztendlich erm\u00f6glichte uns die automatische Suche nach Anfragegruppen eine noch gr\u00f6\u00dfere Verbesserung unserer Leistung bei bescheidenem Aufwand.<\/p>\n<p>Insgesamt arbeiten wir nun seit drei Jahren mit derselben Hardware. Die durchschnittliche t\u00e4gliche Auslastung liegt bei etwa 30 %, in Spitzenzeiten erreicht sie bis zu 70 %. Die Anzahl der Anfragen und der Benutzer ist etwa 10 Mal gestiegen. Und das alles dank der st\u00e4ndigen \u00dcberwachung dieser Gruppen von TOP-MEDIUM-Anfragen. Sobald eine neue Anfrage in der TOP-Gruppe auftaucht, analysieren wir sie sofort und versuchen, sie zu beschleunigen. Die MEDIUM-Gruppe \u00fcberpr\u00fcfen wir einmal pro Woche mit Skripten zur Analyse der Anfragen. Wenn wir neue Anfragen finden, von denen wir bereits wissen, wie wir sie optimieren k\u00f6nnen, \u00e4ndern wir sie schnell. Manchmal entdecken wir neue Optimierungsm\u00f6glichkeiten, die wir sofort auf mehrere Anfragen anwenden k\u00f6nnen. <\/p>\n<p>Nach unseren Prognosen wird der aktuelle Server eine weitere Erh\u00f6hung der Benutzeranzahl um das 3- bis 5-Fache aushalten. Allerdings haben wir noch ein Ass im \u00c4rmel \u2013 wir haben die SELECT-Anfragen noch nicht auf das Spiegel-Server \u00fcbertragen, wie es empfohlen wird. Aber das tun wir bewusst nicht, da wir zun\u00e4chst die M\u00f6glichkeiten der \u201eintelligenten\u201c Optimierung vollst\u00e4ndig aussch\u00f6pfen m\u00f6chten, bevor wir die \u201eschwere Artillerie\u201c einsetzen.<br \/>\nEin kritischer Blick auf die geleistete Arbeit k\u00f6nnte darauf hinweisen, vertikales Scaling zu nutzen. Einen leistungsst\u00e4rkeren Server kaufen, anstatt die Zeit der Spezialisten zu verschwenden. Ein Server kann nicht so teuer sein, zumal die Grenzen des vertikalen Scalings bei uns noch nicht ausgesch\u00f6pft sind. Allerdings ist die Anzahl der Anfragen nur um das 10-fache gestiegen. \u00dcber die Jahre hat sich die Funktionalit\u00e4t des Systems erh\u00f6ht, und jetzt gibt es mehr Sorten von Anfragen. Die Funktionalit\u00e4t, die vorhanden war, wird durch Caching mit weniger Anfragen, und zwar mit effektiveren Anfragen, ausgef\u00fchrt. Das bedeutet, dass man noch zus\u00e4tzlich mit 5 multiplizieren kann, um den realen Beschleunigungsfaktor zu erhalten. Somit kann man bescheiden sagen, dass die Beschleunigung 50 Mal oder mehr betr\u00e4gt. Ein vertikales Hochstufen des Servers um 50 Mal w\u00e4re teurer gewesen. Besonders wenn man bedenkt, dass eine einmal durchgef\u00fchrte Optimierung immer funktioniert, w\u00e4hrend die Rechnung f\u00fcr den gemieteten Server jeden Monat kommt.<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 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\/de\/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=\"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?\" \/>\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\udd47Optimierung von Datenbankabfragen am Beispiel eines B2B-Dienstes f\u00fcr Bauunternehmer | ProHoster","description":"Wie kann man die Anzahl der Anfragen an die Datenbank um das 10-Fache steigern, ohne auf einen leistungsf\u00e4higeren Server umzuziehen und die Funktionsf\u00e4higkeit des Systems zu erhalten?","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?","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}