LOB håndtering er en flersidige oppgave. Mangel på oppmerksomhet mot LOB-objekter kan forårsake et rekke ytelse problemer. Vanligvis ligger løsning i en ”grå sone” mellom utvikling og database administrering. Dvs at både forretningslogikken, design på tabell nivå og data design innenfor databasen er særlig viktig for baser med stor antall LOB-objekter.
Versjon 9i utvider LOB teknikk og gir flere fine muligheter, f.eks. med flere størrelse på DB_BLOCK_SIZE , CHUNK størrelse osv. Vi skal redigere dokumentet med nå r nye trekk blir tatt i forretningslogikk
Vi vurderes det følgende hovedlinjer som kan påvirke ytelse:
- LOB beliggende innenfor eller utenfor tabell
- Local Managed og separate tablespace for interne LOB av forskjellige typer
- mest mulig export av LOB fra database til BFILEs
- mest mulig arkivering av interne BLOB (plassering til READ-ONLY tablespace)
I USDPROD brukes 6 typer av LOB: BFILE (eksterne LOB), BLOB (bilder), CLOB (tekster), ORDAUDIO, ORDVIDEO og ORDIMAGE. Under data design i basen satte vi to mål: Minimere responstid og optimere resursbruk. Fra dette synspunktet ble det undersøkt to følgende aspekter:
1) plassering av LOB innenfor eller utenfor tabellen
2) ytelse problemer i forhold til LOB-segment og LOB-index utplassering
Det ble funnet følgende:
1) Generelt sett, anbefales det under Oracle 9i at LOBene settes ENABLE STORAGE IN ROW (dette er default). I dette tilfellet analyserer oracle størrelse på LOB i hver råd:
- LOB med størrelse mindre 4K lagres sammen med sin locator i raden og aksessers raskere
- LOB over 4K lagres automatisk i LOB-segment utenfor tabellen og raden inneholder bare locator
Men modus DISABLE STORAGE IN ROW øker I/O hastighet når:
- tabellen har flere kolonner som aksessers inkludere LOB-kolonner
- tabellen har bare indeks- og LOB- kolonner og har veldig mange rader (eksempel på det siste er faksimile tabeller)
2) Generell info om LOB-segmenter og LOB- indekser:
- for hver LOB-kollonne lager Oracle et LOB-segment og et LOB-index segment ( for LOB av ORDSYS-typen AUDIO og VIDEO dannes det to LOB segmenter og to indeks segmenter pr. objekt).
- i Oracle 9i lagres LOB-index segmentet alltid i samme tablespacet som LOB-segmentet
- Gjerne ikke angi navn på LOB-segmentet og LOB-index segment eksplisitt, da får begge default systemnavn.
- størrelse på LOB-segmenter:
- LOB ligger innenfor tabellen – ikke noe rasjonelt vurdering på størrelse siden oracle kan ikke forklare hvilke info lagres i LOB-segment
- LOB ligger utenfor tabellen – LOB skrives på disken med default CHUNK som default er lik DB_BLOCK_SIZE, dvs 8K for USDPROD
- størrelsen på LOB index segment er ca 5% av størrelsen til LOB-segmentet.
Løsningen under 8i er:
- utvikler bestemmer selv om LOB utplassering i forhold til tabellen
- interne LOB av forskjellige type skal plasseres til separate LOCAL MANAGED tablespace med automatisk vurdering av størrelsen på INITIAL og NEXT EXTENT
- eksportere LOB fra database mest mulig tilø BFILEs
- arkivere interne BLOB (plassering til READ-ONLY tablespace) mest mulig
Her ligger diverse nyttige DDL for tabeller med LOB kollonner som gjelder ombygging eller omplassering av tabeller og LOB samtidig eller separat:
DDL for å opprette nye
tabeller med LOB kolonner
DDL for å flytte tabeller og LOB separat og sammen
Du kan bruke følgene DDL for å opprette nye tabeller med LOB kolonner:
1)
I tilfellet at tabellen inneholder LOBs av samme type slik at alle skal lagres enten innenfor eller
utenfor tabellen, bruk følgende DDL:
CREATE TABLE
[<skjema_navn>.]<table_navn> (
…. beskrivelse av kolonner
inkludert LOB-kolonner…
)
LOB (<col_navn1>[, <col_navn2>, …]) STORE AS (
TABLESPACE FAG_LOB | FAG_LOB_ARKIV|FAG_ORDLOB|FAG_ORDLOB_ARKIV
[DISABLE STORAGE IN ROW | ENABLE STORAGE IN ROW]
)
TABLESPACE
FAG_DATA STORAGE (INITIAL <size> K|M NEXT <size> K|M
PCTINCREASE 0)
CREATE INDEX [<skjema_navn>.]<table_navn>
ON " skjema_navn>.]<table_navn>
(<kol_navn>) TABLESPACE FAG_INDEX;
(Ikke
glem å angi FAG_INDEX tablespace til indeks!)
Man trenger ikke storage
parameter lenge siden alle tabellene er plassert til Local Managed tablespaces.
Eksempel:.
CREATE
TABLE TEST_LOB (
C1 NUMBER,
C2 CLOB,
C3 CLOB)
LOB
(C2, C3) STORE AS (TABLESPACE FAG_LOB ENABLE STORAGE IN ROW
);
2)
I tilfellet LOBs er av forskjellige typer
slik at noen ligger inne og noen utenfor av tabellen eller LOBs skal
ligge i forskjellige tablespaces – angi mønster for hver LOB separat:
CREATE TABLE [<skjema_navn>.]<table_navn>
(
….
beskrivelse av kolonner inkludert LOB-kolonner…
)
LOB
(<col_navn1>)
TABLESPACE <FAG_LOB |
FAG_LOB_ARKIV> DISABLE STORAGE IN ROW
)
[LOB
(<col_navn2>)
TABLESPACE <FAG_LOB |
FAG_LOB_ARKIV> ENABLE STORAGE IN ROW
)
,…
];
Exempel:
CREATE
TABLE TEST_LOB (
C1 NUMBER,
C2 CLOB,
C3 BLOB,
C4 ORDAUDIO)
LOB (C2) STORE AS (TABLESPACE FAG_LOB | FAG_LOB_ARKIV
ENABLE STORAGE IN ROW
)
LOB (C3) STORE AS (TABLESPACE FAG_LOB | FAG_LOB_ARKIV
DISABLE STORAGE IN ROW
)
LOB (C4) STORE AS (TABLESPACE FAG_LOBORD | FAG_LOBORD_ARKIV
DISABLE STORAGE IN ROW
);
Man trenger ikke storage
parameter lenge siden alle tabellene er plassert til Local Managed tablespaces.
Her
endres det ikke beliggende av LOB innenfor eller utenfor tabellen!
1)
For å ombygge tabellen (tablesegment) i
samme tablespace og samme storage parametre uten å røre på LOB:
ALTER TABLE
<table_name> MOVE ;
Eksempel: ALTER TABLE FAKSIMILE MOVE;
2) Å flytte tabellen til en annen tablespace (tabell
segment) uten å røre på LOB segmenter
ALTER TABLE
<table_name> MOVE TABLESPACE
<new_tablespace_name> ;
Eksempel:
:
ALTER TABLE FAKSIMILE
MOVE TABLESPACE RYDD_DATA;
3) Å flytte en indeks uten å røre på tabellen og
lob:
Eksempel:
ALTER INDEX LEKSNORM.OPPSLAG_SOUND
REBUILD TABLESPACE LEKS_INDEX ;
4) Å flytte
LOB-segment (og
LOB-indexsegment) uten å endre plassering og parametre til tabell
segment:
ALTER TABLE <table_name>
MOVE
LOB(<col_navn>)
Eksempel:
ALTER
TABLE FAKSIMILE MOVE
LOB ( PHOTO) STORE AS (TABLESPACE
FAG_LOB);
5)
Å flytte tabellen og LOB og /eller endre
utplassering LOB i tabellen:
ALTER TABLE
<table_name> MOVE [TABLESPACE
<new_tablespace_name> ]
LOB(<col_navn>)
(TABLESPACE <new_tablespace_name>
[ENABLE STORGE IN ROW|DISABLE STORAGE IN ROW]
);
Eksempel:
Flytting av tabellen Faksimile til tablespace RYDD_DATA og flytting av LOB utenfor tabellen med
utplassering av LOB til LOB segment til tablespace USD_LOB
ALTER
TABLE FAKSIMILE MOVE TABLESPACE RYDD_DATA
LOB
( PHOTO) STORE AS (TABLESPACE USD_LOB DISABLE
STORAGE IN ROW);