Oracle
 sql >> Database >  >> RDS >> Oracle

Perché Oracle utilizza DBMS_STATS.GATHER_TABLE_STATS?

La maggior parte dei database aziendali, incluso Oracle, utilizza un ottimizzatore basato sui costi per determinare il piano di query appropriato per una determinata istruzione SQL. Ciò significa che l'ottimizzatore utilizza le informazioni sui dati per determinare come eseguire una query anziché fare affidamento sulle regole (questo è ciò che faceva il vecchio ottimizzatore basato su regole).

Ad esempio, immagina una tabella per una semplice applicazione di monitoraggio dei bug

CREATE TABLE issues (
  issue_id number primary key,
  issue_text clob,
  issue_status varchar2(10)
);

CREATE INDEX idx_issue_status
    ON issues( issue_status );

Se sono una grande azienda, potrei avere 1 milione di righe in questa tabella. Di questi, 100 hanno un issue_status di ACTIVE, 10.000 hanno un issue_status di IN CODA e 989.900 hanno lo stato di COMPLETE. Se voglio eseguire una query sulla tabella per trovare i miei problemi attivi

SELECT *
  FROM issues
 WHERE issue_status = 'ACTIVE'

l'ottimizzatore ha una scelta. Può utilizzare l'indice su issue_status e quindi esegui una ricerca su una riga nella tabella per ogni riga nell'indice che corrisponde o può eseguire una scansione della tabella sui issues tavolo. Quale piano è più efficiente dipenderà dai dati presenti nella tabella. Se Oracle prevede che la query restituisca una piccola frazione dei dati nella tabella, l'utilizzo dell'indice sarebbe più efficiente. Se Oracle prevede che la query restituisca una frazione sostanziale dei dati nella tabella, una scansione della tabella sarebbe più efficiente.

DBMS_STATS.GATHER_TABLE_STATS è ciò che raccoglie le statistiche che consentono a Oracle di effettuare questa determinazione. Dice a Oracle che ci sono circa 1 milione di righe nella tabella, che ci sono 3 valori distinti per issue_status colonna e che i dati sono distribuiti in modo non uniforme. Quindi Oracle sa usare un indice per la query per trovare tutti i problemi attivi. Ma lo sa anche quando ti giri e cerchi di cercare tutti i problemi chiusi

SELECT *
  FROM issues
 WHERE issue_status = 'CLOSED'

che sarà più efficiente eseguire una scansione della tabella.

La raccolta di statistiche consente ai piani di query di cambiare nel tempo man mano che i volumi di dati e le distribuzioni dei dati cambiano. Quando installi per la prima volta il tracker dei problemi, avrai pochissimi problemi COMPLETED e più problemi ACTIVE e QUEUED. Nel tempo, il numero di emissioni COMPLETED aumenta molto più rapidamente. Man mano che ottieni più righe nella tabella e la relativa frazione di quelle righe che si trovano nei vari stati cambia, i piani di query cambieranno in modo che, nel mondo ideale, tu ottenga sempre il piano più efficiente possibile.