Rychlost dotazů – MS SQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Rychlost dotazů – MS SQL – Fórum – Programujte.comRychlost dotazů – MS SQL – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
DragonBehemont0
Super člen
21. 1. 2012   #1
-
0
-

Zdravím,

mám otázku ohledně rychlosti a náročnosti ohledně zpracování dotazů na MS SQL 2008 R2.

Mám 4 tabulky, které jsou spolu navzájem různě provázány dle závyslostí pomocí FOREIGN KEY a různých indexů. Postup zpracování je jednoduchý, provedu query na první tabulku a z ní si vytáhnu různá data, která potřebuji pro poskládání query na druhou tabulku, těchto dat je cca kolem 5ti až 10ti řádků po 6ti sloupcích. Následně provedu druhé query, které mi vrátí záznamy z druhé tabulky, těch může být 1 až 5 tisích řádků po dvou sploupcích. A pro každý tento záznam provedu dotaz na třetí tabulku.

Moje otázka zní, zda je rychlejší tyto dotazy zpracovávat v aplikaci, či na serveru spustit proceduru, která mi tyto požadavky zpracuje sama a vrátí pouze výsledná data, která potřebuji.

Nahlásit jako SPAM
IP: 84.242.96.–
Nemusíte vědět vše, stačí jen, když víte, kde to najít, a jak to použít. Naučíte se to právě tím používáním ;-)
Reklama
Reklama
Řešení
zlz
~ Anonymní uživatel
634 příspěvků
21. 1. 2012   #2
-
0
-
Vyřešeno Nejlepší odpověď

Tak tisíce dotazů asi bude rychlejší udělat hromadně na serveru, než je posílat postupně.

Otázka je, jestli je opravdu potřeba tolik dotazů, nebo to půjde třeba jedním dotazem s JOINem.

Nahlásit jako SPAM
IP: 213.211.51.–
DragonBehemont0
Super člen
22. 1. 2012   #3
-
0
-

#2 zlz
Nad JOINem jsem taky přemýšlel, ale nenašel jsem žádný způsob, jak jej vytvořit. Kdyžtak mohu více popsat samotné provádění dotazů, proč je jich tolik, atd. Třeba se tam najde možnost.

Nahlásit jako SPAM
IP: 84.242.96.–
Nemusíte vědět vše, stačí jen, když víte, kde to najít, a jak to použít. Naučíte se to právě tím používáním ;-)
zlz
~ Anonymní uživatel
634 příspěvků
22. 1. 2012   #4
-
0
-

OK, tak to popiš.

Nahlásit jako SPAM
IP: 213.211.51.–
DragonBehemont0
Super člen
23. 1. 2012   #5
-
0
-

Bohužel, ale nemohu zde uvést přesnou strukturu databáze, ale pokusím se to nějak rozvést.

Mám tabulku "A", ze které si načtu veškeré záznamy - např. název produktu - [varchar(20)] u kterých se datum vyskytuje v určitém intervalu a vyžádám si, aby mi vrátil pouze unikátní výskyty (DISTINCT).

Jelikož se v tabulce může záznam s vyhledávaným názvem vyskytovat několikrát, ale líší se jedním sloupcem - např. pořadí výskytu (int) -, který se pro daný produkt navyšuje v geometrické posloupnosti, tak ještě následně provedu dotaz nad stejnou tabulkou pro každý produkt a zjistím si jaká je největší hodnota pro daný produkt ve sloupci "pořadí výskytu" a jaký je status produktu [OK / NOK].

A pokud je status NOK, tak ještě v tabulce "B" vyčtu přesnou příčinu, proč je produkt NOK.

Dříve jsem posílal SQL dotazy z aplikace a zpracování dat za jeden měsíc pro jednu "položku" trvalo okolo 30 sekund ... a "položek" je momentálně 6. Následně veškerá data zapisuji pomocí knihovny do Excelu a vytvářím grafy, atd.

Nahlásit jako SPAM
IP: 80.254.147.–
Nemusíte vědět vše, stačí jen, když víte, kde to najít, a jak to použít. Naučíte se to právě tím používáním ;-)
Zed_10
Newbie
22. 2. 2012   #6
-
0
-

Taky bych raději volil formu sp s JOINama.

Pak můžeš využít parametrické tabulky nebo taky mám oblíbené CTE tabulky (with as), a nebo dočasné tabulky, které můžeš zaindexovat, atd.

Pokud se dotaz provádí v databázi s více uživateli, tak je dobrý nezapomenout na WITH(NOLOCK).

Nahlásit jako SPAM
IP: 81.30.240.–
Sipi
~ Anonymní uživatel
19 příspěvků
16. 3. 2012   #7
-
0
-

Celu tuto operaciu mozes urobit jedinym selectom s groupovanim ,Max funkciou a joinom na tu druhu tabulku

nieco takehoto.

Select a.nazov,a.vyskyt,c.status_dovod

From (

   Select nazov,max(vyskyt) as vyskyt

   from TabA

  Group by nazov

) a

Join TabA b on a.nazov = b.nazov and a.vyskyt = b.vyskyt

left Join Status c on c.status = b.status

Nahlásit jako SPAM
IP: 144.36.194.–
DragonBehemont0
Super člen
27. 5. 2012   #8
-
0
-

Děkuji všem za odpovědi, nakonec jsem to vyřešil trochu jinak, upravil jsem celou databázi a využil joinů.

Nahlásit jako SPAM
IP: 95.82.185.–
Nemusíte vědět vše, stačí jen, když víte, kde to najít, a jak to použít. Naučíte se to právě tím používáním ;-)
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 4 hosté

Podobná vlákna

Rychlost — založil Zelenáč

Rychlost — založil Luckin

C# Vliv rychlost — založil Crooker

Rychlost Windows XP — založil Siemens

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý