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 (*)?
risposta
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(*)
.
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;)
http://www.dbasupport.com/forums/archive/index.php/t-28741.html
Per Oracle, almeno.
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.
sì. Oracle considera il conteggio (*) esattamente come count (1), count (null), count ('qualsiasi valore atomico che ti piace'). –
È 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.
+1 Dovremmo usare solo COUNT() per conoscere il numero effettivo di record coinvolti. – APC
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.
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).
- 1. "SELECT COUNT (column)" più veloce/più lento di "SELECT COUNT (*)"?
- 2. SQL perché SELECT COUNT (*), MIN (col), MAX (col) più veloce di SELECT MIN (col), MAX (col)
- 3. Perché Select Count (*) è più lento di Select * nell'hive
- 4. Perché Select * Più veloce di Select Top 1 in un DB Microsoft Access
- 5. select count (*) from select
- 6. SELECT COUNT (DISTINCT ...) errore su più colonne?
- 7. Perché `-1 * x` più veloce di` -x` e perché?
- 8. Count (*) vs Count (1)
- 9. selezionare max() da count()
- 10. SELECT COUNT nell'intervallo di date
- 11. Perché chiamare vector.reserve (richiesto + 1) più veloce di vector.reserve (richiesto)?
- 12. Perché i = i + 1 è più veloce di i ++?
- 13. Perché un'unione è più veloce di un gruppo di
- 14. Perché String.IsNullOrEmpty è più veloce di String.Length?
- 15. SELECT COUNT (*) SQL SERVER
- 16. SQL e PHP - Qual è il più veloce mysql_num_rows() o 'select count()'?
- 17. Framework Entity - COUNT anziché SELECT
- 18. Come selezionare count() e LIMIT?
- 19. MongoDB ODM SELECT COUNT (*) equivalente
- 20. SQL COUNT * GROUP BY più grande di,
- 21. unordered_map: quale è più veloce find() o count()?
- 22. Rails SQL COUNT N + 1 inefficienza
- 23. SELECT COUNT (DISTINCT [name]) da diverse tabelle
- 24. SQL Server selezionare dove datetimeoffset più vecchio di 1 ora
- 25. SELECT COUNT attraverso uno-a-molti
- 26. SQL SELECT è più veloce se richiamato nell'ordine corretto?
- 27. Perché Array.reverse_each è più veloce di Array.reverse.each
- 28. Perché "www" .count ("ww") restituisce 1 e non 2?
- 29. Cassandra CQL SELECT COUNT con LIMIT
- 30. select -first 1 su un file di grandi dimensioni
senza sapere quale motore RDBMS stai utilizzando non c'è modo di rispondere correttamente. Diversi motori si comportano in modo diverso – Glen
Vuoi dire "perché selezionare il conteggio (1) più velocemente di Seleziona conteggio (*)"? –
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. –