Thursday, March 19, 2009

Resposta a uma questão sobre Materialized view e External Table

Olá,

Estes dias surgiu um pergunta no grupo de discussão Oracle_Br,uma pergunta de uma pessoa que estava estudando sobre Performance Tunning.
A questão era sobre criar uma Materialized View sobre uma External Table.
Não sei porque e nem como surgiu esta questão ,mas resolvi fazer um teste para ver no que dava.Encontrei um post no forum internacional em que Donald Burleson cita que nunca fez isso,mas afirmava que o que poderia dar problema no ponto de vista de arquitertura do Oracle é a atualização(refresh) desta MVIEW.
O unico ponto interessante que achei nesta questão seria o fato de que se pudesse gerar um arquivo externo novo,digamos que seja uma arquivo diario e que a MVIEW automaticamente fizesse o refresh dos dados.

Abaixo os codigos da criação da external table e da materialized view que enviei para o forum para exemplo:

Segue os testes que acabei de fazer a respeito da questão.

Está mal formatado porque eu copiei e colei,mas dá para seguir a logica e os comandos

- Criei o arquivo .txt

[oracle@TAHITI dir_work]$ vi test_ext_t
[oracle@TAHITI dir_work]$ ls

- Criei o diretorio

SQL> create directory dir_work as '/u02/oradata/lab/dir_work'
2 ;

Directory created.

-Concedi as permissões
SQL> grant read,write on directory dir_work to public;

Grant succeeded.

Criei a tabela externa com base no arquivo e no diretorio
SQL> create table test_ext
2 (name varchar2(15),
3 sobrenome varchar2(15),
4 idade number(2))
5 organization external
6 (default directory dir_work
7 access parameters
8 ( records delimited by newline
fields terminated by '|'
9 10 )
11 location('test_ext_t.txt')
12 );

Table created.

-Alterei a tabela porque troquei as palavras chaves rs
SQL> alter table test_ext
2 access parameters
3 ( records delimited by newline
4 fields terminated by '|'
5 );

Table altered.

-Alterei o nome do arquivo,senão.. "don't work"
[oracle@TAHITI dir_work]$ mv text_ext_t.txt test_ext_t.txt

[oracle@TAHITI dir_work]$ exit
exit

- Testei uma consulta na rabela externa
SQL> select * from test_ext;

NAME SOBRENOME IDADE
--------------- --------------- ----------
julio correa 22

SQL>

Criei uma mview de teste
SQL> create materialized view test_mv_on_ext
2 build immediate
3 as select * from test_ext;

Materialized view created.

-Testei a query na mview criada anteriormente
SQL>
SQL> select * from test_mv_on_ext;

NAME SOBRENOME IDADE
--------------- --------------- ----------
julio correa 22

-Outro teste de criação de mview

-Tentativa de refresh na mview
SQL> begin
2 dbms_refresh('test_mv_on_ext2');
3 end;
4

Esta ultima ficou executando,mas não me retornou nada,nem mesmo errro.

O problema deve estarna hora do refresh.Por se tratar de um arquivo,caso você gere outro arquivo com o mesmo nome no diretorio, o Oracle não saberá disto.
Não sei se isto funciona,nunca fiz.Mais vou tentar um refresh ok?

Abs,

Julio Cesar Correa

No comments: