Suppongo anche che stiate usando Oracle. E ti consiglio anche di dare un'occhiata alla pagina web del piano di spiegazioni, per i principianti. C'è molto da ottimizzare, ma può essere imparato.
Alcuni consigli seguono:
In primo luogo, quando le attività qualcuno di ottimizzare, sono quasi sempre alla ricerca di prestazioni accettabili, piuttosto che l'ultima prestazione. Se è possibile ridurre il tempo di esecuzione di una query da 3 minuti a 3 secondi, non sudare riducendolo a 2 secondi, fino a quando non viene richiesto.
In secondo luogo, fare un rapido controllo per assicurarsi che le query si sta ottimizzando sono logicamente corrette. Sembra assurdo, ma non posso dirti quante volte mi è stato chiesto un consiglio su una query a esecuzione lenta, solo per scoprire che occasionalmente forniva risposte sbagliate! E come risulta, il debug della query spesso si è rivelato anche per velocizzarlo.
In particolare, cercare la frase "Cartesian Join" nel piano di spiegazioni. Se lo vedi lì, è molto probabile che tu abbia trovato un join cartesiano involontario. Il solito schema per un join cartesiano non intenzionale è che la clausola FROM elenca le tabelle separate da virgola e le condizioni di join sono nella clausola WHERE. Tranne che manca una delle condizioni di join, in modo che Oracle non abbia altra scelta che eseguire un join cartesiano. Con tavoli di grandi dimensioni, questo è un disastro di prestazioni.
E 'possibile vedere un join cartesiano nel piano di spiegare dove la query è logicamente corretto, ma mi associano questo con le versioni precedenti di Oracle.
Cerca anche l'indice composto inutilizzato. Se la prima colonna di un indice composto non viene utilizzata nella query, Oracle potrebbe utilizzare l'indice in modo inefficiente o non farlo affatto. Vi faccio un esempio:
La query è stata:
select * from customers
where
State = @State
and ZipCode = @ZipCode
(Il DBMS Oracle non era, quindi la sintassi era diverso, e ho dimenticato la sintassi originale).
Un rapido sguardo agli indici ha rivelato un indice su Clienti con le colonne (Paese, Stato, Codice postale) in questo ordine. Ho cambiato la query per leggere
select * from customers
where Country = @Country
and State = @State
and ZipCode = @ZipCode
e ora è imbattuto in circa 6 secondi invece di circa 6 minuti, perché l'ottimizzatore era in grado di utilizzare l'indice per buon vantaggio. Ho chiesto ai programmatori di applicazioni perché avevano omesso il paese dai criteri, e questa è stata la loro risposta: sapevano che tutti gli indirizzi avevano paese uguale a 'USA' così hanno capito che potevano accelerare la query lasciando tale criterio fuori!
Purtroppo, ottimizzando il recupero del database non è davvero lo stesso di microsecondi rasatura fuori di tempo di calcolo. Comprende la comprensione della progettazione del database, in particolare degli indici, e almeno una panoramica di come l'ottimizzatore svolge il proprio lavoro.
in genere si ottiene risultati migliori dal ottimizzatore quando si impara a collaborare con esso, invece di cercare di superare in astuzia esso.
Buona fortuna per l'ottimizzazione!
Apprezzo l'aiuto, e in particolare i collegamenti. Sta iniziando a farmi da ora. Grazie ancora per l'aiuto. –
I join che non usano gli indici potrebbero essere brutti, potrebbero essere i migliori.Tutto dipende. non, non farlo, non cercare di eliminare ogni scansione completa della tabella con gli indici. –