Tabelas em Clusters
Autor: Luciana Carvalho | Publicado: 2011-08-01T12:23:00-07:00

Olá Pessoal.
Continuando a saga de Posts realacionados aos tipos de Tabelas no Oracle, hoje irei comentar sobre os Clusters de Tabelas.

O Cluster é um objeto de esquema que armazena duas ou mais tabelas no mesmo&nbsp; bloco ou segmento,&nbsp; ou seja&nbsp; você tem dados de muitas tabelas compartilhando o mesmo bloco de dados fisicamente.
Um Cluster auxilia nas leituras de tabelas que contenham colunas&nbsp;relacionadas e são normalmente acessadas juntas assim possibilita menos I/O na Base de dados.
Podemos usar como exemplo as nossas amigas e velhas conhecidas tabelas de teste do Oracle a EMP e DEPT.&nbsp; Caso quiséssemos unir estas duas tabelas&nbsp; em um Cluster usaríamos a coluna DEPTNO que é comum nas duas tabelas&nbsp; e será determinada como a chave do cluster.
A chave de um cluster não poderá ter valores repetidos, caso seja necessário mais colunas para unir as tabelas, uma chave de Cluster composite de 32 colunas poderá ser utilizada.

Claro que nem tudo são flores existem limitações a serem avaliadas antes de utilizar as tabelas em clusters.&nbsp;São elas:
·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Os tipos de dados LONG, LOB, LONG ROW não são suportados dentro de um cluster.·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Caso haja a necessidade de consultar somente uma tabela do cluster o desempenho da consulta tende a piorar, pois não há como extrair as linhas de uma tabela sem trazer as linhas pertencentes à outra tabela que faz parte do cluster, por isso pense bem antes de sair criando.·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Operações DML também podem causar um impacto referente às tabelas armazenadas nos clusters.
Os tipos de Clusters mais utilizados são:
·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cluster de Índice é o tipo padrão e requer que um índice de cluster seja criado para o Cluster.·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cluster de Hash, a chave do cluster é convertida em um valor de hash e será armazenada no cluster com base neste valor não havendo a necessidade de criação de um índice para o cluster, ou seja, utiliza uma função hashing para armazenar e recuperara as linhas em uma tabela.·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cluster de Hash Classificado também utiliza uma função hashing para armazenar e recuperara as linhas, além disso, permite que as linhas sejam armazenadas por uma ou mais colunas das tabelas em ordens crescentes.&nbsp;Também a adição de um parâmetro SORT depois das definições de colunas dentro do cluster para indicar a ordem pela qual a classificação ira seguir.
Oracle Quick Tip: O parâmetro HashKeys Permite definir quantos valores de Hash deve ser alocado à tabela.
Bom vcs devem estar se perguntando e quando devemos usar cada um desses tipos de clusters.
No caso do Cluster de Índice, devemos levar em consideração a varredura de intervalos e os predicados de desigualdade utilizados na chave de cluster.
Já no cluster de Hash o ideal é que o predicado de igualdade seja utilizado nas colunas de clusters.

Para que possamos utilizar estes recursos devemos seguir alguns passos:

1-Passo Temos que criar um objeto Cluster para ser utilizado pela tabela, o comando utilizado é o CREATE CLUSTER.

2-Criar as tabelas que participarão do Cluster, o comando utilizado é o CREATE TABLE.

3-Caso seja um Cluster de Índice temos que criar um Índice para o Cluster, o comando utilizado é o CREATE INDEX.

Oracle Quick Tip: Para criar um Cluster em seu Schema será necessário o privilégio de sistema CREATE CLUSTER, caso seja em um outro schema&nbsp; CREATE ANY CLUSTER. Também deverá ter cota alocada no Tablespace utilizado.

EXEMPLO:&nbsp;

Na minha base de dados de Teste eu tenho 2 tabelas Heaps (ITEM_MASTER,ITEM_SALE). 

SQL&gt; select count(*) from&nbsp; ITEM_MASTER ;
&nbsp; COUNT(*) 
----------
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3500

SQL&gt; select count(*) from ITEM_SALE ;
&nbsp; COUNT(*) 
----------
&nbsp;&nbsp; 4001994

