Le scarse prestazioni del database sono una spina nel fianco di ogni DBA. E non è sempre facile isolare la causa principale dei problemi di prestazioni, il che non fa che aumentare lo stress.
L'ottimizzazione dei database di SQL Server è un ottimo modo per risolvere alcuni dei problemi di prestazioni, ma potrebbe non essere sempre chiaro da dove iniziare il processo di ottimizzazione. Se escludi spazio su disco, memoria e altri killer delle prestazioni di rete e hardware e le prestazioni di SQL Server sono ancora in ritardo, è il momento di approfondire le tue query.
Le query non ottimizzate possono causare una miriade di problemi di prestazioni per i tuoi sistemi. Il lato positivo è che alcuni errori di query comuni sono responsabili della maggior parte del degrado delle prestazioni del database.
Se le tue query soffrono di uno di questi sei problemi, preparati per una seria messa a punto delle prestazioni.
Richiesta problema n. 1:Espressioni simili con caratteri jolly iniziali
I principali caratteri jolly impediscono a MySQL di utilizzare gli indici, forzando una scansione completa della tabella anche se hai indicizzato un campo all'interno della tabella. La scansione di tutte le righe di una tabella rallenta notevolmente la consegna dei risultati della query, quindi elimina il carattere jolly iniziale per migliorare l'efficienza.
Richiesta problema n. 2:colonne non indicizzate utilizzate nelle clausole "Dove" e "Raggruppa per"
L'indicizzazione delle colonne consente di restituire i risultati delle query più rapidamente poiché elimina la necessità di scansioni complete della tabella. L'indicizzazione aiuta anche a ordinare i record quando vengono restituiti e garantisce che tali record siano identificabili in modo univoco, il che è particolarmente utile nelle tabelle con più di 10 righe.
Per un po' di prospettiva, considera l'esecuzione di un'istruzione "spiega" nell'analisi della query prima e dopo l'indicizzazione. Questo ti darà un'idea di quante righe di scansione hai appena salvato.
Richiesta problema n. 3:affermazioni simili che utilizzano l'operatore "o" invece di una clausola di unione
L'esecuzione di query utilizzando l'operatore di confronto "or" su campi o colonne di una tabella può essere utile, ma l'applicazione di "or" troppo frequentemente in una clausola "where" è un'altra corsia preferenziale per una scansione completa della tabella.
Una clausola di unione può velocizzare l'esecuzione della query SQL, soprattutto se indici diversi ottimizzano ogni lato della query. In sostanza, l'operatore union prende i risultati di due query veloci e indicizzate e le unisce in una.
Richiesta problema n. 4:ricerche con caratteri jolly
Se sei bloccato in una situazione in cui devi cercare con caratteri jolly ma non vuoi subire il colpo di prestazioni, prova a utilizzare una ricerca full-text di MySQL. Le ricerche full-text sono considerevolmente più veloci rispetto a quelle con caratteri jolly e ottieni il vantaggio aggiuntivo di risultati più pertinenti durante la ricerca in enormi database.
Problema Query n. 5:Schema del database non ottimizzato
Puoi migliorare così tanto le prestazioni delle query SQL solo se non ottimizzi anche lo schema del database. Ecco alcuni suggerimenti per il miglioramento:
Normalizza le tabelle
La ridondanza dei dati danneggia le prestazioni, quindi assicurati di rappresentare un fatto solo una volta nel database. Ad esempio, se si fa riferimento a un cliente in più di una tabella, utilizzare "customer_name" solo una volta, quindi utilizzare "customer_ID" per i riferimenti successivi.
Utilizza tipi di dati ottimali
Alcuni punti importanti da ricordare quando si tratta di tipi di dati:
- Più corto è meglio quando si progettano i tavoli. Ad esempio, utilizzare il tipo di dati "TINYINT" per il campo "user_id" per una tabella utente di sistema con meno di 100 utenti.
- Utilizza un tipo di dati "data_ora" se un campo prevede un valore di data, quindi non devi convertire i record in formato data dopo il fatto.
- MySQL funziona meglio con i valori interi rispetto ai tipi di dati di testo, incluso varchar.
Evita valori nulli
I valori Null in una colonna possono danneggiare i risultati della query, quindi potrebbe essere necessario assegnare un valore predefinito per i campi in cui i record non richiedono un valore obbligatorio.
Non utilizzare troppe colonne
Le tabelle larghe (più di 100 colonne) richiedono molta CPU e risorse per essere elaborate. A meno che tu non debba includere assolutamente una tabella ampia, è meglio dividerla in tabelle logiche più piccole.
Ottimizza i join
Le istruzioni SQL con troppi join (e join con troppe tabelle) influiscono negativamente sulle prestazioni. Scatta per non più di 12 join per ogni query.
Query problema n. 6:query MySQL non memorizzate nella cache
I siti Web e le applicazioni che eseguono molte query selezionate trarranno vantaggio dalla memorizzazione nella cache delle query MySQL. La memorizzazione nella cache delle query MySQL velocizza le prestazioni durante le operazioni di lettura perché memorizza nella cache la query di selezione insieme al set di dati risultante e recupera dalla memoria (non dal disco) se la query viene eseguita più di una volta.
L'ottimizzazione delle prestazioni è essenziale per mantenere un'elevata disponibilità per i database di SQL Server e garantire la soddisfazione degli utenti finali. Ma sfortunatamente, non è sempre immediatamente ovvio dove sia più necessaria la messa a punto. Se hai eliminato le ovvie fonti hardware e di rete per problemi di prestazioni, sposta l'attenzione sulle tue query.
Se hai lavorato come DBA per un certo periodo di tempo, probabilmente hai riscontrato una (o tutte) di queste query problematiche. Ora che sai a cosa prestare attenzione, sii proattivo nella tua iniziativa di miglioramento delle prestazioni e correggi questi punti deboli delle query comuni in modo da poter raccogliere i frutti dell'ottimizzazione delle query di SQL Server.