programmera.net -> oracledba -> normal     för utskrift      info@programmera.net

Block

1. Vad är ett block?
2. Blockstorleken
3. Blockets arkitektur
4. Headerns innehåll
5. INITRANS och MAXTRANS
6. MSSM vs ASSM

1. Vad är ett block?

Den minsta enheten för Oracles datalagring är ett block. Oracle arbetar internt med block, till exempel i följande fall:

  1. Oracle läser alltid hela block från disk.
  2. Oracle cachar alltid hela block i "Database buffer cache".
  3. Oracle skriver alltid hela block till disk.
Ett block tillhör endast ett segment, vilket betyder att det data som lagras i blocket kommer från endast ett enskilt databasobjekt. Att inte blanda data från olika objekt i blocket skapar en mer effektiv datalagring.
  • Exempel: Om vi har en tabell X med 10 rader, där varje rad har en fix längd på 100 bytes, så blir tabellens totala storlek 1 KB. Om vi har en blockstorlek på t.ex. 8 KB kommer hela tabellen rymmas i ett enda block, vilket gör det lätt för Oracle att läsa upp och cacha tabellen. Om tabellens rader låg utspridda i 10 block skulle vi få en långsammare läsning från disk.

2. Blockstorleken

Blockstorleken bestäms när man skapar databasen genom att sätta parametern DB_BLOCK_SIZE. Det är många faktorer som spelar in när du väljer en blockstorlek för din databas.

  • Godkända värden på DB_BLOCK_SIZE är 2KB, 4KB, 8KB, 16KB och 32KB.
  • Defaultvärdet för DB_BLOCK_SIZE är 2KB.
  • För optimal prestanda ska databaser som främst används för SELECT (typ Data Warehouse) ha stora block. Databaser där det förekommer mycket INSERT och UPDATE (typ OLTP) ska ha medelstora block. Block mindre än 8K ger dålig prestanda.
  • Blockstorleken bör vara en multipel av det underliggande operativsystemets blockstorlek.
Varför bör blockstorleken vara minst lika stor som operativsystemets blockstorlek? Titta på följande exempel:
  • Om det underliggande operativsystemet har en blockstorlek på 4K kommer 4K att läsas från disk, även om vi har DB_BLOCK_SIZE satt till 2KB. Om vi här ökar DB_BLOCK_SIZE till 4KB kan vi utnyttja disken mer effektivt eftersom 4 KB ändå kommer att läsas från disk vid varje läsning. Eftersom läsning från disk är går mycket långsamt vill vi att alla lästa bytes ska in i Oracles arbetsminne.
Från och med Oracle 9 går det att sätta en blockstorlek som är specifik för tabellutrymmet, och man får därmed en databas med flera olika blockstorlekar.
  • TIPS: Det kan var bra att skapa ett tabellutrymme med en annan blockstorlek när du importerar tabellutrymmen från en databas med annan blockstorlek.

3. Blockets arkitektur

Ett block består av följande delar:

  • Header: Först i blocket kommer de bytes som utgör själva headern.
  • Ledigt utrymme: Efter headern kommer de bytes som inte används.
  • Data: Sist kommer de bytes som innehåller data. Datat lagras nämligen från slutet av blocket och uppåt.
Bilden nedan visar hur ett block med blockstorlek 140 bytes kan tänkas se ut (minsta blockstorleken är egentligen 2 KB, men detta illustrerar principen):



Genom att ha det lediga utrymmet i mitten kan både headern och datadelen växa när det behövs. Vi ser också att datadelen är fragmenterad. Fragmentering uppkommer då existerande rader uppdateras eller tas bort. Oracle packar automatiskt om blocket så att datadelen blir sammanhängande när Oracle anser att det behövs.

4. Headerns innehåll

Headern har följande innehåll:

  • Blockets adress.
  • Vilken typ av segment som lagrar data i blocket (tabell, index, temporär, undo,..).
  • Table directory: Innehåller information om tabellen som använder blocket för datalagring.
  • Row directory: Innehåller information om vilka rader som lagras i blocket och adressen till de olika radernas komponenter.
  • Transaction slots: Dessa slottar används så fort en transaktion utför förändringar i blocket. När en transaktion börjar utföra förändringar i blocket skapas en slot för den transaktionen. Slotten fungerar som ett lås för den rad/rader som transaktionen har förändrat. Först när transaktionen utför COMMIT eller ROLLBACK försvinner slotten.

5. INITRANS och MAXTRANS

Dessa parametrar kan sättas då tabellutrymmet skapas (och gäller då för alla block i tabellutrymmet). Parametrarna bestämmer blockets minsta och maximala antal transaktionsslottar:

  • INITRANS: Minsta antal transkationsslottar som finns i headern. Att ha några slottar färdiga gör att det går snabbare att tilldela dem till en transaktion när det behövs. Default är 1 för block som innehåller tabelldata och 2 för block som innehåller indexdata.
  • MAXTRANS: Maximalt antal transaktionsslottar som kan skapas i headern. Denna siffra blir en övre gräns för hur många transaktioner som kan bearbeta blocket parallellt. Anledningen till att man vill ha ett max är för att man vill begränsa headerns potentiella storlek. Default är 255.
Jag tycker att dessa parametrar är ganska oviktiga och jag kan inte komma på något fall där det finns anledning att sätta INITRANS och MAXTRANS till något annat än defaultinställningarna.

6. MSSM vs ASSM

 MSSM  (Manual Segment Space Management) och  ASSM  (Automatic Segment Space Management) är två strategier som löser problemet med hur man ska veta om ett block är fullt eller om det fortfarande kan användas för att lägga till mer data.