{"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\/da\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej","title":{"rendered":"Database queryoptimering med et B2B-servicefokus for byggere","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hvordan kan man vokse med 10 gange antallet af foresp\u00f8rgsler til databasen uden at flytte til en mere kraftfuld server og samtidig opretholde systemets funktionalitet? Jeg vil fort\u00e6lle, hvordan vi k\u00e6mpede med faldet i ydeevnen for vores database, hvordan vi optimerede SQL-foresp\u00f8rgsler for at betjene s\u00e5 mange brugere som muligt uden at \u00f8ge omkostningerne til beregningsressourcer.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nJeg laver en service til at styre forretningsprocesser i byggevirksomheder. Vi arbejder med omkring 3.000 virksomheder. Mere end 10.000 mennesker arbejder hver dag med vores system i 4-10 timer. Det l\u00f8ser forskellige planl\u00e6gnings-, varslings-, advarsels- og valideringsopgaver... Vi bruger PostgreSQL 9.6. I databasen har vi omkring 300 tabeller, og hver dag modtager vi op til 200 millioner foresp\u00f8rgsler (10.000 forskellige). I gennemsnit har vi 3-4.000 foresp\u00f8rgsler pr. sekund, og p\u00e5 de mest aktive tidspunkter over 10.000 foresp\u00f8rgsler pr. sekund. St\u00f8rstedelen af foresp\u00f8rgslerne er OLAP. Tilf\u00f8jelser, modificeringer og sletninger er meget f\u00e6rre, dvs. OLTP-belastningen er relativt lille. Alle disse tal n\u00e6vnte jeg for at give dig et indtryk af omfanget af vores projekt og forst\u00e5, hvor nyttig vores erfaring kan v\u00e6re for dig.<\/p>\n<h3>Billede \u00e9t. Lyrisk<\/h3>\n<p>\nDa vi begyndte udviklingen, t\u00e6nkte vi ikke meget over, hvor meget belastning der ville v\u00e6re p\u00e5 databasen, og hvad vi ville g\u00f8re, hvis serveren ikke l\u00e6ngere kunne klare det. Ved design af databasen fulgte vi generelle anbefalinger og pr\u00f8vede ikke at tr\u00e6de os selv over t\u00e6erne, men l\u00e6ngere end de generelle r\u00e5d som \u2018brug ikke m\u00f8nsteret <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity%E2%80%93attribute%E2%80%93value_model\">Entity Attribute Values<\/a><\/noindex> kom vi ikke. Vi designede baseret p\u00e5 normaliseringsprincipper og undgik dataduplicering, og vi bekymrede os ikke om at fremskynde bestemte foresp\u00f8rgsler. S\u00e5 snart de f\u00f8rste brugere kom, st\u00f8dte vi p\u00e5 et ytelsesproblem. Som vanligt var vi helt uforberedte p\u00e5 dette. De f\u00f8rste problemer var enkle. Som regel blev det l\u00f8st ved at tilf\u00f8je et nyt indeks. Men der kom et tidspunkt, hvor de enkle l\u00f8sninger ikke l\u00e6ngere virkede. Inds\u00e5, at vi ikke havde nok erfaring, og at det blev sv\u00e6rere at forst\u00e5, hvad \u00e5rsagen til problemerne var, ansatte vi specialister, der hjalp os med at konfigurere serveren korrekt, tilslutte overv\u00e5gningen, og viste os, hvor vi skulle kigge for at f\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/9.6\/pgstatstatements.html\">statistik<\/a><\/noindex>.<\/p>\n<h3>Billede to. Statistisk<\/h3>\n<p>\nS\u00e5 vi har omkring 10.000 forskellige foresp\u00f8rgsler, der k\u00f8rer p\u00e5 vores database hver dag. Blandt disse 10.000 er der monstre, der udf\u00f8res 2-3 millioner gange med en gennemsnitlig udf\u00f8relsestid p\u00e5 0,1-0,3 ms, og der er foresp\u00f8rgsler med en gennemsnitlig udf\u00f8relsestid p\u00e5 30 sekunder, der kaldes 100 gange om dagen.<\/p>\n<p>Det var ikke muligt at optimere alle 10.000 foresp\u00f8rgsler, s\u00e5 vi besluttede at finde ud af, hvor vi skulle rette vores indsats for at \u00f8ge databaseydelsen korrekt. Efter flere iterationer begyndte vi at opdele foresp\u00f8rgslerne i typer.<\/p>\n<h4>TOP foresp\u00f8rgsler<\/h4>\n<p>\nDette er de mest ressourcekr\u00e6vende foresp\u00f8rgsler, der bruger mest tid (total tid). Det er foresp\u00f8rgsler, der enten kaldes meget ofte, eller foresp\u00f8rgsler, der tager meget lang tid at udf\u00f8re (lange og hyppige foresp\u00f8rgsler blev optimeret allerede i de f\u00f8rste iterationer i kampen for hastigheden). I sidste ende bruger serveren mest tid p\u00e5 deres udf\u00f8relse. Det er vigtigt at adskille topforesp\u00f8rgsler efter samlet udf\u00f8relsestid og separat efter IO-tid. Metoderne til optimering af s\u00e5danne foresp\u00f8rgsler er lidt forskellige.<\/p>\n<p>Det er almindelig praksis blandt alle virksomheder at arbejde med TOP foresp\u00f8rgsler. Der er ikke mange af dem, og optimering af selv \u00e9n foresp\u00f8rgsel kan spare 5-10% af ressourcerne. Men efterh\u00e5nden som projektet \"modnes\", bliver optimeringen af TOP foresp\u00f8rgsler en mere og mere ikke-trivial opgave. Alle de enkle metoder er allerede blevet anvendt, og den \"tungere\" foresp\u00f8rgsel bruger \"kun\" 3-5% af ressourcerne. Hvis TOP foresp\u00f8rgsler samlet set tager mindre end 30-40% af tiden, har du sandsynligvis allerede gjort en indsats for at f\u00e5 dem til at k\u00f8re hurtigt, og det er tid til at g\u00e5 videre til optimering af foresp\u00f8rgslerne i den n\u00e6ste gruppe.<br \/>\nDet er tilbage at besvare sp\u00f8rgsm\u00e5let om, hvor mange topforesp\u00f8rgsler der skal inkluderes i denne gruppe. Jeg tager normalt ikke mindre end 10, men ikke mere end 20. Jeg pr\u00f8ver at sikre, at tiden for den f\u00f8rste og den sidste i TOP-gruppen ikke adskiller sig mere end 10 gange. S\u00e5 hvis udf\u00f8relsestiden for foresp\u00f8rgslerne falder pludseligt fra 1. plads til 10. plads, tager jeg TOP-10; hvis faldet er mere gradvist, \u00f8ger jeg gruppens st\u00f8rrelse til 15 eller 20.<br \/>\n<img decoding=\"async\" alt=\"Database queryoptimering med et B2B-servicefokus for byggere\" src=\"\/wp-content\/uploads\/2019\/08\/2a9d9e6053d1aebb71aa213757bd2393.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>Mellemforskelle (medium)<\/h4>\n<p>\nDette er alle foresp\u00f8rgsler, der f\u00f8lger lige efter TOP, med undtagelse af de sidste 5-10%. Normalt er det i optimeringen af disse foresp\u00f8rgsler, at muligheden for alvorligt at \u00f8ge serverens ydeevne ligger. Disse foresp\u00f8rgsler kan \"veje op til 80%.\" Men selv hvis deres andel overstiger 50%, er det tid til at se n\u00e6rmere p\u00e5 dem.<\/p>\n<h4>Haleforf\u00f8gelser (tail)<\/h4>\n<p>\nSom n\u00e6vnt g\u00e5r disse foresp\u00f8rgsler til slutningen, og de tager 5-10% af tiden. Man kan glemme dem, medmindre man bruger automatiske analysesoftware til foresp\u00f8rgsler, s\u00e5 kan optimeringen ogs\u00e5 v\u00e6re billig.<\/p>\n<p>Hvordan vurderer man hver gruppe?<\/p>\n<p>Jeg bruger en SQL-foresp\u00f8rgsel, som hj\u00e6lper med at lave s\u00e5dan en vurdering for PostgreSQL (jeg er sikker p\u00e5, at man kan skrive en lignende foresp\u00f8rgsel for mange andre databaser).<\/p>\n<p><b class=\"spoiler_title\">SQL-foresp\u00f8rgsel til vurdering af st\u00f8rrelsen p\u00e5 TOP-MEDIUM-TAIL grupper<\/b><\/p>\n<pre><code class=\"sql\">SELECT sum(time_top) AS sum_top, sum(time_medium) AS sum_medium, sum(time_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>Resultatet af foresp\u00f8rgslen - tre kolonner, hver indeholdende procentdelen af tiden, der bruges p\u00e5 at behandle foresp\u00f8rgsler fra denne gruppe. Inden i foresp\u00f8rgslen er der to tal (i mit tilf\u00e6lde 20 og 800), som adskiller foresp\u00f8rgslerne fra den ene gruppe til den anden.<\/p>\n<p>Her er forholdet mellem andelene af foresp\u00f8rgsler ved begyndelsen af optimeringsarbejdet og nu.<\/p>\n<p><img decoding=\"async\" alt=\"Database queryoptimering med et B2B-servicefokus for byggere\" src=\"\/wp-content\/uploads\/2019\/08\/9c70ad9aba8b835c94729c9dda656eab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDiagrammet viser, at andelen af TOP-foresp\u00f8rgsler er faldet kraftigt, mens 'mellemstore' foresp\u00f8rgsler er steget.<br \/>\nI starten var der \u00e5benlyse fejl i TOP-foresp\u00f8rgslerne. Over tid forsvandt de barne sygdomme, andelen af TOP-foresp\u00f8rgsler faldt, og der skulle l\u00e6gges mere og mere arbejde i at accelerere de tunge foresp\u00f8rgsler. <\/p>\n<p><b class=\"spoiler_title\">For at f\u00e5 teksten af foresp\u00f8rgslerne bruger vi en s\u00e5dan foresp\u00f8rgsel<\/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>Her er listen over de mest brugte metoder, der har hjulpet os med at accelerere TOP-foresp\u00f8rgslerne:<\/p>\n<ul>\n<li>Redesign af systemet, for eksempel redesign af logikken for meddelelser til message broker i stedet for periodiske foresp\u00f8rgsler til databasen.<\/li>\n<li>Tilf\u00f8jelse eller \u00e6ndring af indekser.<\/li>\n<li>Omskrivning af ORM-foresp\u00f8rgsler til ren SQL.<\/li>\n<li>Omskrivning af logikken for lazy indl\u00e6sning af data.<\/li>\n<li>Caching gennem denormalisering af data. For eksempel har vi en forbindelse mellem tabellerne Levering -&gt; Faktura -&gt; Foresp\u00f8rgsel -&gt; Ans\u00f8gning. Det vil sige, at hver levering er knyttet til en ans\u00f8gning gennem andre tabeller. For ikke at skulle forbinde alle tabellerne i hver foresp\u00f8rgsel har vi duplikeret referencen til ans\u00f8gningen i tabellen Levering.<\/li>\n<li>Caching of static tables with reference data and rarely changing tables in program memory.<\/li>\n<\/ul>\n<p>\nSometimes changes led to significant redesigns, but they provided a 5-10% load reduction and were justified. Over time, the output decreased, and more serious redesigns were needed.<\/p>\n<p>Then we turned our attention to the second group of queries - the mid-range group. It contained many more queries, and it seemed that analyzing the entire group would take a lot of time. However, most queries turned out to be very easy to optimize, and many problems repeated themselves in dozens of different variations. Here are examples of some typical optimizations that we applied to dozens of similar queries, with each group of optimized queries reducing the database load by 3-5%.<\/p>\n<ul>\n<li> Instead of checking the existence of records using COUNT and performing a full table scan, we started using EXISTS.\n <\/li>\n<li>We eliminated DISTINCT (there's no universal recipe, but sometimes it can be easily removed, speeding up the query by 10-100 times).\n<p>For example, instead of a query to select all drivers from a large delivery table (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>\nwe made a query on a comparatively small PERSON table.<\/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>\nIt seemed that we were using a correlating subquery, but it provided a speedup of more than 10 times.\n <\/li>\n<li>In many cases, we completely abandoned COUNT and <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.citusdata.com\/blog\/2016\/10\/12\/count-performance\/#dup_counts_estimated_filtered\">replaced it with an approximation calculation.<\/a><\/noindex>\n <\/li>\n<li>i stedet for\n<pre><code class=\"sql\">UPPER(s) LIKE JOHN% \n<\/code><\/pre>\n<p>\nbruger vi <\/p>\n<pre><code class=\"sql\">s ILIKE \u201cJohn%\u201d\n<\/code><\/pre>\n<p>\n <\/li>\n<\/ul>\n<p>\nEach specific query was sometimes sped up by 3-1000 times. Despite the impressive numbers, at first, we thought there was no point in optimizing a query that executes in 10 ms, ranks in the top 300 most resource-intensive queries, and occupies mere fractions of a percent of the overall database load time. However, by applying the same recipe to a group of identical queries, we regained several percent. To avoid spending time manually reviewing all hundreds of queries, we wrote several simple scripts that used regular expressions to find similar queries. As a result, the automated search for groups of queries allowed us to further improve our performance with modest effort.<\/p>\n<p>I fire at the same hardware for three years now. The average daily load is around 30%, peaking at 70%. The number of requests and users has increased approximately tenfold. All this is thanks to constant monitoring of the TOP-MEDIUM request groups. As soon as a new request appears in the TOP group, we analyze it immediately and try to speed it up. We review the MEDIUM group weekly using request analysis scripts. If new requests show up that we already know how to optimize, we change them quickly. Sometimes we find new optimization methods that can be applied immediately to several requests. <\/p>\n<p>According to our forecasts, the current server can handle an increase in users by another 3-5 times. However, we still have one ace up our sleeve\u2014we have not yet translated SELECT queries to a mirror, as is recommended. But we consciously avoid this, as we want to fully exhaust the possibilities of 'smart' optimization before deploying 'heavy artillery.'<br \/>\nA critical view of the completed work can suggest the use of vertical scaling. Buying a more powerful server, instead of wasting specialists' time. A server may not cost that much, especially since we haven't exhausted the limits of vertical scaling yet. However, the number of requests has only increased tenfold. Over the years, the system's functionality has expanded, leading to a greater variety of requests. The existing functionality now performs with fewer requests, thanks to caching, and those are more efficient requests. This means we can safely multiply by another 5 to get the real acceleration factor. Thus, according to the most modest calculations, we can say that the acceleration has reached 50 times or more. Vertically scaling the server by 50 times would cost more. Especially considering that once optimized, the process works all the time, while the bill for the rented server comes every month.<br \/>\n<br \/>Kilde: <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\/da\/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=\"da_DK\" \/>\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\/da\/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\udd47Database query optimization based on a B2B service example for contractors | ProHoster","description":"How to grow tenfold in database request volume without migrating to a more powerful server while maintaining system functionality?","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/36704","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=36704"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/36704\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/27493"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=36704"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=36704"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=36704"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}