sql >> Databasteknik >  >> RDS >> Oracle

Varför använder Oracle DBMS_STATS.GATHER_TABLE_STATS?

De flesta företagsdatabaser, inklusive Oracle, använder en kostnadsbaserad optimerare för att bestämma lämplig frågeplan för en given SQL-sats. Detta innebär att optimeraren använder information om data för att avgöra hur en fråga ska köras istället för att förlita sig på regler (detta är vad den äldre regelbaserade optimeraren gjorde).

Föreställ dig till exempel en tabell för en enkel buggspårningsapplikation

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

CREATE INDEX idx_issue_status
    ON issues( issue_status );

Om jag är ett stort företag kanske jag har 1 miljon rader i den här tabellen. Av dessa har 100 en issue_status av ACTIVE har 10 000 en issue_status av KÖ, och 989 900 har statusen COMPLETE. Om jag vill köra en fråga mot tabellen för att hitta mina aktiva problem

SELECT *
  FROM issues
 WHERE issue_status = 'ACTIVE'

optimeraren har ett val. Den kan antingen använda indexet på issue_status och gör sedan en enradssökning i tabellen för varje rad i indexet som matchar eller så kan den göra en tabellskanning på issues tabell. Vilken plan som är mer effektiv beror på data som finns i tabellen. Om Oracle förväntar sig att frågan ska returnera en liten del av data i tabellen, skulle det vara mer effektivt att använda indexet. Om Oracle förväntar sig att frågan ska returnera en betydande del av data i tabellen, skulle en tabellskanning vara mer effektiv.

DBMS_STATS.GATHER_TABLE_STATS är det som samlar statistiken som gör det möjligt för Oracle att göra detta beslut. Den berättar för Oracle att det finns ungefär 1 miljon rader i tabellen, att det finns 3 distinkta värden för issue_status kolumnen och att data är ojämnt fördelad. Så Oracle vet att använda ett index för frågan för att hitta alla aktiva problem. Men den vet också att när du vänder dig om och försöker leta efter alla stängda frågor

SELECT *
  FROM issues
 WHERE issue_status = 'CLOSED'

att det blir mer effektivt att göra en tabellskanning.

Genom att samla in statistik kan frågeplanerna förändras över tiden när datavolymerna och datadistributionerna ändras. När du först installerar problemspåraren har du väldigt få AVSLUTDA problem och fler AKTIVA och KÖA-problem. Med tiden stiger antalet AVSLUTDA ärenden mycket snabbare. När du får fler rader i tabellen och den relativa andelen av de rader som finns i de olika statuserna ändras, kommer frågeplanerna att ändras så att du, i den ideala världen, alltid får en så effektiv plan som möjligt.




  1. Återställ PostgreSQL primärnyckel till 1

  2. Dynamisk pivot i oracle sql - Procedur

  3. Android Room:Hur man migrerar kolumnbyte?

  4. Postgresql enum vad är fördelarna och nackdelarna?