2009-09-10 12 views
9

In Oracle, quando si esegue una query sull'esistenza della riga, perché selezionare 1 veloce rispetto a Seleziona conteggio (*)?Perché selezionare 1 più veloce di Select count (*)?

+1

senza sapere quale motore RDBMS stai utilizzando non c'è modo di rispondere correttamente. Diversi motori si comportano in modo diverso – Glen

+1

Vuoi dire "perché selezionare il conteggio (1) più velocemente di Seleziona conteggio (*)"? –

+0

Intendo "Seleziona 1".Sto osservando una vecchia documentazione sugli standard di codifica offline in cui si afferma che "Select 1" è più veloce di "Select count (*)" e un modo preferito di interrogare l'esistenza delle righe. La documentazione non fornisce una spiegazione tecnica del motivo per cui questa è una tecnica di "miglioramento delle prestazioni". Quando ho cercato in rete, ho trovato cose come discussioni su AskTom e dibattiti ... ma non ho visto una risposta chiara e definitiva. –

risposta

14

Dato che Oracle non supporta IF EXISTS in PL/SQL, il suggerimento di CodeByMidnight usare esiste normalmente essere fatto con qualcosa di simile

SELECT 1 
    INTO l_local_variable 
    FROM dual 
WHERE EXISTS( 
    SELECT 1 
     FROM some_table 
    WHERE some_column = some_condition); 

Oracle sa che può interrompere l'elaborazione del WHERE EXISTS clausola di non appena una riga viene trovata, quindi non deve potenzialmente contare un numero elevato di righe che corrispondono ai criteri. Questo è meno preoccupante, ovviamente, se si sta verificando se esiste una riga con una chiave particolare rispetto a quando si verifica una condizione che coinvolge colonne non indicizzate o si verifica una condizione che potrebbe causare il ritorno di un numero elevato di righe.

(Nota: vorrei poterlo postare come commento sul post di CodeByMidnight, ma i commenti non possono includere il codice formattato).

AGGIORNAMENTO: Dato il chiarimento del poster originale fatto nel loro commento, la risposta breve e definitiva è che uno SELECT 1 o SELECT COUNT(1) non è più veloce di uno SELECT COUNT(*). Contrariamente alle linee guida di codifica che stai guardando, lo COUNT(*) è il modo preferito per contare tutte le righe. C'era un vecchio mito che un COUNT(1) era più veloce. Come minimo, ciò non è stato vero in nessuna versione di Oracle rilasciata nell'ultimo decennio ed è improbabile che sia mai stato vero. Era una convinzione largamente diffusa, comunque. Oggi, il codice che fa uno COUNT(1) piuttosto che uno COUNT(*) mi fa sospettare che l'autore sia incline a credere a vari miti di Oracle, motivo per cui suggerirei di usare COUNT(*).

0

Poiché una stella prende tutti i colletti nel conteggio, "1" è un tipo di dati nativo.

In MySQL "SELECT COUNT (name_of_the_primary_key)" dovrebbe essere veloce come SELECT 1. È l'indice che conta. Un conteggio() su un indice dovrebbe essere abbastanza veloce;)

2

Sarei sorpreso se select count (*) non è stato ottimizzato correttamente, non è necessario caricare tutte le colonne in quanto non ci sarà alcuna elaborazione correlata alla colonna.

+1

sì. Oracle considera il conteggio (*) esattamente come count (1), count (null), count ('qualsiasi valore atomico che ti piace'). –

15

È ancora meglio utilizzare EXISTS dove l'RDBMS lo supporta o un equivalente, in quanto ciò interromperà l'elaborazione delle righe non appena trova una corrispondenza.

+5

+1 Dovremmo usare solo COUNT() per conoscere il numero effettivo di record coinvolti. – APC

0

Non penso che questo sia vero per Oracle. http://justoracle.blogspot.com/2006/12/count-vs-count1.html

Tuttavia, in alcuni database il motivo è dovuto al fatto che '*' deve visitare i metadati delle tabelle. Questo tende ad aggiungere un sovraccarico non necessario. Dove 1 è solo un letterale.

0

Tutti parità di altre condizioni, "select 1 from my_table" restituirà il risultato prima più veloce di "select count(*) from my_table", ma se si recuperano tutti i risultati della query, il count(*) uno sarà più veloce perché si tratta di molto meno dati (1 intero, come opposto a 1 intero per ogni riga nella tabella).

Problemi correlati