Autor | Zpráva | ||
---|---|---|---|
4ever Profil |
#1 · Zasláno: 22. 9. 2011, 13:12:41
Měl jsem původně dva dotazy, ve kterém jsem vybral a seřadil data ze dvou tabulek, které mají společné id. Dělal jsem to bez JOIN tak, že podmínka pro WHERE byla a.`id`==b.`aid`. Teď používám jinou syntaxi:
Výběr předchozího (je rychlý, okamžitá reakce) SELECT * FROM basic AS a JOIN detaily AS b WHERE a.`id` < 13 ORDER BY a.`id` DESC LIMIT 0,1 Výběr následujícího: SELECT * FROM basic AS a JOIN detaily AS b WHERE a.`id` > 13 ORDER BY a.`id` ASC LIMIT 0,1 A právě u toho Následujícího se mi to před chvílí zdálo nějak pomalé. Neměřil jsem to, protože nevím jak se to dělá, ale připadalo mi to tak 0.4-0.5 vteřiny odezva. Teď možná o něco rychlejší tak 0.3. Tak se chci zeptat jestli je to možné, protože měl jsem dojem že se to při té staré syntaxi načítalo prakticky okamžitě. Mám celkem 128 řádků v obou tabulkách. |
||
Joker Profil |
#2 · Zasláno: 22. 9. 2011, 13:37:08
4ever:
„Neměřil jsem to“ To je právě chyba. Pokud ten dotaz „vypadá pomalý“, měl by další krok být měření, aby se potvrdilo, jestli to je opravdu tím dotazem. Jinak ale ten dotaz skoro určitě bude špatně. Je to výběr z basic AS a JOIN detaily AS b, tedy kartézského součinu obou tabulek (tj. pokud každá tabulka má 128 řádků, vytvoří se tabulka s 16 384 řádky obsahující všechny kombinace) Vybere se jedno nejvyšší a.id menší než 13. …ale v té spojené tabulce jsou všechny kombinace, tj. například záznam tabulky basic s ID=12 tam bude (počet řádků tabulky detail)-krát (vždycky zkombinovaný s jiným řádkem tabulky detail). Čili tenhle dotaz může vrátit řádek tabulky basic s nejvyšším ID nižším než 13 v kombinaci s celkem náhodným řádkem tabulky detail. Nechybí tam basic a JOIN detaily b ON nějaká-podmínka ?
|
||
4ever Profil |
#3 · Zasláno: 22. 9. 2011, 13:50:38 · Upravil/a: 4ever
Joker:
Dík za poučení. Jsem si nebyl jistý jaký je rozdíl v tom explicitním WHERE a implicitním ON i když se má používat JOIN .. ON. Mě to nějak nevyhovuje kvůli metodě kterou volám, protože ta metoda tam automaticky dosazuje WHERE .... Tak budu muset něco vymyslet jak opravit tu metodu; zatím nevím co aby to bylo hladké. |
||
Joker Profil |
#4 · Zasláno: 22. 9. 2011, 15:37:57 · Upravil/a: Joker
4ever:
„jaký je rozdíl v tom explicitním WHERE a implicitním ON“ Ono by to mohlo fungovat i s WHERE edit: Škrtnutá část asi není pravdivá, viz níže. |
||
TomášK Profil |
#5 · Zasláno: 22. 9. 2011, 16:52:42
Joker:
Víš to určitě? Mám za to, že ten zápis je ekvivalentní a poměrně brzo se z toho při zpracování dotazu stane totožná konstrukce, která se pak předhodí optimalizátoru. Ale jistý si tím nejsem, musel bych to dohledávat - pokud víš, že se to zpracuje různě, ušetříš mi hledání. |
||
4ever Profil |
#6 · Zasláno: 22. 9. 2011, 18:48:25 · Upravil/a: 4ever
Joker:
Měl jsi pravdu. Opravil jsem to a dosahují okamžité reakce. Skvělé, dík za tip. Ještě dotaz: Tato syntaxe bez WHERE je platná? SELECT x.* FROM ukazka_view x INNER JOIN ukazka_view y ON x.`id`=128 ORDER BY x.`html` ASC LIMIT 0,1 Jestli tomu už rozumím, tak tzn. že ON nahradilo to WHERE tak ho už nepotřebuju ne? |
||
Joker Profil |
#7 · Zasláno: 22. 9. 2011, 20:16:45
TomášK:
„Víš to určitě? Mám za to, že ten zápis je ekvivalentní a poměrně brzo se z toho při zpracování dotazu stane totožná konstrukce, která se pak předhodí optimalizátoru.“ Aha, tak jsem to zkoušel a zdá se, že to opravdu je stejné. Kdysi dávno jsem totiž dělal nějaké pokusy ze kterých jsem si zapamatoval, že JOIN ON je daleko rychlejší. Ale nejspíš ty dotazy nebyly úplně ekvivalentní. Co jsem zkoušel teď, SELECT * FROM tabulka a JOIN tabulka b WHERE a.id=b.id je stejně rychlý jako SELECT * FROM tabulka a JOIN tabulka b ON a.id=b.id .
Tak odvolávám předchozí příspěvek. |
||
4ever Profil |
#8 · Zasláno: 22. 9. 2011, 21:07:40
Joker:
No ale je to zvláštní, protože mě to opravdu s tím ON jede vydatně rychleji. |
||
Tori Profil |
#9 · Zasláno: 22. 9. 2011, 21:12:40 · Upravil/a: Tori
4ever:
SQL v [#6] by mělo vypadat myslím takhle: SELECT x.* FROM ukazka_view x INNER JOIN ukazka_view y ON x.`id` = y.`idX` -- doplňte správné názvy WHERE x.`id`=128 ORDER BY x.`html` ASC LIMIT 0,1 |
||
joe Profil |
#10 · Zasláno: 22. 9. 2011, 21:37:32 · Upravil/a: joe
Chybí tam ta podmínka, jak píše Tori, jinak myslím a pokud se nepletu, tak tento zápis by měl být stejný:
SELECT x.* FROM ukazka_view x INNER JOIN ukazka_view y WHERE x.id=128 AND x.id = y.idX ORDER BY x.html ASC LIMIT 0, 1 |
||
4ever Profil |
#11 · Zasláno: 23. 9. 2011, 20:14:42 · Upravil/a: 4ever
A když už se bavíme o té syntaxi, za chvíli bych potřeboval vytvořit třetí tabulku rozšiřující informace k těm předchozím. Jak ale sestavit dva selecty s pomocí join, když tam jsou tři tabulky?
Mě napadá jen toto a to teda nevím jestli je správně: CREATE VIEW ukazka2_view AS SELECT a. * , b. *, c. * FROM basic a JOIN detaily b ON a.`id` = b.`basic_id` FROM next_info b JOIN next_info c ON a.`id` = b.`basic_id` a SELECT x.* FROM ukazka3_view x INNER JOIN ukazka3_view y ON x.`id` = y.`idX` INNER JOIN ukazka3_view z ON x.`id` = z.`idY` WHERE x.`id`=128 ORDER BY x.`html` ASC LIMIT 0,1 V podstatě budu potřebovat vytvořit náhledy pro některé sloupce vybrané ze tří tabulek a pak ty běžné selecty, které vytahují data z těch tabulek přímo. Vlastně jedno a to samé, jen jedno čistě pomocí selectu a pomocí Pohledů. Třetí příklad pro select bez pohledů jsem už radši neuvedl, beztak to mám špatně. |
||
o_O Profil |
#12 · Zasláno: 24. 9. 2011, 02:33:51 · Upravil/a: o_O
4ever:
> FROM basic a > JOIN detaily b ON a.`id` = b.`basic_id` FROM next_info b Proč se ve Vašem SQL dotazu vyskytuje 2× FROM? A ano, je to špatně. Už jen kvůli stejnému "pojmenování" tabulky (next_info b, detaily b) a také kvůli chybějící vazby u next_info. |
||
Časová prodleva: 14 let
|
0