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

Hvorfor bruger Oracle DBMS_STATS.GATHER_TABLE_STATS?

De fleste virksomhedsdatabaser, inklusive Oracle, bruger en omkostningsbaseret optimering til at bestemme den passende forespørgselsplan for en given SQL-sætning. Dette betyder, at optimeringsværktøjet bruger information om dataene til at bestemme, hvordan en forespørgsel skal udføres i stedet for at stole på regler (dette er, hvad den ældre regelbaserede optimering gjorde).

Forestil dig f.eks. en tabel til en simpel fejlsporingsapplikation

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

CREATE INDEX idx_issue_status
    ON issues( issue_status );

Hvis jeg er en stor virksomhed, har jeg måske 1 million rækker i denne tabel. Af dem har 100 en issue_status af AKTIV har 10.000 en issue_status af KØ, og 989.900 har status KOMPLET. Hvis jeg vil køre en forespørgsel mod tabellen for at finde mine aktive problemer

SELECT *
  FROM issues
 WHERE issue_status = 'ACTIVE'

optimeringsværktøjet har et valg. Den kan enten bruge indekset på issue_status og lav derefter et enkelt række opslag i tabellen for hver række i indekset, der matcher, eller det kan lave en tabelscanning på issues bord. Hvilken plan der er mere effektiv vil afhænge af de data, der er i tabellen. Hvis Oracle forventer, at forespørgslen returnerer en lille del af dataene i tabellen, ville det være mere effektivt at bruge indekset. Hvis Oracle forventer, at forespørgslen returnerer en væsentlig del af dataene i tabellen, ville en tabelscanning være mere effektiv.

DBMS_STATS.GATHER_TABLE_STATS er det, der samler de statistikker, der gør det muligt for Oracle at træffe denne beslutning. Det fortæller Oracle, at der er omkring 1 million rækker i tabellen, at der er 3 forskellige værdier for issue_status kolonne, og at dataene er ujævnt fordelt. Så Oracle ved at bruge et indeks til forespørgslen for at finde alle de aktive problemer. Men det ved det også, når du vender dig om og prøver at lede efter alle de lukkede problemer

SELECT *
  FROM issues
 WHERE issue_status = 'CLOSED'

at det vil være mere effektivt at lave en tabelscanning.

Indsamling af statistik gør det muligt for forespørgselsplanerne at ændre sig over tid, efterhånden som datamængderne og datafordelingerne ændres. Når du først installerer problemsporingen, har du meget få UDFØRTE problemer og flere AKTIVE og KØ-problemer. Over tid stiger antallet af UDFØRTE numre meget hurtigere. Efterhånden som du får flere rækker i tabellen, og den relative andel af de rækker, der er i de forskellige statusser, ændres, ændres forespørgselsplanerne, så du i den ideelle verden altid får den mest effektive plan som muligt.




  1. freeTDS bruger ikke sin konfiguration

  2. Sådan får du antallet af rækker påvirket af et udsagn, når du er inde i det udsagns trigger

  3. Identitetsstigningen hopper i SQL Server-databasen

  4. Brug XEvent Profiler til at fange forespørgsler i SQL Server