RES: [oracle_br] Re: Tabelas temporárias

2005-08-08 Por tôpico jlchiappa
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

RES: [oracle_br] Re: Tabelas temporárias

2005-08-08 Por tôpico Ivan Ricardo Schuster
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 com os Moderadores:([EMAIL PROTECTED])
Dorian Anderson Soutto - Fernanda Damous - Alisson Aguiar 
__ 
Links do Yahoo! Grupos




 





__

Histórico: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
Falar com os Moderadores:([EMAIL PROTECTED])
Dorian Anderson Soutto - Fernanda Damous - Alisson Aguiar 
__ 
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/oracle_br/

<*> Para sair deste grupo, envie um e-mail para:
[EMAIL PROTECTED]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html

 




[oracle_br] Re: Tabelas temporárias

2005-08-08 Por tôpico jlchiappa
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 com os Moderadores:([EMAIL PROTECTED])
Dorian Anderson Soutto - Fernanda Damous - Alisson Aguiar 
__ 
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/oracle_br/

<*> Para sair deste grupo, envie um e-mail para:
[EMAIL PROTECTED]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html