Index Organized Tables

giovedì 22 maggio 2008 alle 22:46 | Pubblicato su Installation and Configuration, SQL | Lascia un commento

Continua per me un periodo intenso che mi impedisce di scrivere con la regolarità che vorrei su questo blog. Gli impegni del lavoro sono in questo periodo molti e pressanti, in più a stento cerco di proseguire la mia preparazione per l’esame di certificazione Oracle database 10g OCP.

Per dare segni di vita scrivo velocemente questo breve post su uno degli argomenti dell’esame OCP, le Index Organized Tables (IOT). Si tratta di tabelle particolari, alternative alle tradizionali Heap Tables, che sono caratterizzate dal fatto che i dati sono organizzati allo stesso modo di un classico indice, cioè secondo una struttura ad albero di tipo B-Tree.

Sono molto utili ed il loro utilizzo è consigliabile ad esempio per le tabelle di lookup, più in generale per tutte le tabelle non eccessivamente grandi (sia in termini di numero di record che in termini di dimensione media dei record) che vengono interrogate prevalentemente per chiave primaria. Il primo vantaggio è un risparmio di spazio, il secondo è un miglioramento delle prestazioni dovuto a due fattori legati fra loro. Faccio un esempio, una tabella di lookup o decodifica. Supponiamo di avere una tabella di tipologie di articoli che può avere da qualche unità a qualche centinaio di record. Parliamo di applicazioni prevalentemente OLTP, ad esempio un sistema di gestione ordini. Se questa tabella viene usata ad ogni transazione per la decodifica dei codici degli articoli, ad ogni transazione viene interrogata per codice per avere la descrizione, questo significa normalmente in un accesso all’indice e successivamente alla tabella per estrarre il record completo. Chiaramente se la tabella viene usata molto è probabile che sia i blocchi relativi all’indice che quelli alla tabella verranno mantenuti in cache. Se in questo caso si usa una IOT si ha da un lato un miglioramento delle prestazioni dovuto al fatto che non c’è il doppio passaggio indice-tabella, una volta trovata l’elemento dell’indice si hanno tutti i dati. Dall’altro lato vi è un risparmio di spazio in cache che può essere quindi usato per altri dati.

Sulle IOT possono essere creati anche indici, chiamati indici secondari. La particolarità è che le IOT non hanno ROWID come le tabelle heap ma utilizzano UROWID ovvero rowid logici che contengono sia la chiave primaria che l’informazione sul file fisico e il blocco iniziale del dato, come il rowid per le tabelle heap. L’indicazione sul blocco però viene chiamata supposizione e può essere sbagliata perchè essendo una IOT organizzata fisicamente come un B-Tree a seconda della variazioni dei dati vi possono essere degli spostamenti per la riorganizzazione dell’albero (leaf block splits). Quindi oracle prima prova a trovare il record nel blocco indicato nel UROWID, se l’indicazione è sbagliata allora utilizza la chiave primaria. Per evitare questa situazione occorre ricostruire l’indice. Una alternativa è l’uso dell’istruzione “ALTER INDEX … UPDATE BLOCK REFERENCES” che può ossere fatta a caldo (online).

OVERFLOW

In caso di record grandi è possibile anche indicare ad oracle di mettere parte dei record (solo campi non appartenenti alla chiave primaria) in una area separata dalla struttura b-tree. Ad esempio:

CREATE TABLE tipoarticolo (
 codice varchar2(10),
 descrizione varchar2(255),
 descrizionelunga varchar2(1000),
 CONTSTRAINT  tipoarticolo_cod_pk
  PRIMARY KEY (codice))
ORGANIZATION INDEX
TABLESPACE indx
PCTTHRESHOLD 20
OVERFLOW TABLESPACE users;

Personalmente, ma senza aver fatto prove che lo confermino, intuisco e sospetto che l’uso dell’overflow riduca di molto i vantaggi delle IOT sulle tabelle heap.

Lascia un commento »

RSS feed for comments on this post. TrackBack URI

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Blog su WordPress.com.
Entries e commenti feeds.

%d blogger cliccano Mi Piace per questo: