{"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\/sl\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej","title":{"rendered":"Optimizacija poizvedb v bazi podatkov na primeru B2B storitve za gradbenike","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Kako pove\u010dati \u0161tevilo poizvedb v podatkovni bazi za 10-krat, ne da bi pre\u0161li na zmogljivej\u0161i stre\u017enik, in ohraniti delovanje sistema? Povedal bom, kako smo se borili z upadom zmogljivosti na\u0161e baze podatkov in kako smo optimizirali SQL poizvedbe, da bi slu\u017eili \u010dim ve\u010d uporabnikom, ne da bi pove\u010dali stro\u0161ke ra\u010dunalni\u0161kih virov.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nUstvarjam storitev za upravljanje poslovnih procesov v gradbenih podjetjih. Z nami sodeluje pribli\u017eno 3000 podjetij. Ve\u010d kot 10.000 ljudi vsak dan uporablja na\u0161 sistem od 4 do 10 ur. Re\u0161uje razli\u010dne naloge na\u010drtovanja, obve\u0161\u010danja, opozarjanja, validacije\u2026 Uporabljamo PostgreSQL 9.6. V na\u0161i podatkovni bazi je pribli\u017eno 300 tabel in vsak dan v njej obdelamo do 200 milijonov poizvedb (10.000 razli\u010dnih). Povpre\u010dno imamo od 3000 do 4000 poizvedb na sekundo, v najaktivnej\u0161ih trenutkih pa ve\u010d kot 10.000 poizvedb na sekundo. Ve\u010dina poizvedb je OLAP. Dodatkov, sprememb in brisanj je bistveno manj, torej je obremenitev OLTP relativno majhna. Te \u0161tevilke sem navedel, da lahko ocenite obseg na\u0161ega projekta in razumete, kako koristen je lahko na\u0161 izku\u0161nja za vas.<\/p>\n<h3>Prva slika. Liri\u010dna<\/h3>\n<p>\nKo smo za\u010deli z razvojem, nismo posebej razmi\u0161ljali o tem, kak\u0161na obremenitev bo na podatkovni bazi in kaj bomo storili, \u010de stre\u017enik ne bo zmogel. Pri na\u010drtovanju podatkovne baze smo se dr\u017eali splo\u0161nih priporo\u010dil in se trudili, da si ne bi streljali v koleno, vendar nismo \u0161li dlje od splo\u0161nih nasvetov, kot je 'ne uporabljajte vzorca <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity%E2%80%93attribute%E2%80%93value_model\">Entity Attribute Values<\/a><\/noindex> Nehali smo se ukvarjati. Na\u010drtovali smo na osnovi na\u010del normalizacije, ki so se izogibala odve\u010dni podatkov in se nismo skrbeli za pospe\u0161evanje dolo\u010denih poizvedb. Ko so prvi uporabniki pri\u0161li, smo se soo\u010dili s te\u017eavami produktivnosti. Kot ponavadi, nismo bili popolnoma pripravljeni na to. Prve te\u017eave so bile preproste. Obi\u010dajno je vse re\u0161ila dodajanje novega indeksa. Toda pri\u0161el je trenutek, ko preproste popravke niso ve\u010d delovale. Ko smo spoznali, da nam primanjkuje izku\u0161enj in da postaja vse te\u017eje razumeti, v \u010dem so te\u017eave, smo najeli strokovnjake, ki so nam pomagali pravilno nastaviti stre\u017enik, povezati nadzor in nam pokazali, kam gledati, da bi dobili <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/9.6\/pgstatstatements.html\">statistika<\/a><\/noindex>.<\/p>\n<h3>Druga slika. Statisti\u010dna<\/h3>\n<p>\nImamo pribli\u017eno 10.000 razli\u010dnih poizvedb, ki se na na\u0161i bazi podatkov izvajajo na dan. Od teh 10.000 so 'monstri', ki se izvajajo 2-3 milijone krat s povpre\u010dnim \u010dasom izvajanja 0,1-0,3 ms, in so poizvedbe s povpre\u010dnim \u010dasom izvajanja 30 sekund, ki se izvajajo 100 krat na dan.<\/p>\n<p>Optimizirati vseh 10.000 poizvedb ni bilo mogo\u010de, zato smo se odlo\u010dili, da ugotovimo, kam usmeriti prizadevanja za pravilno pove\u010danje zmogljivosti baze podatkov. Po ve\u010d iteracijah smo za\u010deli razdeljevati poizvedbe na tipe.<\/p>\n<h4>TOP poizvedbe<\/h4>\n<p>\nTo so najte\u017eje poizvedbe, ki zahtevajo najve\u010d \u010dasa (skupni \u010das). To so poizvedbe, ki se bodisi zelo pogosto izvajajo ali poizvedbe, ki se zelo dolgo izvajajo (dolge in pogoste poizvedbe so bile optimizirane \u017ee v prvih iteracijah boja za hitrost). Kon\u010dno za njihovo izvajanje stre\u017enik porabi najve\u010d \u010dasa. Pomembno je lo\u010diti top poizvedbe po skupnem \u010dasu izvajanja in posebej po \u010dasu IO. Na\u010dini optimizacije takih poizvedb so nekoliko razli\u010dni.<\/p>\n<p>Obi\u010dajna praksa vseh podjetij je delo s TOP poizvedbami. Teh je malo; optimizacija tudi ene same poizvedbe lahko sprosti 5-10% virov. Vendar pa z 'odra\u0161\u010danjem' projekta optimizacija TOP poizvedb postaja vse bolj nenavadna naloga. Vse enostavne metode so \u017ee bile uporabljene, in najte\u017eja poizvedba vzame 'samo' 3-5% virov. \u010ce TOP poizvedbe skupaj zahtevajo manj kot 30-40% \u010dasa, ste verjetno \u017ee vlo\u017eili trud, da delujejo hitro, in pri\u0161el je \u010das, da preidete na optimizacijo poizvedb iz naslednje skupine.<br \/>\nOstaja odgovoriti na vpra\u0161anje, koliko vrhunskih poizvedb vklju\u010diti v to skupino. Obi\u010dajno izberem najmanj 10, najve\u010d 20. Trudim se, da se \u010das prve in zadnje poizvedbe v TOP skupini ne razlikuje ve\u010d kot 10-krat. To pomeni, da \u010de \u010das izvajanja poizvedb mo\u010dno pade s 1. mesta na 10., izberem TOP-10, \u010de pa je padanje bolj postopno, pove\u010dam velikost skupine na 15 ali 20.<br \/>\n<img decoding=\"async\" alt=\"Optimizacija poizvedb v bazi podatkov na primeru B2B storitve za gradbenike\" src=\"\/wp-content\/uploads\/2019\/08\/2a9d9e6053d1aebb71aa213757bd2393.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>Srednjaki (medium)<\/h4>\n<p>\nTo so vse poizvedbe, ki so takoj za TOP, razen zadnjih 5-10%. Obi\u010dajno se v optimizaciji teh poizvedb skriva mo\u017enost, da mo\u010dno pove\u010date zmogljivost stre\u017enika. Te poizvedbe lahko 'te\u017eo' do 80%. Vendar, \u010de njihov dele\u017e prese\u017ee 50%, je \u010das, da se nanje povrnejo bolj pozorno.<\/p>\n<h4>Rep (tail)<\/h4>\n<p>\nKot je bilo omenjeno, ti zahtevki prihajajo na koncu in zanje gre 5-10% \u010dasa. Nanje lahko pozabite, razen \u010de ne uporabljate avtomatskih sredstev za analizo zahtevkov, takrat lahko tudi njihova optimizacija ostane nizkostro\u0161kovna.<\/p>\n<p>Kako ovrednotiti vsako skupino?<\/p>\n<p>Uporabljam SQL poizvedbo, ki pomaga dose\u010di to oceno za PostgreSQL (prepri\u010dan sem, da lahko za mnoge druge DBMS napi\u0161emo podobno poizvedbo)<\/p>\n<p><b class=\"spoiler_title\">SQL poizvedba za oceno velikosti skupin TOP-MEDIUM-TAIL<\/b><\/p>\n<pre><code class=\"sql\">SELECT sum(time_top) AS sum_top, sum(time_medium) AS sum_medium, sum(time_tail) FROM ( SELECT CASE WHEN rn  20 AND rn  800 THEN tt_percent ELSE 0 END AS time_tail FROM ( SELECT total_time \/ (SELECT sum(total_time) FROM pg_stat_statements) * 100 AS tt_percent, query, ROW_NUMBER () OVER (ORDER BY total_time DESC) AS rn FROM pg_stat_statements ORDER BY total_time DESC ) AS t ) AS ts\n<\/code><\/pre>\n<p>Rezultat poizvedbe so trije stolpci, od katerih vsak vsebuje dele\u017e \u010dasa, ki se porabi za obdelavo poizvedb iz te skupine. Znotraj poizvedbe sta dve \u0161tevilki (v mojem primeru 20 in 800), ki lo\u010dujeta poizvedbe ene skupine od druge.<\/p>\n<p>Tako se pribli\u017eno razmerja dele\u017eev poizvedb na za\u010detku optimizacijskih del in zdaj.<\/p>\n<p><img decoding=\"async\" alt=\"Optimizacija poizvedb v bazi podatkov na primeru B2B storitve za gradbenike\" src=\"\/wp-content\/uploads\/2019\/08\/9c70ad9aba8b835c94729c9dda656eab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIz grafa je razvidno, da se je dele\u017e TOP poizvedb mo\u010dno zmanj\u0161al, medtem ko so se \u00bbsrednji\u00ab pove\u010dali.<br \/>\nSprva so v TOP poizvedbe vstopali o\u010ditni napaki. S\u010dasoma so otro\u0161ke bolezni izginile, dele\u017e TOP poizvedb pa se je zmanj\u0161al, kar je zahtevalo vedno ve\u010d truda za pospe\u0161evanje te\u017ekih poizvedb. <\/p>\n<p><b class=\"spoiler_title\">Da pridobimo besedilo poizvedb, uporabimo tak\u0161no poizvedbo<\/b><\/p>\n<pre><code class=\"sql\">SELECT * FROM ( 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 FROM pg_stat_statements ORDER BY total_time DESC ) AS T WHERE rn  20 AND rn  800  -- TAIL\n<\/code><\/pre>\n<p>Tukaj je seznam najpogosteje uporabljenih metod, ki so nam pomagale pospe\u0161iti TOP poizvedbe:<\/p>\n<ul>\n<li>Redizajn sistema, na primer preklic logike obvestil na message broker namesto periodi\u010dnih poizvedb v DB.<\/li>\n<li>Dodajanje ali spreminjanje indeksov<\/li>\n<li>Prepisovanje ORM poizvedb na \u010disti SQL<\/li>\n<li>Prepisovanje logike na\u010drtovane nalaganja podatkov<\/li>\n<li>Predpomnjenje prek denormalizacije podatkov. Na primer, imamo povezavo tabel Dostava -&gt; Ra\u010dun -&gt; Poizvedba -&gt; Vloga. To pomeni, da je vsaka dostava povezana z vlogo prek drugih tabel. Da ne bi povezovali vseh tabel v vsaki poizvedbi, smo podvojili povezavo na vlogo v tabeli Dostava.<\/li>\n<li>Ke\u0161iranje stati\u010dnih tabel s referentnim podatk\u016f ter redko spreminjajo\u010dih se tabel v pomnilniku programa.<\/li>\n<\/ul>\n<p>\nNekatera sprememba je zahtevala obse\u017enej\u0161o prenovo, a so prinesla 5-10% razbremenitve sistema in bila upravi\u010dena. S\u010dasoma se je izhod zmanj\u0161al, prenova pa je postajala vse bolj zahtevna.<\/p>\n<p>Takrat smo se osredoto\u010dili na drugo skupino poizvedb - skupino srednjerazrednih. V njej je bilo znatno ve\u010d poizvedb in zdelovalo se je, da bo analiza cele skupine vzela precej \u010dasa. Vendar so se izkazale \u0161tevilne poizvedbe za zelo enostavne za optimizacijo, mnoge te\u017eave pa so se ponavljale v razli\u010dnih razli\u010dicah. Tukaj so primeri nekaterih tipi\u010dnih optimizacij, ki smo jih uporabljali za desetine podobnih poizvedb in vsaka skupina optimiziranih poizvedb je razbremenila DB za 3-5%.<\/p>\n<ul>\n<li> Namesto preverjanja obstoja zapisov s pomo\u010djo COUNT in popolnega skeniranja tabele smo za\u010deli uporabljati EXISTS.\n <\/li>\n<li>Znebili smo se DISTINCT (ni splo\u0161nega recepta, a ga je v\u010dasih mogo\u010de enostavno odstraniti in tako pospe\u0161iti poizvedbo od 10 do 100-krat).\n<p>Na primer, namesto poizvedbe za izbiro vseh voznikov iz velike tabele dostav (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>\nsmo naredili poizvedbo po razmeroma majhni tabeli 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>\nZdelalo se je, da smo uporabili koreliran podpoizvedek, a ta prina\u0161a pospe\u0161ek ve\u010d kot 10-krat.\n <\/li>\n<li>V mnogih primerih smo se sploh odpovedali COUNT in <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.citusdata.com\/blog\/2016\/10\/12\/count-performance\/#dup_counts_estimated_filtered\">zamenjali z izra\u010dunom pribli\u017ene vrednosti.<\/a><\/noindex>\n <\/li>\n<li>namesto\n<pre><code class=\"sql\">UPPER(s) LIKE 'JOHN%' \n<\/code><\/pre>\n<p>\nkoristimo <\/p>\n<pre><code class=\"sql\">s ILIKE 'John%'\n<\/code><\/pre>\n<p>\n <\/li>\n<\/ul>\n<p>\nVsako posebno poizvedbo smo lahko pospe\u0161ili od 3 do 1000-krat. Kljub impresivnim rezultatom se nam je sprva zdelo, da ni smisla za optimizacijo poizvedbe, ki se izvaja 10 ms, spada v 300 najbolj obremenilnih poizvedb in v splo\u0161nem \u010dasu obremenitve na DB zaseda stotinke odstotka. A s tem, da smo uporabili isti recept za skupino enako vrsto poizvedb, smo pridobili nekaj odstotkov. Da ne bi porabili \u010dasa za ro\u010dno pregledovanje vseh sto poizvedb, smo napisali nekaj preprostih skript, ki so s pomo\u010djo regularnih izrazov na\u0161li podobne poizvedbe. V kon\u010dni fazi je samodejno iskanje skupin poizvedb omogo\u010dilo \u0161e dodatno izbolj\u0161anje na\u0161e u\u010dinkovitosti ob skromnem naporu.<\/p>\n<p>Na koncu smo \u017ee tri leta na istem stre\u017eniku. Povpre\u010dna dnevna obremenitev je okoli 30%, v vrhunskih trenutkih dose\u017ee do 70%. \u0160tevilo poizvedb in uporabnikov se je pove\u010dalo pribli\u017eno desetkrat. In vse to je zahvaljujo\u010d konstantnemu spremljanju skupin poizvedb TOP-MEDIUM. Takoj, ko se nova poizvedba pojavi v skupini TOP, jo analiziramo in posku\u0161amo pospe\u0161iti. Skupino MEDIUM enkrat na teden pregledamo s pomo\u010djo analiti\u010dnih skriptov. \u010ce naletimo na nove poizvedbe, za katere \u017ee vemo, kako optimizirati, jih hitro spremenimo. Ob\u010dasno odkrijemo nove na\u010dine optimizacije, ki jih lahko takoj uporabimo na ve\u010d poizvedbah. <\/p>\n<p>Po na\u0161ih napovedih trenutni stre\u017enik \u0161e prenese pove\u010danje \u0161tevila uporabnikov od 3 do 5 krat. Imamo pa \u0161e en as v rokavu - \u0161e nismo prenesli SELECT poizvedb na ogledalo, kot je priporo\u010deno. A tega ne delamo namerno, saj \u017eelimo najprej v celoti izkoristiti mo\u017enosti 'pametne' optimizacije, preden vklju\u010dimo 'te\u017eko artilerijo'.<br \/>\nKriti\u010den pogled na opravljeno delo nam lahko svetuje, da uporabimo vertikalno skaliranje. Kupi mo\u010dnej\u0161i stre\u017enik, namesto da bi zapravljali \u010das strokovnjakov. Stre\u017enik morda ni tako drag, \u0161e posebej ker na\u0161e meje vertikalnega skaliranja \u0161e niso iz\u010drpane. Kljub temu se je le \u0161tevilo poizvedb pove\u010dalo 10 krat. V zadnjih letih se je pove\u010dala funkcionalnost sistema in zdaj je raznolikost poizvedb ve\u010dja. Tista funkcionalnost, ki je bila na voljo, se s pomo\u010djo predpomnjenja izvaja z manj poizvedbami, in tudi u\u010dinkovitej\u0161imi poizvedbami. To pomeni, da lahko navadno pomno\u017eimo \u0161e s 5, da dobimo pravi koeficient pospe\u0161itve. Tako lahko po najbolj skromnih izra\u010dunih re\u010demo, da je pospe\u0161itev zna\u0161ala 50 in ve\u010dkrat. Vertikalno povi\u0161anje stre\u017enika 50 krat bi bilo dra\u017eje. \u0160e posebej ob upo\u0161tevanju, da optimizacija, ki je bila izvedena enkrat, deluje ves \u010das, medtem ko ra\u010dun za najet stre\u017enik prihaja vsak mesec.<br \/>\n<br \/>Izvor: <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\/sl\/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=\"sl_SI\" \/>\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\/sl\/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\udd47Optimizacija poizvedb baze podatkov na primeru B2B storitve za gradbenike | ProHoster","description":"Kako rasti 10 krat glede na \u0161tevilo poizvedb na BDP, ne da bi se preselili na zmogljivej\u0161i stre\u017enik, in obdr\u017eali delovanje sistema?","canonical_url":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/optimizatsiya-zaprosov-bazy-dannyh-na-primere-b2b-servisa-dlya-stroitelej","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sl_SI","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\/sl\/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\/sl\/wp-json\/wp\/v2\/posts\/36704","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/comments?post=36704"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/36704\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media\/27493"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media?parent=36704"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/categories?post=36704"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/tags?post=36704"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}