Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Optimální způsob výběru dat - vazební tabulka

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Optimální způsob výběru dat - vazební tabulka

Autor: Pavel Stehule

22:13:47 22.08.2011

>
> Jaký způsob je optimální? Případně znáte/používáte
> ještě jiný způsob?

Toto jsou více-méně všechny případy - v ideálním případě by se měly zpracovávat stejně - v realném světě záleží na databázi, její verzi i na vlastních datech. Se subselectem můžete narazit u MySQL, korelovaný poddotaz vyžaduje index - varianta, která je většinou dobře optimalizovaná všude je JOIN - jakkoliv mi nejčitelnější v tomto případě přijde použití operátoru IN.

Pavel

Citovat příspěvek

 

Re: Optimální způsob výběru dat - vazební tabulka

Autor: David.Krch

19:19:25 22.08.2011

V relacnich databazich neni az tak zasadni jaky zapis zvolite - paklize jsou vyznamove shodne. Optimalizator by mel zvolit exekucni plan na zakladne nakladu ruznych alternativ zpracovani.
Zalezi samozrejme na inteligenci optimalizatoru konkretniho databazoveho serveru - jestli optimalizator pozna, ze jde o vyznamove shodne zapisy, nebo ne.
Treba v pripade Oracle by optimalizator mohl dojit k zaveru, ze je pro nej vyhodne si subselect z prvniho dotazu prevest na join.

Tj. idealni je opravdu zobrazit si exekucni plan jednotlivych dotazu, ev. je zkusit spustit a zmerit realne naklady na zpracovani a podle toho se rozhodnout. Jak na to, zalezi na konkretnim vami pouzivanem databazovem serveru - to jste nam ale zatajil.

K vami navrhovanym variantam:
ad 1) subselect - vynechal bych DISTINCT v subselectu - je funkcne prebytecny. Vysledek je stejny jestli udelate in (1,2,3) nebo in (1,2,2,3). A zbytecne by mohl hloupejsi optimalizator donutit delat deduplikaci dat.
Tj. ja bych pouzil [code]SELECT id, atribut1, atribut2
FROM produkty
WHERE id IN (SELECT produkt_id FROM produkty_kategorie WHERE kategorie_id IN (1, 3, 10))
[/code]
Tenhle zapis mi prijde nejlepsi, protoze nejlip vystihuje to, co chcete - tj. jiny programator nejjednoduseji pochopi, co delate.

Jestli pouzijete IN nebo EXIST je v pripade Oracle jedno (U NOT IN a NOT EXISTS to plati jen u sloupcu, ktere nemohou byt NULL).

ad 2)Tohle je uplne zbytecne - a)je to slozity zapis, ktery muze radu lidi zmast, b)uz v subselectu mate k dispozici vsechny radky, ktere chcete zpracovat, tak proc to znovu porovnavat s products? Nektere databaze mozna pochopi, ze je to zbytecne, a druhe cteni tabulky produkty eliminuji, ale moc bych tomu neveril
Kdyz uz byste chtel pouzit EXIST, tak takto:
[code]SELECT id, atribut1, atribut2
FROM produkty
WHERE EXIST (SELECT 1
FROM produkty_kategorie
WHERE kategorie_id IN (1, 3, 10)
and produkty_kategorie.produkt_id=produkty.id)
[/code]
No a to by zas melo byt z hlediska exekucniho planu (alespon na Oracle) ekvivalentni predchozimu zapisu.

ad 3)JOIN - proc ne, pokud vam to prijde prehlednejsi zapis. V JOINu je na rozdil od IN/EXIST ten DISTINCT dulezity - protoze kdyz bude produkt ve dvou z kategorii, ktere vybirate, pak bude ve vysledku bez DISTINCT dvakrat.

Citovat příspěvek

 

Re: Optimalni zpusob vyberu dat - vazebni tabulka

Autor: sniper

17:26:15 22.08.2011

podivej se na execution plan, kdy se pouzije nejvyhodnejsi a podle toho
se rozhodni. Ale osobne bych sel do joinu.

btw koukej na to pri realnym mnozstvi dat, jinak se indexy nemusej
pouzit (je pro nej jednodussi projit celou tabulku nez se hrabat v
indexech...)

Příspěvek zaslán emailem

Citovat příspěvek

 

Re: Optimální způsob výběru dat - vazební tabulka

Autor: xyz3

17:10:17 22.08.2011

Záleží na SQL serveru, ale tohle by mělo fungovat dobře všude:


SELECT produkty.id, produkty.atribut1, produkty.atribut2
FROM produkty
WHERE EXISTS
(
SELECT *
FROM produkty_kategorie
WHERE produkty_kategorie.produkt_id = produkty.id and produkty_kategorie.kategorie_id IN (1, 3, 10))
)

Citovat příspěvek

 

Optimální způsob výběru dat - vazební tabulka

Autor: Jakub Vrbas

16:45:11 22.08.2011

Zdravím,
řeším klasický úkol - mám tabulku s produkty, kategoriemi a mezi těmito dvěma tabulkami vazbu M:N - tedy produkt může spadat do více kategorií. Chci získat záznamy o produktech, které patří alespoň do jedné z vybraných kategorií.

Setkal jsem se s 3 způsoby, jak data získat.

Způsob 1:
---------
SELECT id, atribut1, atribut2
FROM produkty
WHERE id IN (SELECT DISTINCT produkt_id FROM produkty_kategorie WHERE kategorie_id IN (1, 3, 10))

Způsob 2:
---------
SELECT id, atribut1, atribut2
FROM produkty p
WHERE EXISTS (SELECT 1 FROM produkty_kategorie JOIN produkty ON (produkty_kategorie.produkt_id = produkty.id) WHERE p.id = produkty.id AND kategorie_id IN (1, 3, 10))

Způsob 3:
---------
SELECT DISTINCT id, atribut1, atribut2
FROM produkty
JOIN produkty_kategorie ON (produkty_kategorie.produkt_id = produkty.id)
WHERE kategorie_id IN (1, 3, 10)


Jaký způsob je optimální? Případně znáte/používáte ještě jiný způsob?

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: