CONCEITOS GERAIS
Views Materializadas são objetos do usuário (subordinados a um schema) que podem
ser usados para sumariar, pré calcular, replicar e distribuir dados.
O método de atualização (refresh) pode ser incremental (fast refresh) ou completo. Para
o método incremental haverá a necessidade de criação de um log (materialized view
log) para armazenamento das alterações feitas para as tabelas originais.
A atualização das views materializadas poderá ser feita tanto sob demanda quando em
intervalos de tempos previamente definidos. Quando uma view materializada reside no
mesmo site de suas tabelas originais, sua atualização poderá ocorrer quando uma
transação efetivar (commit) suas modificações para as tabelas originais.
physical_properties::=
Description of the illustration physical_properties.gif
materialized_view_props::=
scoped_table_ref_constraint ::=
index_org_table_clause::=
Description of the illustration index_org_table_clause.gif
key_compression::=
index_org_overflow_clause::=
(segment_attributes_clause::=)
create_mv_refresh::=
Description of the illustration create_mv_refresh.gif
segment_attributes_clause::=
(physical_attributes_clause::=, logging_clause::=)
physical_attributes_clause::=
Description of the illustration physical_attributes_clause.gif
(logging_clause::=)
logging_clause::=
table_compression ::=
column_properties ::=
(object_type_col_properties::=, nested_table_col_properties::=,
varray_col_properties::=, LOB_partition_storage::=, LOB_storage_clause::=,
XMLType_column_properties: not supported for materialized views)
object_type_col_properties::=
(substitutable_column_clause::=)
substitutable_column_clause::=
nested_table_col_properties::=
(substitutable_column_clause::=, object_properties::=,
physical_properties::=--part of CREATE TABLE syntax,
column_properties ::=)
varray_col_properties::=
Description of the illustration varray_col_properties.gif
(substitutable_column_clause::=, LOB_parameters::=)
LOB_storage_clause::=
(LOB_parameters::=)
LOB_parameters::=
Description of the illustration LOB_parameters.gif
(storage_clause::=, logging_clause::=)
LOB_partition_storage::=
(LOB_storage_clause::=, varray_col_properties::=)
parallel_clause::=
ONDE:
IMMEDIATE – indica que a view será preenchida imediatamente após sua criação (é a
opção default).
ON PREBUILT TABLE – permite que façamos o registro de uma tabela existente para
uma view pré-inicializada. A tabela deve ter o mesmo nome da view que está sendo
criada.
A tabela existente mantém sua identidade como tabela e é, opcionalmente, mantida pelo
mecanismo de refresh de views materializadas (a fim de retratar as alterações realizadas
nas tabelas-detalhe correspondentes).
RESTRIÇÕES:
Cada alias de coluna na subquery deve corresponder a uma coluna na tabela nomeada.
A coluna correspondente deve ter os mesmos tipos.
Se usarmos esta cláusula não podemos especificar a constraint NOT NULL para
qualquer coluna não referenciada na subquery a menos que tenhamos especificado um
valor default para aquela coluna.
USING INDEX – especifica parâmetros para criação dos índices. Como restrição temos
que não é possível a especificação dos parâmetros PCTUSED e PCTFREE nesta
cláusula.
FAST – especifica uma forma de atualização rápida (incremental), que usa somente
atualização dos dados, os quais estão armazenados no log da view materializada.
Estes dados estão relacionados às tabelas originais. O log deve existir para que a
operação de Fast Refresh seja bem sucedida (a menos que usemos direct path load).
O ORACLE somente poderá realizar um Fast Refresh se todas as condições a seguir
forem verdadeiras:
A master table da view materializada tem um log (materialized view log) ou usamos
Direct Load Insert (neste caso o Oracle cria um Direct Loader Log automaticamente.
Nenhuma intervenção é necessária).
O log foi criado antes da view materializada ter sido refrescada ou criada.
FORCE – Indica que se não for possível à realização de um Fast Refresh, deve ser
realizado um Complete Refresh. O Oracle decide se um Fast Refresh é possível a tempo
de execução. Esta é a opção default.
START WITH – especifica uma expressão de data que determina o primeiro refresh
automático.
NEXT – especifica uma expressão de data para cálculo do intervalo entre os Refreshes
automáticos.
Tanto o valor de START WITH quanto o de NEXT devem ser avaliados para um
momento no futuro. Se omitirmos o valor START WITH, o Oracle determina a primeira
data através da expressão presente no Next aplicada sobre a data de criação da view
materializada.
WITH PRIMARY KEY – especifica que uma view materializada baseada em Primary
Key será criada. Esta é a opção default e deve ser usada em todos os casos (exceto para
aqueles descritos no item WITH ROWID).
WITH ROWID – especifica que uma view materializada baseada em Rowid será criada.
Este tipo de objeto foi mantido para compatibilidade com versões anteriores à versão
8.0.
Podemos também usar este tipo de objeto para suportar views materializadas que não
incluam todas as colunas de primary key.
Não podem conter Subqueries, Joins ou Operações de Conjuntos (Minus, Union, etc).
Não podem ser Fast Refreshed após uma reorganização da Master Table.
Se não especificarmos Master or Local, o Oracle usa o Local por default. Se não
especificarmos nenhum segmento de rollback, o Oracle escolhe qual usar.
QUERY REWRITE – especifica se a view materializada está apta a ser usada em query
rewrite.
ENABLE – habilita a view materializada para Query Rewrite. Esta cláusula está
desabilitada, por default.
Somente podemos habilitar esta opção se todas as funções do usuário presentes na view
materializada forem do tipo DETERMINISTIC.
Se usarmos variáveis Bind na query, esta não será usada pelo mecanismo de query
rewrite, mesmo que venhamos a habilitar esta opção.
DISABLE – especifica que a view materializada não é elegível para uso pelo
mecanismo de query rewrite. Porém poderá ser refrescada.
NOTAS:
A Oracle recomenda que qualifiquemos cada uma das tabela da cláusula FROM com o
schema onde esta se encontra.
RESTRIÇÕES:
Views materializada com um Join ou com múltiplas Master Tables e um Group By não
podem selecionar dados de uma Index-Organized Table.
Se uma subquery faz referência a uma tabela temporária, não podemos criar uma log
para esta view materializada e não podemos especificar a cláusula Query Rewrite.
Não pode fazer referência a colunas do tipo Raw, Long Raw ou Refs (objetos).
A query deve ser composta de um único bloco, ou seja, não pode conter funções de
conjunto (Union, Minus, etc). A view materializada, no entanto, pode conter mais de
um bloco (Selects na cláusula From, Subselects na cláusula Where e Having).
Somente tabelas detalhe locais (ou views) podem ser usadas na query ou na definição de
uma view materializada.
Para que um texto de SQL possa ser candidato a Rewrite, as seguintes restrições são
aplicáveis:
A lista de objetos na cláusula FROM não pode conter múltiplas ocorrências da mesma
tabela ou view.
As listas das cláusulas SELECT e GROUP BY, se presentes, devem ser as mesmas na
query e na view materializada e devem conter apenas as colunas, isto é, não são
permitidas expressões nas colunas.
A cláusula WHERE deve conter somente Inner ou Outer Eqüijoins, que possam ser
conectados por ANDs. Ou seja, Ors e seleções em tabelas individuais não são
permitidas na cláusula Where.
Não definir qualquer Nested Subquery ou Inline Views (Select na cláusula From).
Se especificarmos a cláusula GROUP BY, esta não deve conter funções de PL/SQL ou
expressões e, devemos especificar todas as colunas da cláusula Group By na lista de
seleção.
Todas as relações na lista FROM devem ser tabelas e elas devem ser distintas após
Synonym Resolution (ou seja, não fazer referência mais de uma vez à mesma tabela).
Se especificarmos Outer Joins para uma view materializada complexa, devemos listar
ambos os lados do Outer Join na lista da cláusula GROUP BY.
Devemos nos assegurar que cada expressão de agregação utilize uma função de
agregação com parâmetros simples (isto é não utilize uma expressão de agregação
dentro de outra).
Warehouse Refresh
JOB_QUEUE_PROCESSES – Este parâmetro indica quantos processos background
(SNP) podem ser executados concomitantemente. Indiretamente determinará quantas
views materializadas podem ser refrescadas concorrentemente.
UTL_FILE_DIR – Determina o diretório onde o Refresh Log será gravado. Se não for
especificado, nenhum log será gerado.
Query Rewrite
Exemplos
O comando a seguir cria uma view materializada de nome MV_POR_VENDEDOR que
calcula as vendas por vendedor.
COMMIT;
EXECUTE DBMS_MVIEW.REFRESH('MV_POR_VENDEDOR', 'C', NULL, TRUE,
FALSE, 1, 0, 0, TRUE)
SELECT COUNT(*) FROM MV_POR_VENDEDOR;
A view materializada não contém qualquer dado porque foi determinado que o método
de construção é DEFERRED.
Quando ela for refrescada, será realizado um Refresh completo. Após esta etapa, esta
view materializada poderá ser usada com Query Rewrite.
Desta forma não haverá Refresh até que uma requisição manual seja informada.
A view materializada é preenchida imediatamente com dados porque o método é
IMMEDIATE e ela fica disponível para ser usada pelo mecanismo de Query Rewrite.
A view poderá conter uma ou mais funções de agregação (SUM, AVG, VARIANCE,
etc) e a cláusula GROUP BY. As funções de agregação poderão envolver expressões
em colunas, tais como SUM (a*b).
Se esta view materializada for refrescada de forma incremental (FAST), ela deverá
incluir uma tabela de log associada à tabela detalhe que contenha a cláusula
INCLUDING NEW VALUES e contenha todas as colunas referenciadas na definição
da query da view materializada.
Deve existir um Materialized View Log para cada tabela detalhe envolvida.
Se houverem Outer Joins, deve existir uma constraint de unicidade sobre as colunas
Join da Inner Table.
Se alguma das restrições for violada, a view materializada deve ser criada com a opção
de Refresh Force. Se uma das tabelas não atende aos critérios, mas as outras atendem, a
view materializada poderá ser refrescada de forma incremental, mas somente para as
tabelas para as quais todos os critérios são satisfeitos.
Para Data Warehouses utilizando um esquema Star se houver pouco espaço, podemos
incluir o rowid apenas da tabela Fato uma vez que esta tabela será mais freqüentemente
atualizada. Neste caso podemos especificar a opção FORCE para a criação da view
materializada.
O log da view materializada deve conter o rowid da master table. Não é necessária a
adição de outras colunas.
Refresh do tipo incremental (FAST) é possível para views materializadas contendo joins
após qualquer tipo de operação de DML para as tabelas básicas (carga direta ou
INSERT, UPDATE ou DELETE).
Uma view materializada contendo somente joins pode ser definida com REFRESH ON
COMMIT ou ON DEMAND. Após um refresh ON COMMIT devemos avaliar os
arquivos de alerta e trace do banco de dados para verificar se ocorreu algum erro
durante a operação.
Para obtermos uma melhor performance durante a operação de Refresh, é recomendado
que o usuário crie índices nas colunas da view materializada que armazenam os rowids
da tabela Fato.
Apesar desta solução possuir as vantagens relativas à performance trazida pelas views
materializadas não torna possível a re-escrita do SQL das aplicações e nem tem a
habilidade de atualização Fast.
Em função desta situação e, uma vez que as views materializadas podem ser
extremamente grandes (uma reconstrução poderia ser muito custosa), o Oracle permite
que registremos uma tabela como view materializada usando a cláusula PREBUILT
TABLE.
Com esta solução a view materializada poderá ser utilizada pelos mecanismos de
Refresh e Query Rewrite (para que ela seja utilizada pelo mecanismo de Query Rewrite,
o parâmetro QUERY_REWRITE_INTEGRITY devem receber, pelo menos, o nível
TRUSTED).
Quando efetuamos um DROP em uma view materializada que tenha sido criada baseada
em uma tabela pré-existente, apenas a view é removida, a tabela continua criada no
banco de dados.
A tabela, no entanto, mantém sua identidade como tabela e pode conter colunas que não
estão referenciadas na definição da query da view materializada, chamadas de
unmanaged columns.
Se houver inserção de linhas durante uma operação de refresh, cada coluna não
correspondente (unmanaged columns) de uma linha é preenchida com seu valor default,
desta forma, estas colunas não podem ter sido definidas com a restrição NOT NULL, a
menos que elas possuam valor default especificado.
Neste caso a view materializada será criada com informações restritas ao exato período
informado, o que traz restrições à utilização da view.
Para contornarmos este problema, o particionamento pode ser feito de tal forma que a
view materializada não contenha a restrição de data, tornando seu uso mais amplo pelas
aplicações.
A operação de Query, por outro lado, pode necessitar de acesso a qualquer subconjunto
das colunas chaves da view materializada e pode necessitar de Joins e agregações sobre
um subconjunto destas colunas, conseqüentemente, a pesquisa será mais eficiente se
houverem índices bitmap simples (de uma única coluna) definidos em cada chave da
view materializada.
Uma opção para indexação é a definição de um índice local do tipo unique que contenha
todas as chaves da view materializada e um índice bitmap para cada coluna individual
que seja chave da view se houver espaço em disco e o tempo de Refresh permitir.
No caso da view materializada conter joins somente, se a opção de Fast Refresh estiver
habilitada, é altamente recomendado que os índices sejam criados nas colunas que
contenhas os rowids para incremento da performance da operação de Refresh.
Esta rotina produz uma lista das views materializadas que o Oracle recomenda baseado
em informações estatísticas e no uso do banco de dados. Este pacote somente
recomenda views materializadas que tenham agregações em múltiplas tabelas.