Dato il tuo specifica che si sta selezionando tutte le colonne, c'è poca differenza in questo momento . Renditi conto, tuttavia, che gli schemi del database cambiano. Se usi, SELECT *
otterrai nuove colonne aggiunte alla tabella, anche se con ogni probabilità, il tuo codice non è pronto per usare o presentare quei nuovi dati. Ciò significa che stai esponendo il tuo sistema a imprevisti e cambiamenti di funzionalità.
Potresti essere disposto a scartare questo come costo minore, ma ti rendi conto che le colonne che non ti servono ancora devono essere:
- Leggi dal database
- Inviato attraverso la rete
- Sbattuto nel tuo processo
- (per tecnologie di tipo ADO) Salvato in una tabella di dati in memoria
- Ignorato e scartato / immondizia raccolta
L'articolo n. 1 ha molti costi nascosti, tra cui l'eliminazione di un potenziale indice di copertura, il caricamento di pagine di dati (e il blocco della cache del server), con conseguenti blocchi di riga / pagina / tabella che potrebbero altrimenti essere evitati.
Bilanciare questo con i potenziali risparmi di specificare le colonne rispetto a *
e gli unici potenziali risparmi sono:
- Il programmatore non ha bisogno di rivisitare l'SQL per aggiungere colonne
- Il trasporto di rete di SQL è più piccolo / più veloce
- Tempo di analisi / validazione delle query di SQL Server
- Cache del piano di query di SQL Server
Per l'articolo 1, la realtà è che stai per aggiungere / modificare il codice per utilizzare qualsiasi nuova colonna che potresti aggiungere comunque, quindi è un lavaggio.
Per l'articolo 2, la differenza è raramente sufficiente per spingerti in una dimensione di pacchetto o numero di pacchetti di rete diversi. Se arrivate al punto in cui il tempo di trasmissione delle istruzioni SQL è il problema principale, probabilmente dovrete prima ridurre la frequenza delle istruzioni.
Per l'articolo 3, NON vi sono risparmi in quanto l'espansione *
deve avvenire comunque, il che significa comunque consultare lo schema delle tabelle. Realisticamente, elencare le colonne comporta lo stesso costo perché devono essere convalidate rispetto allo schema. In altre parole, questo è un lavaggio completo.
Per l'articolo 4, quando si specificano colonne specifiche, la cache del piano di query potrebbe ingrandirsi, ma solo se si ha a che fare con diversi set di colonne (che non è quello specificato). In questo caso, vuoi voci di cache diverse perché vuoi piani diversi secondo necessità.
Quindi, tutto si riduce, a causa del modo in cui è stata specificata la domanda, alla resilienza del problema a fronte di eventuali modifiche dello schema. Se stai masterizzando questo schema nella ROM (succede), allora un *
è perfettamente accettabile.
Tuttavia, la mia linea guida generale è che dovresti selezionare solo le colonne di cui hai bisogno, il che significa che a volte sembrerà che tu le stia chiedendo tutte, ma DBA ed evoluzione dello schema indicano che potrebbero apparire alcune nuove colonne che potrebbero influenzare notevolmente la query .
Il mio consiglio è di selezionare SEMPRE colonne specifiche . Ricorda che diventi sempre bravo in quello che fai, quindi prendi l'abitudine di farlo nel modo giusto.
Se ti stai chiedendo perché uno schema potrebbe cambiare senza cambiare il codice, pensa in termini di registrazione dell'audit, date di scadenza / effettive e altre cose simili che vengono aggiunte dai DBA per sistematicamente per problemi di conformità. Un'altra fonte di modifiche subdole sono le denormalizzazioni per prestazioni altrove nel sistema o campi definiti dall'utente.