2012-10-17 17 views
8

potrei scrivere una query utilizzando una funzione di aggregazione in due modi:Avendo clausola vs subquery

select team, count(min) as min_count 
from table 
group by team 
having count(min) > 500 

o

select * 
from (
    select team, count(min) as min_count 
    from table 
    group by team 
) as A 
where A.min_count > 500 

Esistono vantaggi prestazionali per entrambi gli approcci o sono funzionalmente la stessa cosa ?

+1

Principalmente: sono semanticamente identici? – usr

+0

li hai testati o riesaminato il piano di spiegazioni? – Taryn

+0

Puoi mostrare il piano di esecuzione della query? –

risposta

5

Le due versioni sono funzionalmente identiche. Bene, il secondo è sintatticamente corretto, ma presumo si intende: (. È necessario l'alias sul calcolo e diversi i principali database richiedono un alias in una subquery in una clausola FROM)

select * 
from (
    select team, count(min) as count 
    from table 
    group by team 
) t 
where count > 500 

Essere funzionalmente equivalente non corrisponde a significa che sono necessariamente ottimizzati allo stesso modo. Esistono spesso diversi modi per scrivere una query che sono funzionalmente equivalenti. Tuttavia, lo specifico motore di database/ottimizzatore può scegliere (e spesso sceglie) diversi percorsi di ottimizzazione.

In questo caso, la query è così semplice che è difficile pensare a più percorsi di ottimizzazione. Per entrambe le versioni, il motore deve fondamentalmente aggregare la query e quindi testare la seconda colonna per il filtro. Personalmente non vedo molte varianti su questo tema. Qualsiasi motore SQL decente dovrebbe utilizzare gli indici, se necessario, in entrambi i casi o nessuno dei due.

Quindi, la risposta a questa domanda specifica è che in qualsiasi database ragionevole, ciò dovrebbe comportare lo stesso piano di esecuzione (vale a dire, nell'uso di indici, l'utente del parallelismo e la scelta dell'algoritmo di aggregazione). Tuttavia, essere funzionalmente equivalenti non significa che un determinato motore di database produrrà lo stesso piano di esecuzione. Quindi, la risposta generale è "no".