Domanda

SELECT NR_DZIALU, COUNT (NR_DZIALU) AS LICZ_PRAC_DZIALU
    FROM  PRACOWNICY
    GROUP BY NR_DZIALU
    HAVING NR_DZIALU = 30

o

SELECT NR_DZIALU, COUNT (NR_DZIALU) AS LICZ_PRAC_DZIALU
    FROM PRACOWNICY
    WHERE NR_DZIALU = 30
    GROUP BY NR_DZIALU
È stato utile?

Soluzione

La teoria (per teoria intendo Standard SQL ) dice che WHERE limita il set di risultati prima di restituire le righe e HAVING limita il set di risultati dopo aver portato tutte le righe. Quindi DOVE è più veloce. Su DBMS conformi allo standard SQL a questo proposito, utilizzare HAVING solo dove non è possibile inserire la condizione su WHERE (come colonne calcolate in alcuni RDBMS).

Puoi solo vedere il piano di esecuzione per entrambi e verificare tu stesso, nulla lo batterà (misurazione per la tua query specifica nel tuo ambiente specifico con i tuoi dati.)

Altri suggerimenti

Potrebbe dipendere dal motore. MySQL, ad esempio, applica HAVING quasi per ultimo nella catena, il che significa che non c'è quasi spazio per l'ottimizzazione. Dal manuale :

  

La clausola HAVING viene applicata quasi per ultima, appena prima che gli articoli vengano inviati al client, senza ottimizzazione. (LIMIT è applicato dopo HAVING.)

Credo che questo comportamento sia lo stesso nella maggior parte dei motori di database SQL, ma non posso garantirlo.

Le due query sono equivalenti e il tuo ottimizzatore di query DBMS dovrebbe riconoscerlo e produrre produrre lo stesso piano di query. Potrebbe non esserlo, ma la situazione è abbastanza semplice da riconoscere, quindi mi aspetto che qualsiasi sistema moderno, anche Sybase, lo gestisca.

Le clausole HAVING devono essere utilizzate per applicare condizioni alle funzioni di gruppo, altrimenti possono essere trasformate nella condizione WHERE. Per esempio. se desideri limitare la tua query ai gruppi che hanno COUNT (DZIALU) > 10, diciamo, dovresti mettere la condizione in HAVING perché agisce sui gruppi, non sulle singole righe.

Mi aspetto che la clausola WHERE sia più veloce, ma è possibile che si ottimizzino esattamente allo stesso.

Dire che avrebbero ottimizzato non significa davvero prendere il controllo e dire al computer cosa fare. Concordo sul fatto che l'uso di avere non è un'alternativa a una clausola where. Avere ha un uso speciale di essere applicato a un gruppo in cui è stato usato qualcosa come sum () e vuoi limitare il set di risultati per mostrare solo i gruppi che hanno un sum () > di 100 di per sé. Avere lavori su gruppi, dove funziona su file. Sono mele e arance. Quindi, in realtà, non dovrebbero essere confrontati in quanto sono due animali molto diversi.

Entrambe le istruzioni avranno le stesse prestazioni di SQL Server è abbastanza intelligente da analizzare entrambe le stesse istruzioni in un piano simile.

Quindi, non importa se usi WHERE o HAVING nella tua query.

Ma, idealmente, dovresti usare sinteticamente la clausola WHERE.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top