Para o nosso exemplo irei criar 2 tabelas com as mesmas estruturas e quantidades de Dados que as tabelas Heaps para que possamos compará-las.
Vamos lá chega de Teoria!!!

1-Criação do Cluster 

SQL&gt; CREATE CLUSTER testecluster(
ITEM_ID NUMBER) HASHKEYS 3500;&nbsp; 
Cluster created.

2-Criação da Tabela mãe associada ao objeto &nbsp;Cluster&nbsp; testecluster.

CREATE TABLE ITEM_MASTER_CLUSTER
(ITEM_ID&nbsp;&nbsp;&nbsp; NUMBER,ITEM_NAME&nbsp; VARCHAR2(30 ) NOT NULL&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
CLUSTER TESTECLUSTER(ITEM_ID)
NOCOMPRESS ;
&nbsp;ALTER TABLE ITEM_MASTER_CLUSTER ADD (
PRIMARY KEY
(ITEM_ID));

&nbsp;3-Criação da Tabela&nbsp;Filha &nbsp;associada ao objeto &nbsp;Cluster&nbsp; testecluster.

CREATE TABLE ITEM_SALE_CLUSTER&nbsp;
(&nbsp;ITEM_SALE_ID&nbsp;&nbsp;&nbsp; NUMBER,
&nbsp;ITEM_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER,
&nbsp;ITEMS_SOLD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER,
&nbsp;ITEM_SALE_DATE&nbsp; DATE,
&nbsp;ITEM_SOLD_TO&nbsp;&nbsp;&nbsp; NUMBER)
CLUSTER TESTECLUSTER(ITEM_ID)
NOCOMPRESS ;
ALTER TABLE ITEM_SALE_CLUSTER ADD (
PRIMARY KEY
(ITEM_SALE_ID))
ALTER TABLE ITEM_SALE_CLUSTER ADD (
FOREIGN KEY (ITEM_ID) 
REFERENCES TEM_MASTER (ITEM_ID));

4-Quantidade total de registros nas Tabelas de Clusters :

SQL&gt; select count(*) from&nbsp; ITEM_MASTER_CLUSTER ;
&nbsp;COUNT(*)
----------
3500

SQL&gt; select count(*) from ITEM_SALE ;
&nbsp;COUNT(*)
----------
&nbsp;4001994

&nbsp;5-Gerei um&nbsp;Plano de Execução&nbsp;em uma declaração Select&nbsp; utilizando as tabelas HEAPS e as Tabelas Clusters para compararmos qual solução será&nbsp; mais viável.

A-Explain , Query utilizando as tabelas em Clusters.

SQL&gt; explain plan for&nbsp; SELECT *
FROM&nbsp; ITEM_MASTER_CLUSTER&nbsp; A ,ITEM_SALE_CLUSTER&nbsp; B
WHERE A.ITEM_ID =&nbsp; B.ITEM_ID
ORDER BY A.ITEM_ID ; 
Explained.

SQL&gt; set pagesize 1000
SQL&gt; set linesize 300
SQL&gt; select * from table(dbms_xplan.display);








B-Explain , Query utilizando as tabelas Heaps.

SQL&gt; explain plan for&nbsp; SELECT *
FROM&nbsp; ITEM_MASTER&nbsp;&nbsp; A ,ITEM_SALE&nbsp; B
WHERE A.ITEM_ID =&nbsp; B.ITEM_ID
ORDER BY A.ITEM_ID ; 
Explained.

SQL&gt; select * from table(dbms_xplan.display);










Percebam que após a analisarmos os dois planos de execução, a query que utliza as tabelas em clusters teve o melhor custo e o menor tempo de processamento.

Claro que este é somente um cenário ipotético , devemos considerar a volumetria e granularidade dos dados em nossa base. E sempre testar , testar e testar...... 

Oracle Quick Tip : Para eliminar tabelas que pertencem a um cluster, devemos eliminar o cluster para o qual as tabelas estão associadas,&nbsp;com a Clausúla DROP CLUSTER&nbsp; testecluster INCLUDING TABLES CASCADE ;

Referências :
http://download.oracle.com/docs/

Obrigada!