Autor | Zpráva | ||
---|---|---|---|
epo Profil * |
#1 · Zasláno: 16. 9. 2012, 15:32:04
Dobrý den,
mám následující SQL dotaz: SELECT * , uziv.id AS uid, ( SELECT COUNT( obr.id_uziv ) FROM obr WHERE obr.id_uziv = uid ) AS poc_a, ( SELECT COUNT( data.id_uziv ) FROM data WHERE data.id_uziv = uid ) AS poc_b FROM uziv v tabulce data je kolem milionu položek a zpracování trvá kolem 30s. Potřebuji v jednom sql dotazu získat součet kolikrat tam dané id_uziv je .. v tabulkach obr a data. Chci se zeptat za je možné nějakým způsobem zrychlit zpracování dotazu? Zkoušel jsem GROUP BY a INNER JOIN, ale GROUP BY mohu použít pouze pro jednu tabulku. Můžete mi prosím poradit jak optimalizovat takovýto dotaz? Předem děkuji |
||
juriad Profil |
#2 · Zasláno: 16. 9. 2012, 15:41:28
SELECT uziv.*, poc_a.pocet, poc_b.pocet FROM uziv LEFT JOIN (SELECT obr.id_uziv, COUNT(*) AS pocet FROM obr GROUP BY obr.id_uziv) AS poc_a ON uziv.uid = poc_a.id_uziv LEFT JOIN (SELECT data.id_uziv, COUNT(*) AS pocet FROM data GROUP BY data.id_uziv) AS poc_b ON uziv.uid = poc_b.id_uziv takto máš dva vnitřní nezávislé selecty na rozdíl od tvých, které jsou závislé na počtu uživatelů |
||
epo Profil * |
#3 · Zasláno: 16. 9. 2012, 15:54:46
úžasne pod 1s. Ale moc mi není jasné proč :/
Mohl by jste mi prosím vysvětlit v čem je ten zásadní rozdíl? Proč jsou nezávislé? Předem děkuji. |
||
juriad Profil |
#4 · Zasláno: 16. 9. 2012, 17:53:54
v tvém případě se spouští ty dva vnitřní dotazy pro každého uživatele (ve vnitřním selectu používáš uid, které patří tabulce uziv), tady pro každý řádek uziv se zavolají dva další dotazy
v mém případě se vnitřní dotazy neodkazují na žádný atribut vnějšího dotazu (je možné je spustit samotné) a jsou tedy nezávislé; databáze tedy napřed spustí ty dva vnitřní dotazy (jen jednou) a výsledek už pak jen přijoinuje k uziv mimochodem, v případě, že pro uživatele nebude existovat obr nebo data, tak se výsledek mého bude lišit od tvého (počet bude NULL místo 0) |
||
Časová prodleva: 12 let
|
0