Comprendi i tuoi requisiti prima di progettare lo schema (se possibile).
Informazioni sui dati, 1) indicizzazione 2) tipo di memoria utilizzata, 3) motore o funzionalità del fornitore; ovvero ... memorizzazione nella cache, capacità in memoria 4) tipi di dati 5) dimensione della tabella 6) frequenza della query 7) carichi di lavoro correlati se la risorsa è condivisa 8) Test
A) I requisiti possono variare. Se l'hardware non può supportare il carico di lavoro previsto, è necessario rivalutare come fornire i requisiti nel carico di lavoro. Per quanto riguarda la colonna aggiunta alla tabella. Se il database supporta le viste, è possibile creare una vista indicizzata (?) Dei dati specifici con le colonne con nome specifico (anziché selezionare '*'). Rivedi periodicamente i tuoi dati e il tuo schema per assicurarti di non imbatterti mai nella sindrome "Garbage-in" -> "Garbage-out".
Supponendo che non ci sia altra soluzione; puoi prendere in considerazione quanto segue. Esistono sempre più soluzioni a un problema.
1) Indicizzazione: la selezione * eseguirà una scansione della tabella. A seconda di vari fattori, ciò può comportare una ricerca del disco e / o contesa con altre query. Se la tabella è multiuso, assicurati che tutte le query siano performanti ed eseguite al di sotto dei tempi previsti. Se è presente una grande quantità di dati e la tua rete o altra risorsa non è ottimizzata; devi tenerne conto. Il database è un ambiente condiviso.
2) tipo di archiviazione. Vale a dire: se stai usando SSD, disco o memoria. I tempi di I / O e il carico sul sistema / CPU varieranno.
3) Il DBA può ottimizzare il database / le tabelle per prestazioni più elevate? Supponendo per qualsiasi motivo, i team hanno deciso che selezionare '*' è la migliore soluzione al problema; il DB o la tabella possono essere caricati in memoria? (O altro metodo ... forse la risposta è stata progettata per rispondere con un ritardo di 2-3 secondi? --- mentre un annuncio pubblicitario suona per guadagnare le entrate dell'azienda ...)
4) Inizia dalla linea di base. Comprendi i tuoi tipi di dati e come verranno presentati i risultati. Tipi di dati più piccoli, il numero di campi riduce la quantità di dati restituiti nel set di risultati. Questo lascia risorse disponibili per altre esigenze di sistema. Le risorse di sistema hanno generalmente un limite; 'sempre' lavorare al di sotto di questi limiti per garantire stabilità e comportamento prevedibile.
5) dimensione della tabella / dati. selezionare '*' è comune con tabelle minuscole. In genere si adattano alla memoria e i tempi di risposta sono rapidi. Ancora una volta .... rivedi le tue esigenze. Pianificare lo scorrimento delle funzioni; pianificare sempre le esigenze attuali e possibili future.
6) Frequenza di query / query. Essere consapevoli di altri carichi di lavoro sul sistema. Se questa query si attiva ogni secondo e la tabella è minuscola. Il set di risultati può essere progettato per rimanere nella cache / memoria. Tuttavia, se la query è un processo batch frequente con Gigabyte / Terabyte di dati ... potrebbe essere meglio dedicare risorse aggiuntive per garantire che altri carichi di lavoro non siano interessati.
7) Carichi di lavoro correlati. Comprendi come vengono utilizzate le risorse. La rete / sistema / database / tabella / applicazione è dedicata o condivisa? Chi sono gli stakeholder? È per produzione, sviluppo o QA? È una "soluzione rapida" temporanea? Hai provato lo scenario? Rimarrai sorpreso da quanti problemi possono esserci sull'hardware attuale oggi. (Sì, le prestazioni sono veloci ... ma il design / le prestazioni sono ancora degradate.) Il sistema deve eseguire 10K query al secondo contro 5-10 query al secondo. Il server di database è dedicato o esegue altre applicazioni, il monitoraggio viene eseguito sulla risorsa condivisa. Alcune applicazioni / lingue; Gli O / S consumeranno il 100% della memoria causando vari sintomi / problemi.
8) Test: prova le tue teorie e comprendi il più possibile. Il tuo problema "*" selezionato potrebbe essere un grosso problema, o potrebbe essere qualcosa di cui non devi nemmeno preoccuparti.
SELECT COUNT(*)
essere cattivo è incredibilmente vecchio e obsoleto . Per informazioni suSELECT *
- vedi: stackoverflow.com/questions/1960036/…