Tem sim alguns casos onde um cursor em cima da GTT pode ser ** muito
** mais eficiente do que um cursor direto em cima da tabela real,
notadamente em sistemas DW/batches, principalmente porque as GTT (por
serem mono-usuárias) quase não geram redo nem undo, e o caso
(principalmente do undo/rollback) é que tipicamente I/O de undo é
feito bloco-a-bloco, é difícil vc conseguir um bom e suculento full
scan em blocos de undo. Algumas situações onde isso pode ser
significativo poderiam ser :
a) imagine que vc que fazer um SELECT numa tabela
(TAB_FATOS,digamos) que é gigantesca. Imagine que está havendo,
concorrentemente a esse SELECT desejado, DMLs na TAB_FATOS,
justamente nos registros que vc quer ler. Nessa situação, o cursor em
cima da tabela real *** vai *** fazer um montão de I/Os em blocos de
undo, pra manter a consistência de leitura e o pior, enquanto o
cursor não for fechado esses blocos de undo ficam marcados como em
uso- aí enquanto isso entram mais interessados nesses dados (talvez
outras instâncias do programa) , aí é mais e mais carga em cima dos
discos de undo... Já se vc primeiro fez um INSERT /*+ APPEND */ into
TAB_FATOS_GTT (select WHRE caras que eu quero da TAB_FATOS) ,
uma vez completado o INSERT os discos de redo *** NÂO VÃO *** mais
ser tocados, isso pode sim significar uma redução de carga brutal
E inda melhor, o banco usa área temp só na fase que está
ordenando/montando tabelas de hash : tanto é assim que se vc pedir um
glance/iostat ou coisa que o valha dos seus discos, num sistema
batch/dw, vc vai ver que coisa de 80% do I/O é nos datafiles
(fazendo os scans da vida), então o sub-sistema de I/O que atende a
tablespace TEMP muitas vezes está mais "folgado" num banco desse
tipo, o que TAMBÈM ajuda a acelerar as GTTs, que como vc sabe
necessariamente residem em temp tablespaces.
b) DMLs, aí é mais natural ainda. Imagine que vc tem uma rotina longa
e complexa, onde vc precisa extrair uma parte dos dados duma tabela
enorme e muito acessada, ir fazendo cálculos e UPDATEs e DMLs :
logicamente se vc fizer isso direto na tabela "normal", quente, vc
VAI gerar um montão de undo e de redo, já se vc copiasse os dados
pruma GTT e vfizesse DML nela, por definição numa GTT a quantidade de
undo/redo gerado é praticamente zero.
num dos sistemas que administro o banco, é DW com dados de ligações
telefônicas, usei as GTTs em situações do tipo das citadas e obtive
melhorias significativas, e isso apesar dos discos do meu servidor
serem totalmente RAID 0+1, até o undo/redo.
[]s
Chiappa
--- Em oracle_br@yahoogrupos.com.br, "Ivan Ricardo Schuster"
<[EMAIL PROTECTED]> escreveu
> Chiappa,
>
> já que você entrou no mérito da questão, não vejo uma tabela
temporária como
> algo mais eficiente que um cursor. É?
>
>
> -Mensagem original-
> De: oracle_br@yahoogrupos.com.br
[mailto:[EMAIL PROTECTED] Em
> nome de jlchiappa
> Enviada em: segunda-feira, 8 de agosto de 2005 13:17
> Para: oracle_br@yahoogrupos.com.br
> Assunto: [oracle_br] Re: Tabelas temporárias
>
> A idéia da GTT é poder se manter os dados num local temporário pra
> eventual processamento posterior : a estrutura permanece MAS os
dados
> vão embora, pra numa próxima execução entrarem dados novos, é isso.
> Ocorre que, no bd Oracle, já que vc tem construtos como :
>
>
> select campo, (select outro campo from tabelaoutra)
> from tabelaoriginal
>
>
> ou ainda :
>
>
> select a.nnn, b. from
> tabela1 a,
> (select nnn from tabela2) b
>
> ou ainda :
>
> WITH (selectqquer)
> select outro
> where condições que vem da cláusula with
>
>
> a necessidade de se criar algo temporário pra se resolver um
select
> é EXTREMAMENTE reduzida, então a GTT no Oracle serve muito mais pra
> guardar resultados/processamentos de cursores, que SÂO pré-
definidos
> preferencialmente (SQL dinâmico é suportado mas não recomendado),
> então a GTT preferencialmente deve ser pré-definida, também, já que
> vc CONHECE a estrutura do cursor, é isso
>
> []s
>
> Chiappa
>
> --- Em oracle_br@yahoogrupos.com.br, "mverdade" <[EMAIL PROTECTED]>
> escreveu
> > Boa tarde,
> >
> > Se a tabela temporária não é excluída(dropada) ao término da
> sessão
> > para que serve esse tipo de tabela? A idéia da temporária é
> justamente
> > essa facilidade, ou seja, o banco de dados dropá-la
automaticamente.
> > Por acaso existe alguma sintaxe na criação das GTT para que o
> banco
> > as "drop" automaticamente?
>
>
>
>
>
>
__
>
> Histórico: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
> Falar co