Autor Zpráva
epo
Profil *
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
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 *
úž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
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)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0