![]() |
| Home | Chi sono | Mappa del sito | Contatti |
|
Tutorial su Mysql->Ottimizzazione delle interrogazioni
Ottimizzazione delle interrogazioniUn programma lento può dipendere da diversi fattori, dall'hardware del server, dalla tipo di connessione al server, dalla configurazione del gestore di database, dal volume dei dati o anche dalla complessità delle interrogazioni, e per ultimo dalla struttura del database. Quest'ultimo fattore, è poco conosciuto dai principianti, ed quindi quello che verrà discusso tra poco. Consideriamo le tabelle viste in "Sub-query" e aggiungiamo le tabelle relative agli ordini dei fornitori.
Consideriamo sempre l'esempio del semplice programma aventi i seguenti moduli: gestione magazzino, ordini dei clienti e ordini dei fornitori. Ora effettuiamo ad esempio un'analisi sulle prestazioni nella schermata di visualizzazione degli ordini. Questa schermata viene utilizzata dall'utente per due obbiettivi:
La ricerca di un ordine avviene entrando nella schermata della visualizzazione degli ordini, quindi consideriamo questa operazione simile alla visualizzazione, e di conseguenza vanno considerate come unica operazione. Consideriamo inoltre l'esistenza di una paginazione della visualizzazione dei dati pari a 50 elementi, e che ogni ordine ha in media due articoli. Ciò che si vuole determinare, è se conviene avere due campi ridondanti nella tabella ordini_clienti, rispettivamente totale_importo e totale_da_evadere. Vediamo l'anali delle operazioni.
A questo punto possiamo calcolare gli accessi nelle tabelle in base alle due ipotesi: la prima con i campi totale_importo e totale_da_evadere nella tabella ordini_clienti, e la seconda senza questi campi. Nell'operazione di inserimento di un rigo d'ordine abbiamo ovviamente una operazione in scrittura sulla tabella ordine_cliente_dettaglio. Se dobbiamo agiornare anche i due campi della tabella ordini_clienti (totale_importo e totale_da_evadere), occorre ricalcolare i totali, quindi eseguire due operazioni di lettura a ordine_cliente_dettaglio (in media ogni ordine ha due articoli) e una operazione di scrittura a ordine_cliente. In una operazione di visualizzazzione ci sono 50 accessi alla tabella ordine_cliente e alla tabella cliente, per via della paginazione. In caso non si dispone dei campi con i totali, occorre eseguire 100 accessi alla tabella ordine_cliente_dettaglio (se ogni ordine ha due articoli, il totale è 100 articoli). In una operazione di evasione di un articolo di un ordine, abbiamo ovviamente una operazione in scrittura sulla tabella ordine_cliente_dettaglio. Se dobbiamo agiornare anche i due campi della tabella ordini_clienti (totale_importo e totale_da_evadere), occorre ricalcolare i totali, quindi eseguire due operazioni di lettura a ordine_cliente_dettaglio (in media ogni ordine ha due articoli) e una operazione di scrittura a ordine_cliente. Riepilogo accessi in caso di inserimento dei campi totale_importo e totale_da_evadere nella tabella ordini.
Riepilogo accessi senza questi campi.
Se consideriamo che un accesso in scrittura, ha un costo doppio di un accesso in lettura, possiamo calcolare il costo per anno delle due ipotesi. Costi in caso di inserimento dei campi totale_importo e totale_da_evadere nella tabella ordini.
Costi in caso di non inserimento di questi campi.
Dai risultati si evince che nella visualizzazione degli ordini, il costo del calcolo a run-time del totale degli importi è molto più alto del costo del mantenimento dei due campi da aggiungere alla tabella. Questo risultato dimostra l'importanza della struttura del database nell'implementazione del programma, e che soprattutto esse non deve essere vista solamente come un modo per archiviare i dati ma tutt'altro deve essere elaborata e concepita per far funzionare meglio il programma. Riepilogo
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||