Databáze > Firebird a Interbase

Pokus: porovnanie dvoch dopytov. Hlava mi to neberie

(1/4) > >>

Stanislav Hruška:

Moja logika zlyháva. Vysvetlí mi niekto, prečo je v druhom prípade polovičný čas? Veľmi ma to prekvapilo a mám silné nutkanie to všade opraviť/zmeniť. Keď sa tým už babrem, tak poriadne.
14 sek. Pôvodný dopyt. Agregačné funkcie sú v CTE
--- Kód: ---WITH D AS
  (SELECT D.FKOWNER_FLAT, SUM(D.DEPOSIT) AS DEPOSIT, SUM(D.PAY) AS PAID
  FROM DEPOSITS D
  WHERE D.FKFOCS = :FKFOCS AND D.DEPOSITPERIOD BETWEEN :FIRSTDATE AND :LASTDATE
  GROUP BY D.FKOWNER_FLAT)
SELECT D.FKOWNER_FLAT, F.FLATNUMBER, O.FULLNAME, D.DEPOSIT, D.PAID, (D.PAID - D.DEPOSIT) AS DIFFERENCE
FROM FLATS F
  INNER JOIN OWNER_FLAT OWF ON F.IDFLATS = OWF.FKFLAT
  INNER JOIN D ON OWF.IDOWNER_FLAT = D.FKOWNER_FLAT
  INNER JOIN OWNERS O ON OWF.FKOWNERS = O.IDOWNERS
--- Konec kódu ---
6 sek. Agregačné funkcie sú ZA CTE
--- Kód: ---WITH D AS
  (SELECT D.FKOWNER_FLAT, D.DEPOSIT, D.PAY, D.PAY - D.DEPOSIT AS DIFFERENCE
  FROM DEPOSITS D
  WHERE D.FKFOCS = :FKFOCS AND D.DEPOSITPERIOD BETWEEN :FIRSTDATE AND :LASTDATE)
SELECT D.FKOWNER_FLAT, F.FLATNUMBER, O.FULLNAME, SUM(D.DEPOSIT) AS DEPOSIT, SUM(D.PAY) AS PAID,
  SUM(D.DIFFERENCE) AS DIFFERENCE
FROM FLATS F
  INNER JOIN OWNER_FLAT OWF ON F.IDFLATS = OWF.FKFLAT
  INNER JOIN D ON OWF.IDOWNER_FLAT = D.FKOWNER_FLAT
  INNER JOIN OWNERS O ON OWF.FKOWNERS = O.IDOWNERS
GROUP BY D.FKOWNER_FLAT, F.FLATNUMBER, O.FULLNAME
--- Konec kódu ---
To je k tým dlhým dopytom. Bod B)

František:
velmi som sa neponaral, ale mas tam rozdielny pocet GROUP BY stlpcov, a v druhom pripade grupujes v troch tabulkach

Stanislav Hruška:
Podľa mňa GROUP BY určite nehrá úlohu.
Jediný rozdiel je v použití agregačných funkcií.
Keď som robil jednoduché pokusy:

* Priamo agregačné funkcie - prvý prípad
* Najprv výber a na to potom agregačné funkcie - druhý prípadtak som tam nenameral významné rozdiely. Tu taký skok.

Jan Fiala:
Někdy je rychlejší vybrat data a až pak provádět agragaci, zvlášť pokud je dat hodně. Výsledek záleží na optimalizaci, kterou provádí SQL server, na návrhu tabulky, na použitých indexech...

pepak:
První dotaz říká: Za tabulku DEPOSITS mi spočítej součty za každého vlastníka. Až to budeš mít, tak ke každému vlastníkovi připoj nějaké údaje a také tyto součty.

Druhý dotaz říká: Ke každému vlastníkovi připoj nějaké údaje a jeho součty.

Tzn. první dotaz je posloupnost dvou operací, samostatně optimalizovaných a následně propojených přes natural join, zatímco druhý dotaz je jedna operace, komplet celá optimalizovaná.

A jak píše Jan Fiala, někdy je rychlejší jedno a někdy druhé. Záleží na konkrétní struktuře tabulek, na způsobu výpočtu, na velikosti dat v jednotlivých tabulkách, atd.

Navigace

[0] Seznam témat

[#] Další strana

Přejít na plnou verzi