LOB-løsningen

 

 

LOB-objekter

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

DDL for å opprette nye tabeller med LOB kolonner

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>)  STORE AS (

            TABLESPACE <FAG_LOB | FAG_LOB_ARKIV>  DISABLE STORAGE IN ROW

            )

[LOB (<col_navn2>)  STORE AS (

            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.         

DDL for å flytte tabeller og LOB  separat og sammen

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>) STORE AS (TABLESPACE <new_tablespace_name>  );

 

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>) STORE AS 

(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);