Imparare a ottimizzare le query SQL e comprendere i piani di esecuzione - Risorse?


8

Mi ritrovo a scrivere sempre più query SQL al lavoro (principalmente Oracle 11g, ma alcuni SQL Server 2005-2008) e ho iniziato a creare viste piuttosto complesse per il resto del team di analisti.

Per lo più funzionano tutti abbastanza bene, ma alcuni di loro non così bene. Così...

  • Come imparo a mettere a punto le mie domande?
  • Devo imparare a leggere / agire sui piani di esecuzione?

E...

  • Quali libri / siti Web puoi consigliare per conoscere l'ottimizzazione delle query SQL 1) in generale 2) specificamente per Oracle 11g?

Abbiamo alcuni buoni DBA qui, ma sono semplicemente troppo sommersi per aiutarci a mettere a punto ogni query che scriviamo.

La maggior parte dei libri che ho trovato su Amazon per Oracle sembrano tutti orientati all'ottimizzazione generale del database e / o sono stati scritti 8-10 anni fa.

Grazie gentilmente per il tuo consiglio :)


Risposte:


7

Direi che imparare a capire i piani è un'abilità vitale per aiutarti a ottimizzare le istruzioni SQL. Ho trovato il libro di Christian Antognini, Risoluzione dei problemi relativi alle prestazioni di Oracle , molto utile per spiegare in dettaglio come funzionano e per spiegare come affrontare l'ottimizzazione del database. A pochi anni, imparerai ancora molto che è ancora rilevante da esso.

Se diventi più avanzato potresti guardare i libri di Jonathan Lewis, ma questi sono più approfonditi, quindi probabilmente non è un buon punto di partenza. Oracle Fundamentals, basato sui costi, è piuttosto vecchio ora, ma gran parte è ancora rilevante. Non ho ancora letto Oracle Core: Essential Internals per la risoluzione dei problemi , ma ha ricevuto buone recensioni dalla comunità Oracle.

Dato che sei su 11g, se hai domande che richiedono più di qualche secondo, ti consiglio vivamente di guardare il monitor SQL in tempo reale (supponendo che tu abbia una licenza appropriata). Come suggerisce il nome, mostra l'avanzamento di un'istruzione SQL in tempo reale, analizzando il tempo impiegato da ciascuna operazione con i dettagli delle righe recuperate finora. Mantiene anche i dettagli delle query eseguite di recente per un breve periodo in modo da poter vedere come le modifiche influiscono su un'istruzione.

Documentazione di Oracle SQL Monitoring: http://docs.oracle.com/cd/E11882_01/server.112/e16638/instance_tune.htm#PFGRF94543

Imparare a mettere a punto le domande è qualcosa che richiederà tempo e pratica. Alcune cose che ho imparato:

  • Scrivi query per recuperare il minor numero di righe il più presto possibile (ad es. Non vuoi eseguire la scansione completa di una tabella da 10 milioni di righe se ne hai bisogno solo da 100)
  • Verificare che il numero di righe previsto in ogni passaggio di un piano esplicativo (previsto) corrisponda a quello restituito nel piano di esecuzione effettivo. Quando questi ordini di grandezza sono diversi, è probabile che l'ottimizzatore non scelga il piano "migliore".
  • Comprendi i principi di una buona indicizzazione: come funzionano e quando dovrebbero / non dovrebbero essere usati durante l'esecuzione di una query ( Richard Foote ha un blog molto approfondito che discute degli indici in Oracle)

Principalmente imparerai scrivendo query, guardando i piani di spiegazione (previsti) e confrontandoli con i piani di esecuzione effettivi (tramite tracciamento della query o utilizzo del monitor SQL). Quindi riscrivere la query, aggiungere / rimuovere indici, ecc. E vedere come influisce sui piani e sui tempi di esecuzione


1

Mentre stai cercando informazioni specifiche su Oracle, consiglierei il blog Ask Tom su Oracle. In generale, penso che troverai il consiglio di non mettere a punto la query. Riceverai buoni consigli su come scrivere una query che l'ottimizzatore può ottimizzare. Anche la documentazione di Oracle è online e di solito cerco informazioni aggiornate su Oracle. Non ho lavorato con SQL Server, quindi non ho alcun consiglio per questo.

Non ho visto molte novità nel campo dell'ottimizzazione delle query negli ultimi anni. Il grande cambiamento è la deprecazione dell'ottimizzatore basato su regole, con cui riesco a malapena a ricordare di aver lavorato. Tuttavia, capisco che SQL Server utilizza ancora un ottimizzatore basato su regole, quindi comprendere le sue regole può aiutare.

Uno strumento in cui è possibile modificare una query, eseguirla e generare un piano di spiegazione aiuta a comprendere quali cambiamenti consentono di ottenere una query che funziona correttamente. Ho ottenuto buoni risultati con AquaData Studio e mi piace molto la sua vista ad albero. Anche lo sviluppatore SQL dovrebbe fare altrettanto.

Come per qualsiasi ottimizzazione, è necessario disporre di dati quantitativi sulle prestazioni. Quindi puoi determinare se l'hai effettivamente ottimizzato.

Come ottimizzare una query dipende in parte da come il parser costruisce e ottimizza la query. In larga misura dipende dalla distribuzione dei dati di cui si sta eseguendo la query. In un database Oracle se il set di risultati costituisce il quattro percento o più di una tabella e sono distribuiti in modo casuale, una scansione della tabella è in genere più veloce di un indice.

Ho lavorato per ottimizzare le query per un team di sviluppatori. Solo due o tre query all'anno richiedevano una seria ottimizzazione. Molte query sono abbastanza semplici da non necessitare di ottimizzazione. Di solito, il resto può essere gestito aggiungendo percorsi di join mancanti.

Per Oracle ci sono tre impostazioni regolabili che possono influire in modo significativo sulle prestazioni. I costi per le ricerche di indici e dati interagiscono per modificare le condizioni in base alle quali un indice in verrà o non verrà utilizzato. Questi due possono essere regolati in base alla sessione. Le impostazioni predefinite spesso non sono ottimali. L'altro valore controlla quante alternative proverà l'ottimizzatore. Aumentare questo valore spesso aiuta.

L'ottimizzazione è influenzata in modo significativo dalla distribuzione e dal volume dei dati. Quando lo si ottimizza, è meglio utilizzare una copia del database di produzione, o almeno un database con la stessa distribuzione e volumi di dati. Ho gravemente danneggiato l'ambiente di test, ottimizzando una query per il database degli ordini di produzione. I database di test e sviluppo avevano una distribuzione dei dati significativamente diversa che causava il fallimento della query anche con dati significativamente inferiori.


Potresti prendere in considerazione l'idea di mettere più sostanza qui. Questo è in realtà borderline "non una risposta" così com'è attualmente.
JNK,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.