{"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\/sv\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej","title":{"rendered":"Optimering av databass\u00f6kningar med B2B-tj\u00e4nst f\u00f6r byggare som exempel","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hur kan man \u00f6ka antalet databasfr\u00e5gor med tio g\u00e5nger utan att byta till en kraftfullare server och \u00e4nd\u00e5 beh\u00e5lla systemets funktionalitet? Jag ska ber\u00e4tta hur vi k\u00e4mpade mot minskad prestanda i v\u00e5r databas, hur vi optimerade SQL-fr\u00e5gor f\u00f6r att betj\u00e4na s\u00e5 m\u00e5nga anv\u00e4ndare som m\u00f6jligt utan att \u00f6ka kostnaderna f\u00f6r ber\u00e4kningsresurser.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nJag skapar en tj\u00e4nst f\u00f6r hantering av aff\u00e4rsprocesser f\u00f6r byggf\u00f6retag. Cirka 3 000 f\u00f6retag arbetar med oss. Mer \u00e4n 10 000 personer arbetar varje dag med v\u00e5rt system i 4-10 timmar. Det l\u00f6ser olika uppgifter inom planering, avisering, varning, validering\u2026 Vi anv\u00e4nder PostgreSQL 9.6. I databasen har vi cirka 300 tabeller och varje dag f\u00e5r vi upp till 200 miljoner fr\u00e5gor (10 000 olika). I genomsnitt har vi 3-4 000 fr\u00e5gor per sekund, under de mest aktiva stunderna \u00f6ver 10 000 fr\u00e5gor per sekund. Majoriteten av fr\u00e5gorna \u00e4r OLAP. Till\u00e4gg, modifieringar och borttagningar \u00e4r mycket f\u00e4rre, s\u00e5 OLTP-belastningen \u00e4r relativt liten. Jag gav dessa siffror s\u00e5 att ni kan bed\u00f6ma omfattningen av v\u00e5rt projekt och f\u00f6rst\u00e5 hur v\u00e5r erfarenhet kan vara anv\u00e4ndbar f\u00f6r er.<\/p>\n<h3>F\u00f6rsta bilden. Lyrisk<\/h3>\n<p>\nN\u00e4r vi b\u00f6rjade utveckla, t\u00e4nkte vi inte s\u00e4rskilt mycket p\u00e5 vilken belastning som skulle ligga p\u00e5 databasen och vad vi skulle g\u00f6ra om servern slutade fungera. Vid utformningen av databasen f\u00f6ljde vi allm\u00e4nna rekommendationer och f\u00f6rs\u00f6kte undvika att skjuta oss sj\u00e4lva i foten, men l\u00e4ngre \u00e4n s\u00e5 gick vi inte i r\u00e5d som \"anv\u00e4nd inte m\u00f6nstret <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity%E2%80%93attribute%E2%80%93value_model\">Entity Attribute Values<\/a><\/noindex> Vi gick inte. Vi designade utifr\u00e5n normaliseringsprinciperna f\u00f6r att undvika dataduplicering och brydde oss inte om att p\u00e5skynda vissa fr\u00e5gor. N\u00e4r de f\u00f6rsta anv\u00e4ndarna kom, st\u00f6tte vi p\u00e5 prestandaproblem. Som vanligt var vi helt of\u00f6rberedda f\u00f6r detta. De f\u00f6rsta problemen var enkla. I allm\u00e4nhet l\u00f6stes allt genom att l\u00e4gga till en ny index. Men det kom en tid d\u00e5 enkla lappar slutade fungera. N\u00e4r vi ins\u00e5g att vi saknade erfarenhet och att det blev allt sv\u00e5rare att f\u00f6rst\u00e5 vad problemen berodde p\u00e5, anlitade vi specialister som hj\u00e4lpte oss att korrekt konfigurera servern, ansluta \u00f6vervakning, och visade oss vart vi skulle titta f\u00f6r att f\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/9.6\/pgstatstatements.html\">statistik.<\/a><\/noindex>.<\/p>\n<h3>Andra bilden. Statistik<\/h3>\n<p>\nVi har ungef\u00e4r 10 000 olika f\u00f6rfr\u00e5gningar som k\u00f6rs p\u00e5 v\u00e5r databas varje dag. Av dessa 10 000 finns det stora f\u00f6rfr\u00e5gningar som k\u00f6rs 2-3 miljoner g\u00e5nger med en genomsnittlig k\u00f6rningstid p\u00e5 0,1-0,3 ms, och s\u00e5 finns det f\u00f6rfr\u00e5gningar med en genomsnittlig k\u00f6rningstid p\u00e5 30 sekunder som anropas 100 g\u00e5nger om dagen.<\/p>\n<p>Det var inte m\u00f6jligt att optimera alla 10 000 f\u00f6rfr\u00e5gningar, s\u00e5 vi beslutade att ta reda p\u00e5 hur vi skulle rikta v\u00e5ra insatser f\u00f6r att korrekt \u00f6ka databasens prestanda. Efter flera iterationer b\u00f6rjade vi dela upp f\u00f6rfr\u00e5gningarna i typer.<\/p>\n<h4>TOP-f\u00f6rfr\u00e5gningar<\/h4>\n<p>\nDessa \u00e4r de tyngsta f\u00f6rfr\u00e5gningarna som tar mest tid (total tid). Det \u00e4r f\u00f6rfr\u00e5gningar som antingen anropas mycket ofta eller som tar mycket l\u00e5ng tid att genomf\u00f6ra (l\u00e5nga och frekventa f\u00f6rfr\u00e5gningar har redan optimerats under de f\u00f6rsta iterationerna i jakten p\u00e5 hastighet). Totalt spenderar servern mest tid p\u00e5 att exekvera dem. Det \u00e4r ocks\u00e5 viktigt att separera toppf\u00f6rfr\u00e5gningarna efter total exekveringstid och separat efter IO-tid. S\u00e4tten att optimera s\u00e5dana f\u00f6rfr\u00e5gningar \u00e4r n\u00e5got olika.<\/p>\n<p>Det \u00e4r vanlig praxis f\u00f6r alla f\u00f6retag att arbeta med TOP-f\u00f6rfr\u00e5gningarna. De \u00e4r f\u00e5, och \u00e4ven optimering av en enda f\u00f6rfr\u00e5gan kan frig\u00f6ra 5-10% av resurserna. Men ju mer projektet \"v\u00e4xer\", desto mer okomplicerad blir optimeringen av TOP-f\u00f6rfr\u00e5gningarna. Alla enkla metoder \u00e4r redan utf\u00f6rda, och den mest \"tunga\" f\u00f6rfr\u00e5gan tar \"bara\" 3-5% av resurserna. Om TOP-f\u00f6rfr\u00e5gningarna totalt tar mindre \u00e4n 30-40% av tiden, har du f\u00f6rmodligen redan anstr\u00e4ngt dig f\u00f6r att de ska fungera snabbt, och det \u00e4r dags att g\u00e5 vidare till optimering av f\u00f6rfr\u00e5gningar i n\u00e4sta grupp.<br \/>\nFr\u00e5gan kvarst\u00e5r: hur m\u00e5nga toppf\u00f6rfr\u00e5gningar ska inkluderas i den h\u00e4r gruppen? Jag brukar ta minst 10, men inte fler \u00e4n 20. Jag f\u00f6rs\u00f6ker se till att tiden f\u00f6r den f\u00f6rsta och sista i TOP-gruppen inte skiljer sig mer \u00e4n 10 g\u00e5nger. S\u00e5 om k\u00f6rningstiden f\u00f6r f\u00f6rfr\u00e5gningarna faller kraftigt fr\u00e5n plats 1 till 10, s\u00e5 tar jag TOP-10; om nedg\u00e5ngen \u00e4r mer gradvis, \u00f6kar jag gruppens storlek till 15 eller 20.<br \/>\n<img decoding=\"async\" alt=\"Optimering av databass\u00f6kningar med B2B-tj\u00e4nst f\u00f6r byggare som exempel\" src=\"\/wp-content\/uploads\/2019\/08\/2a9d9e6053d1aebb71aa213757bd2393.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>Medel (medium)<\/h4>\n<p>\nDetta \u00e4r alla f\u00f6rfr\u00e5gningar som kommer direkt efter TOP, med undantag f\u00f6r de senaste 5-10%. Vanligtvis ligger m\u00f6jligheten att avsev\u00e4rt \u00f6ka serverns prestanda i optimeringen av just dessa f\u00f6rfr\u00e5gningar. Dessa f\u00f6rfr\u00e5gningar kan utg\u00f6ra upp till 80%. Men \u00e4ven om deras andel har \u00f6verskridit 50%, betyder det att det \u00e4r dags att titta noggrannare p\u00e5 dem.<\/p>\n<h4>Svansen (tail)<\/h4>\n<p>\nSom n\u00e4mnts, dessa f\u00f6rfr\u00e5gningar ligger i slutet och tar upp 5-10 % av tiden. Man kan gl\u00f6mma dem, endast om man inte anv\u00e4nder automatiska analysverktyg f\u00f6r f\u00f6rfr\u00e5gningar, d\u00e5 kan deras optimering ocks\u00e5 g\u00f6ras billigt.<\/p>\n<p>Hur bed\u00f6mer man varje grupp?<\/p>\n<p>Jag anv\u00e4nder en SQL-fr\u00e5ga som hj\u00e4lper till att g\u00f6ra en s\u00e5dan bed\u00f6mning f\u00f6r PostgreSQL (jag \u00e4r s\u00e4ker p\u00e5 att man kan skriva en liknande fr\u00e5ga f\u00f6r m\u00e5nga andra databashanteringssystem).<\/p>\n<p><b class=\"spoiler_title\">SQL-fr\u00e5ga f\u00f6r att bed\u00f6ma storleken 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) 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>Fr\u00e5geresultatet best\u00e5r av tre kolumner, var och en inneh\u00e5ller procentandelen av tiden som g\u00e5r \u00e5t till att behandla f\u00f6rfr\u00e5gningar fr\u00e5n denna grupp. Inom fr\u00e5gan finns tv\u00e5 siffror (i mitt fall \u00e4r det 20 och 800) som skiljer f\u00f6rfr\u00e5gningar fr\u00e5n en grupp till en annan.<\/p>\n<p>S\u00e5 h\u00e4r relaterar andelarna av f\u00f6rfr\u00e5gningar vid b\u00f6rjan av optimeringsarbetet och nu.<\/p>\n<p><img decoding=\"async\" alt=\"Optimering av databass\u00f6kningar med B2B-tj\u00e4nst f\u00f6r byggare som exempel\" src=\"\/wp-content\/uploads\/2019\/08\/9c70ad9aba8b835c94729c9dda656eab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDiagrammet visar att andelen TOP-f\u00f6rfr\u00e5gningar har minskat kraftigt, medan \"medel\" har \u00f6kat.<br \/>\nTill en b\u00f6rjan inkluderade TOP-f\u00f6rfr\u00e5gningar uppenbara misstag. Med tiden f\u00f6rsvann barnsjukdomarna, andelen TOP-f\u00f6rfr\u00e5gningar minskade, och det kr\u00e4vdes allt mer anstr\u00e4ngning f\u00f6r att snabba upp de tunga f\u00f6rfr\u00e5gningarna. <\/p>\n<p><b class=\"spoiler_title\">F\u00f6r att f\u00e5 texten av f\u00f6rfr\u00e5gningarna anv\u00e4nder vi f\u00f6ljande fr\u00e5ga<\/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>H\u00e4r \u00e4r en lista \u00f6ver de mest anv\u00e4nda metoderna som hj\u00e4lpte oss att snabba upp TOP-f\u00f6rfr\u00e5gningar:<\/p>\n<ul>\n<li>Omdesign av systemet, till exempel omarbetning av logiken f\u00f6r aviseringar till en meddelandebroker ist\u00e4llet f\u00f6r periodiska f\u00f6rfr\u00e5gningar till databasen.<\/li>\n<li>L\u00e4gg till eller \u00e4ndra index.<\/li>\n<li>Omarbeta ORM-f\u00f6rfr\u00e5gningar till ren SQL.<\/li>\n<li>Omarbeta logiken f\u00f6r lazy laddning av data.<\/li>\n<li>Caching genom denormalisering av data. Till exempel har vi en koppling mellan tabellerna Leverans -&gt; Faktura -&gt; F\u00f6rfr\u00e5gning -&gt; Ans\u00f6kan. Det vill s\u00e4ga varje leverans \u00e4r kopplad till en ans\u00f6kan genom andra tabeller. F\u00f6r att inte koppla alla tabeller i varje f\u00f6rfr\u00e5gning duplicerade vi kopplingen till ans\u00f6kan i tabellen Leverans.<\/li>\n<li>Caching av statiska tabeller med referenser och s\u00e4llan f\u00f6r\u00e4ndrade tabeller i programmets minne.<\/li>\n<\/ul>\n<p>\nIbland kr\u00e4vde f\u00f6r\u00e4ndringar en betydande redesign, men gav en avlastning p\u00e5 5-10% av systemet och var ber\u00e4ttigade. Med tiden blev vinsten allt mindre och redesignen blev allt mer omfattande.<\/p>\n<p>D\u00e5 uppm\u00e4rksammade vi den andra gruppen av f\u00f6rfr\u00e5gningar - gruppen av medelstora. Det fanns betydligt fler f\u00f6rfr\u00e5gningar i den och det verkade som om en analys av hela gruppen skulle ta v\u00e4ldigt mycket tid. Men de flesta f\u00f6rfr\u00e5gningarna visade sig vara v\u00e4ldigt enkla att optimera, och m\u00e5nga problem \u00e5terkom i olika varianter. H\u00e4r \u00e4r exempel p\u00e5 n\u00e5gra typiska optimeringar som vi till\u00e4mpade p\u00e5 tiotals liknande f\u00f6rfr\u00e5gningar och varje grupp av optimerade f\u00f6rfr\u00e5gningar avlastade databasen med 3-5%.<\/p>\n<ul>\n<li> Ist\u00e4llet f\u00f6r att kontrollera f\u00f6rekomsten av poster med COUNT och full skanning av tabellen b\u00f6rjade vi anv\u00e4nda EXISTS.\n <\/li>\n<li>Vi avskaffade DISTINCT (det finns ingen allm\u00e4n l\u00f6sning, men ibland kan man enkelt bli av med det och snabba upp f\u00f6rfr\u00e5gan 10-100 g\u00e5nger).\n<p>Till exempel, ist\u00e4llet f\u00f6r en f\u00f6rfr\u00e5gan f\u00f6r att h\u00e4mta alla f\u00f6rare fr\u00e5n en stor leveransdatabas (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>\ngjorde vi en f\u00f6rfr\u00e5gan mot en j\u00e4mf\u00f6relsevis liten tabell 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>\nDet verkade som om vi anv\u00e4nde en korrelerad subfr\u00e5ga, men den ger en snabbare k\u00f6rning p\u00e5 mer \u00e4n 10 g\u00e5nger.\n <\/li>\n<li>I m\u00e5nga fall avstod vi helt fr\u00e5n COUNT och <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.citusdata.com\/blog\/2016\/10\/12\/count-performance\/#dup_counts_estimated_filtered\">ersatte det med en ber\u00e4kning av ett approximativt v\u00e4rde.<\/a><\/noindex>\n <\/li>\n<li>ist\u00e4llet f\u00f6r\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>\nVarje specifik f\u00f6rfr\u00e5gan lyckades vi p\u00e5 vissa s\u00e4tt accelerera med 3-1000 g\u00e5nger. Trots de imponerande resultaten, trodde vi f\u00f6rst att det inte fanns n\u00e5got syfte med att optimera en f\u00f6rfr\u00e5gan som utf\u00f6rs p\u00e5 10 ms, som ligger i den tredje hundradet av de tyngsta f\u00f6rfr\u00e5gningarna och som totalt sett bara utg\u00f6r br\u00e5kdelar av procenten av databassbelastningen. Men genom att till\u00e4mpa samma recept p\u00e5 en grupp av liknande f\u00f6rfr\u00e5gningar \u00e5terh\u00e4mtade vi flera procent. F\u00f6r att slippa spendera tid p\u00e5 manuell granskning av alla hundratals f\u00f6rfr\u00e5gningar skrev vi n\u00e5gra enkla skript som med hj\u00e4lp av regulj\u00e4ra uttryck identifierade liknande f\u00f6rfr\u00e5gningar. Slutligen gjorde den automatiska s\u00f6kningen efter grupper av f\u00f6rfr\u00e5gningar att vi ytterligare kunde f\u00f6rb\u00e4ttra v\u00e5r prestanda med blygsamma insatser.<\/p>\n<p>Resultatet \u00e4r att vi redan har arbetat med samma h\u00e5rdvara i tre \u00e5r. Den genomsnittliga belastningen ligger runt 30%, och under toppar g\u00e5r den upp till 70%. Antalet f\u00f6rfr\u00e5gningar och anv\u00e4ndare har \u00f6kat ungef\u00e4r tio g\u00e5nger. Och allt detta tack vare v\u00e5rt st\u00e4ndiga \u00f6vervakande av dessa grupper av f\u00f6rfr\u00e5gningar TOP-MEDIUM. S\u00e5 snart en ny f\u00f6rfr\u00e5gan dyker upp i TOP-gruppen analyserar vi den genast och f\u00f6rs\u00f6ker snabbare. MEDIUM-gruppen granskas en g\u00e5ng i veckan med hj\u00e4lp av skript f\u00f6r f\u00f6rfr\u00e5gningsanalys. Om vi hittar nya f\u00f6rfr\u00e5gningar som vi redan vet hur vi ska optimera, \u00e4ndrar vi dem snabbt. Ibland hittar vi nya s\u00e4tt att optimera som kan till\u00e4mpas direkt p\u00e5 flera f\u00f6rfr\u00e5gningar. <\/p>\n<p>Enligt v\u00e5ra prognoser kan den nuvarande servern hantera en \u00f6kning av antalet anv\u00e4ndare med ytterligare 3-5 g\u00e5nger. Men vi har ocks\u00e5 ett ess i rock\u00e4rmen - vi har fortfarande inte flyttat SELECT-f\u00f6rfr\u00e5gningarna till spegeln, som rekommenderas. Men vi g\u00f6r inte det medvetet, eftersom vi vill f\u00f6rst helt utnyttja m\u00f6jligheterna f\u00f6r \"smart\" optimering innan vi s\u00e4tter in \"tyngre artilleri\".<br \/>\nEn kritisk granskning av det utf\u00f6rda arbetet kan f\u00f6resl\u00e5 att man anv\u00e4nder vertikal skalning. Att k\u00f6pa en kraftfullare server ist\u00e4llet f\u00f6r att l\u00e5ta specialister sl\u00f6sa tid. En server kan kosta ganska lite, s\u00e4rskilt eftersom v\u00e5ra gr\u00e4nser f\u00f6r vertikal skalning fortfarande inte har utnyttjats. Men antalet f\u00f6rfr\u00e5gningar har \u00f6kat tio g\u00e5nger. Under \u00e5ren har systemets funktionalitet \u00f6kat och nu finns det fler typer av f\u00f6rfr\u00e5gningar. Den funktionalitet som fanns, utf\u00f6rs tack vare cachen med f\u00e4rre, men mer effektiva f\u00f6rfr\u00e5gningar. Det betyder att vi kan multiplicera med fem f\u00f6r att f\u00e5 den verkliga hastighets\u00f6kningen. S\u00e5 enligt de mest blygsamma ber\u00e4kningarna kan man s\u00e4ga att hastighets\u00f6kningen har varit 50 g\u00e5nger eller mer. Att vertikalt uppgradera servern 50 g\u00e5nger skulle kosta mer. S\u00e4rskilt med tanke p\u00e5 att en g\u00e5ng utf\u00f6rd optimering fungerar hela tiden, medan fakturan f\u00f6r den hyrda servern kommer varje m\u00e5nad.<br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/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.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Optimering av databasf\u00f6rfr\u00e5gningar med exempel fr\u00e5n B2B-tj\u00e4nsten f\u00f6r byggare | ProHoster","description":"Hur kan man v\u00e4xa med 10 g\u00e5nger i antalet f\u00f6rfr\u00e5gningar till databasen utan att byta till en mer kraftfull server och samtidigt beh\u00e5lla systemets funktionalitet?","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/36704","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=36704"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/36704\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/27493"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=36704"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=36704"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=36704"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}