Grunnleggende om databasen buffer Cache i Oracle 12c

April 15  by Eliza

Oracle 12c database buffer cache er vanligvis den største delen av SGA. Det har data som kommer fra filene på disken. Fordi tilgang til data fra disk er tregere enn fra minnet, er databasen buffer cache eneste formål å cache data i minnet for raskere tilgang.

Databasen buffer cache kan inneholde data fra alle typer objekter:

  • Tabeller
  • Indekser
  • Materialiserte visninger
  • System data

I uttrykket databasen buffer buffer, refererer betegnelsen buffer til database blokker. En database blokk er det minimum av lagringsplass som Oracle leser eller skriver. Alle lagersegmenter som inneholder data er bygget opp av blokker. Når du ber om data fra disk, på minimum Oracle leser ett kvartal.

Selv om du ber om bare én rad, mange rader i samme tabell er sannsynlig å bli hentet. Det samme gjelder hvis du ber om en kolonne i en rad. Oracle leser hele blokken, som mest sannsynlig har mange rader, og alle kolonner for den raden.

Det er mulig å tenke at hvis din avdelinger tabellen har bare ti rader, kan hele greia leses inn i minnet selv om du ber om navnet på bare én avdeling.

Buffer cache stat i Oracle 12c

Buffer cache styrer hva blokkene får bo avhengig av tilgjengelig plass og blokken tilstand (ligner på hvordan den felles svømmebasseng bestemmer hva SQL får å bo). Buffer cache bruker sin egen versjon av LRU-algoritmen.

En blokk i buffer cache kan være i en av tre tilstander:

  • Gratis: Ikke tiden blir brukt til noe
  • Pinnet: For øyeblikket i bruk
  • Dirty: Block har blitt endret, men ennå ikke skrevet til disk

Ledige blokker

Ideelt ledige blokker er tilgjengelige når du trenger dem. Men sannsynligvis er det ikke tilfelle med mindre databasen din er så liten at det hele får plass i minnet.

Den LRU-algoritmen fungerer litt annerledes i buffer cache enn det gjør i felles svømmebasseng. Det score hver blokk og deretter måler hvor lang tid det har gått siden det ble åpnet. For eksempel får en blokk et tidspunkt hver gang det er berørt.

Jo høyere poeng, jo mindre sannsynlig blokken spyles fra minnet. Det må imidlertid nås ofte eller poengsummen reduseres. En blokk har å jobbe hardt for å holde seg i minnet hvis konkurransen om minneressurser er høy.

Gi hver blokk en poengsum og tid hindrer denne typen situasjon oppstår: En blokk er tilgjengelig tungt på slutten av måneden for rapporter. Dens stillingen er høyere enn noen annen blokk i systemet. At blokken er aldri åpnet igjen.

Det sitter der sløse minnet til databasen startes på nytt eller en annen blokk slutt scorer nok poeng til å slå den ut. Tidskomponent aldre det ut veldig raskt etter at du ikke lenger tilgang til den.

Låste blokker

En blokk for tiden i bruk er et festet blokk. Blokken er låst (eller festet) inn i buffer cache slik at det ikke kan være i alderen ut av buffer cache mens Oracle prosess (ofte representerer en bruker) har tilgang til den.

Skitne blokker

En modifisert blokk er en skitten blokk. For å sikre at endringene blir holdt over database nedstengninger, disse skitne Blokker må skrives fra buffer cache til disk. Databasenavn skitne blokker i en skitten liste eller skrivekøen.

Du tenker kanskje at hver gang en blokk blir endret, bør det skrives til disk for å minimere tapte data. Dette er ikke tilfelle - selv ikke når det er en iverksetting (når du lagre endringene permanent)! Flere strukturer forhindre tapte data.

Videre har Oracle et spilleproblem. Systemytelsen ville gjennomgå hvis du skrev blokker til disk for hver endring. For å bekjempe dette, Oracle spiller oddsen at databasen er usannsynlig å mislykkes og skriver blokker til disken bare i større grupper.

Ikke bekymre deg; det er ikke engang en risiko mot tap av data. Oracle er å få ytelse ut av databasen akkurat nå kan skje på bekostning av en recovery tar lengre tid senere. Fordi feil på ordentlig administrerte systemer oppstår sjelden, det er en billig måte å få litt ytelse. Men det er ikke som om Oracle later skitne blokker over uten å rydde opp etter seg selv.

Blokk skrive utløser i Oracle 12c

Hva som utløser en blokk skrive og derfor en skitten blokk?

  • Databasen er utstedt en shutdown-kommandoen.
  • En full eller delvis sjekkpunkt skjer - det er da systemet med jevne mellomrom dumper alle de skitne buffere til disk.
  • En utvinning tid terskel, satt av deg, blir oppfylt; det totale antall av skitne blokker forårsaker en uakseptabel restitusjonstid.
  • En gratis blokk er nødvendig og ingen er funnet etter en gitt mengde av søker.
  • Visse data definition language (DDL) kommandoer. (DDL kommandoer er SQL-setninger som definerer objekter i en database.)
  • Hvert tredje sekund.
  • Andre grunner. Algoritmen er kompleks, og du kan ikke være sikker med alle de endringene som skjer med hver programvareversjon.

Faktum er databasen forblir ganske opptatt med å skrive blokker i et miljø hvor det er mange endringer.