2010-08-02 12 views
5

Eventuali duplicati:
Which is faster/best? SELECT * or SELECT column1, colum2, column3, etc.SQL: Select * Usando

E 'cattiva pratica da usare Select *?

Stavo passando un vecchio codice e ho visto alcune istruzioni "SELECT *". Il mio collega precedente mi aveva detto che Select * era una cattiva pratica, ma non riuscivo a capirne il motivo (a meno che ovviamente non avessi bisogno di restituire alcuni campi). Ma per i 'dettagli recuperati' completi (Ottieni per query di tipo Id) Seleziona * sembra giusto.

+0

Se hai bisogno di tutti i dettagli, usa 'select *' - specialmente se hai bisogno di colonne di dettaglio future di cui non conosci i nomi. –

+2

No @ Lou Franco, questa è una pratica scarsa anche allora. Non sai cosa verrà aggiunto in futuro. Potresti avere colonne aggiunte che sono per scopi amministrativi che non vuoi che gli utenti vedano. È sempre una cattiva abitudine usare select *. E la definizione delle colonne di solito è migliore anche per le prestazioni poiché il database non deve cercarle e se si ha un join almeno una colonna è duplicata, significa che stai sprecando larghezza di banda restituendola. – HLGEM

risposta

1

Sì, è considerato una cattiva pratica.

È meglio specificare un elenco di colonne esplicito, soprattutto se la tabella contiene molte colonne e ne servono solo alcune.

0

Anche se è necessario selezionare tutte le colonne è ancora meglio specificare loro piuttosto che usare 'selezionare *'

1

Se si verificano modifiche allo schema (vengono aggiunte colonne extra), questi saranno catturati dalla vostra applicazione. Ciò potrebbe non essere auspicabile, ad esempio, se si associa dinamicamente una griglia a un DataTable. Inoltre, comporta un sovraccarico maggiore sulle comunicazioni di rete.

Anche se si selezionano tutte le colonne a partire da oggi, definire le colonne in base al nome: è leggibile ed esplicito. Qualsiasi colonna aggiuntiva non causerà alcun problema con il tuo codice.

5

È una cattiva pratica.

Se lo schema cambia lungo la strada, l'applicazione chiamante può ottenere più campi di quanti ne sappia.

Inoltre, si ottengono più informazioni di quelle necessarie, il che influisce sulle prestazioni.

Inoltre, implica anche che non si conoscono le colonne.

+0

L'ho quasi visto come un vantaggio. Devo aggiungere un campo al mio tavolo e ora devo entrare nel codice per cambiare la query sql per il nuovo campo, rispetto a Select * non è necessario apportare alcuna modifica. – mint

+1

@snow - In realtà, dovresti usare stored proc per chiamare quella roba invece di SQL codificato, nel qual caso cambi il proc memorizzato e tutte le tue chiamate vengono aggiornate. – JNK

+0

@snow, è un enorme svantaggio, puoi esporre le informazioni all'utente che non vuoi che siano visualizzate. Inoltre potrebbe rompere questo se qualcuno decide di riorganizzare le colonne nella tabella (sì, ci sono degli idioti che lo fanno) e ora stai inserendo i dati dal cognome nella colonna del nome e viceversa. Selct * è solo cattivo. – HLGEM

4

Utilizzando SELECT * è cattiva pratica per due ragioni:

  • Può tornare colonne aggiuntive che non ti servono, sprecando banda
  • Si può rompere il vostro codice, se qualcuno aggiunge una colonna
2

Sì, selezionare * è una cattiva pratica. Per uno, non è chiaro agli altri sviluppatori quali colonne stai usando veramente. Li stai effettivamente utilizzando tutti? Cosa succede quando aggiungi colonne stai usando anche quelle? Ciò rende molto più difficile il refactoring dei nomi delle colonne in caso di necessità. In secondo luogo, ci sono alcuni casi in cui alcuni sistemi di database ricorderanno quali colonne esistevano al momento della creazione di un oggetto. Ad esempio, se si crea una stored procedure con Select *, cuocerà le colonne esistenti nella tabella al momento della compilazione. Se la tabella cambia, non riflette quelle modifiche nella stored procedure. Non c'è davvero alcun motivo per usare Select * oltre la pigrizia.

+0

Non avevo mai sentito parlare di "cottura" delle colonne usando select * nelle stored procedure ... notate però. – mint

1

Quando si utilizza SELECT *, si sceglie di scambiare la produttività immediata (scrivendo una query più rapidamente) per la potenziale produttività di manutenzione (nel caso in cui la query sottostante cambi e quindi rompa codice/query dipendenti). La "cattiveria" della pratica è un'attività di gestione del rischio.