2011-09-02 30 views

risposta

8

Non c'è una risposta breve. Dipende totalmente dai tuoi dati e da come lo usi. Ecco alcuni aspetti da considerare:

Come sottolineato da @NullUserException, le statistiche vengono raccolte automaticamente, di solito ogni notte. Di solito è abbastanza buono; nella maggior parte degli ambienti (OLTP), se hai appena aggiunto nuovi oggetti, non contengono molti dati prima che le statistiche vengano raccolte automaticamente. I piani non saranno poi così male, e se gli oggetti sono nuovi probabilmente non saranno usati molto subito.

  • la creazione di un nuovo indice - No. "Oracle Database now automatically collects statistics during index creation and rebuild".
  • aggiunta di una colonna - Forse. Se la colonna verrà utilizzata in join e predicati, probabilmente vorrai delle statistiche su di essa. Se è solo usato per la memorizzazione e la visualizzazione dei dati, non avrà alcun effetto sui piani. Ma, se la nuova colonna occupa molto spazio, potrebbe modificare in modo significativo la lunghezza media delle righe, il numero di blocchi, il concatenamento di righe, ecc. E l'ottimizzatore dovrebbe saperlo.
  • creazione di un nuovo tavolo - Probabilmente. Oracle è in grado di compensare le statistiche mancanti tramite dynamic sampling, anche se spesso non è abbastanza buono. Soprattutto se la nuova tabella ha molti dati; statistiche sbagliate portano quasi sempre a sottovalutare la cardinalità, che porterà a cicli annidati quando si desidera l'hash join. Inoltre, anche se i dati della tabella non sono stati modificati, potrebbe essere necessario raccogliere le statistiche ancora una volta per abilitare gli istogrammi. Per impostazione predefinita, Oracle crea istogrammi per dati inclinati, ma non abiliterà quegli istogrammi se tali colonne non sono state utilizzate come predicato. (Questo vale anche per l'aggiunta di una nuova colonna). Se si rilascia e si ricrea una tabella, anche con lo stesso nome, Oracle non manterrà alcuna colonna che utilizza i dati e non saprà che sono necessari istogrammi su determinate colonne.

La raccolta di statistiche di ottimizzazione è molto più difficile di quanto si pensi. Al mio attuale lavoro, la maggior parte dei nostri problemi di prestazioni sono in definitiva a causa di statistiche sbagliate. Se stai cercando di elaborare un piano per il tuo sistema, devi leggere lo Managing Optimizer Statistics chapter.


Aggiornamento:

Non c'è alcuna necessità di raccogliere statistiche per gli oggetti vuoti; il campionamento dinamico funzionerà altrettanto rapidamente delle statistiche di lettura dal dizionario dei dati. (Sulla base di un test rapido è possibile analizzare un numero elevato di query con e senza statistiche.) Se si disabilita il campionamento dinamico, potrebbero esserci alcuni casi strani in cui i valori predefiniti di Oracle portano a piani imprecisi e si farebbe meglio con le statistiche su un tavolo vuoto

Penso che la ragione per cui Oracle raccoglie automaticamente le statistiche per gli indici al momento della creazione è perché non costa molto di più. Quando crei un indice devi leggere tutti i blocchi nella tabella, quindi Oracle potrebbe anche calcolare il numero di livelli, blocchi, chiavi, ecc. Allo stesso tempo.

Le statistiche di tabella possono essere più complicate e possono richiedere più passaggi dei dati. La creazione di un indice è relativamente semplice rispetto a SQL arbitrario che può essere utilizzato come parte di una tabella di creazione come selezione. Potrebbe non essere possibile, o efficiente, prendere queste istruzioni SQL arbitrarie e trasformarle in una query che restituisce anche le informazioni necessarie per raccogliere le statistiche.

Ovviamente non costerebbe nulla in più per raccogliere statistiche per un tavolo vuoto. Ma non ti guadagna nulla, e sarebbe solo fuorviante per chiunque guardi a USER_TABLES.LAST_ANALYZED - la tabella sembra essere analizzata, ma non con dati significativi.

+0

Quando parlo di nuove colonne e tabelle, sto parlando di oggetti * vuoti *. È strano che Oracle non raccolga automaticamente le statistiche alla creazione per quelle. Perché lo fa per i nuovi indici? –

Problemi correlati