Márcia, uma correção : na verdade não é que "não há troca", a "troca" 
que vc menciona (context switch) SEMPRE existe - veja vc, já que SQL 
e PL/SQL são linguagens ABSOLUTAMENTE e RADICALMENTE diferentes, 
então o banco tem que ter dois engines - ie, dois "motores", 
dois "mecanismos executores executores" diferentes, então se num 
mesmo programa vc mescla SQL e PL/SQL, fatalmente o banco VAI ter que 
fazer uma "pausa" num dos engines, acionar o outro , depois 
retornar... O que as técnicas de BULK COLLECTING do PL/SQL permitem é 
que, ao invés do PL/SQL ter que acionar o SQL engine n vezes ele 
envia um array con N linhas a processar, e esse array será processado 
pelo SQL engine de uma vez, diminuindo em muito o context switching 
(ou até em tese deixando ele ser um só), mas que ele VAI continuar 
existindo isso é uma decorrência natural da implementação de PL/SQL 
como um elemento separado do SQL, o PL/SQL simplesmente NÃO SABE como 
processar SQL, e nem é essa a função dele, ele TERÁ que chamar o SQL 
engine - http://asktom.oracle.com/pls/ask/f?
p=4950:8:::::F4950_P8_DISPLAYID:60122715103602 diz exatamente isso. 

Daniel, seguinte : como os comandos/técnicas mencionados (BULK, 
COLLECT, FORALL, etc) são comandos PL/SQL, é no manual de PL/SQL que 
vc os encontrará e estudará, confere ? Em especial o cap. 5 - 'PL/SQL 
Collections and Records' no manual "PL/SQL User's Guide and 
Reference" os especificam em detalhes. Para mais exemplos e estudos 
de casos, procurando pelas citadas palavras-chaves em 
http://asktom.oracle.com vc achará os + DIVERSOS casos e artigos, 
como por exemplo http://asktom.oracle.com/pls/ask/f?
p=4950:8:::::F4950_P8_DISPLAYID:8784259916366 .

===>>> Observo que , porém,  que de forma alguma PL/SQL é a 
melhor "saída" , PL/SQL não é de forma alguma a primeira opção 
pensando-se em performance para manipulação de grande volume de 
dados : não só há questões de context switch, (tal como dito nos 
links que citei), como há também a questão do CBO, que é um dos 
pontos que vou levantar no enpo-2006 : ele (CBO) sabe otimizar SQLs e 
** não ** PL/SQLs, assim se vc tiver uma rotina tipo :

...
BEGIN
  for r in (select .....) loop
    ...
    faz alguma coisa
    ...
    select nnn from tabela where chave = r.campo-chave;
    ...
    
    
==> no caso acima, embora logicamente falando os dois SQLs estão 
relacionados,  o CBO é *** INCAPAZ ** de transformar os dois SELECTs 
num JOIN único, então os recursos (que ás vezes são BRUTALMENTE 
eficientes) dum JOIN, tal como hashing, NÃO serão usados neste 
processamento, ele será processado (logicamente falando) como un 
nested loop, ie, pega a primeira linha, busca na tabela interna o 
registro correspondente, pega a segunda linha, busca o registro 
correspondnete, aí vai, vai, vai, até o fim do SELECT no for....
 Então a idéia para grandes volumes é : num banco otimizado (ie, com 
área de rollback/undo suficientes, com o melhor armazenamento 
possível - com GTTs e NOLOGGING onde puder, com Paralelismo, com o 
SQL sendo executado LOCALMENTE no servidor Oracle, com a qtdade de 
linhas que a linguagem SQL processa de uma só vez otimizada de acordo 
com a tool/linguagem usada, etc, etc, etc) tentar fazer TODO o 
processamento em um comandos SQLs único : inclusive as novas features 
da linguagem SQL, como Analytics, cláusula WITH, etc, possibilitam 
que em MUITOS casos onde isso não era possível hoje em dia se possa 
fazer... Caso REALMENTE por qquer motivo não foi possível fazer , aí 
sim usar PL/SQL, aí sim com BULK.
 
 []s
 
  Chiappa
  
--- Em oracle_br@yahoogrupos.com.br, "Marcia Bussolaro" <[EMAIL PROTECTED]> 
escreveu
>
> Oi,
> 
>   São comandos para trabalhar com grandes massas de dados, como 
você mencionou. A grande vantagem é que não há troca entre as 
máquinas PL/SQL e SQL reduzindo bastante o tempo de execução. O 
código fica bem mais complexo e existem algumas limitações dependendo 
da versão. Existem vários links na internet sobre o assunto. Você 
pode começar por esse que indica como passar de cursor para bulk 
collect e forall.
> 
> http://www.oracle.com/technology/oramag/oracle/04-
jan/o14tech_plsql.html;
> 
> []
> Marcia
> 
> 
> On Mon, 2 Oct 2006 17:42:54 +0000 (GMT), Daniel Mello 
<[EMAIL PROTECTED]> escreveu:
> 
> > De: Daniel Mello <[EMAIL PROTECTED]>
> > Data: Mon, 2 Oct 2006 17:42:54 +0000 (GMT)
> > Para: oracle_br <oracle_br@yahoogrupos.com.br>
> > Assunto: [oracle_br] Collections
> > 
> > 
> > Pessoal, já houvi falar de algumas saídas para performance de 
grandes massas de dados através de collections (bulck collect, 
forall), a final o que são e onde posso encontrar mais material sobre 
as mesmas?
> > 
> > Obrigado.
> > 
> > 
> > ______________________
> > Daniel Mello
> > [EMAIL PROTECTED]
> >  __________________________________________________
> > Fale com seus amigos  de graça com o novo Yahoo! Messenger 
> > http://br.messenger.yahoo.com/ 
> > 
> > [As partes desta mensagem que não continham texto foram removidas]
> > 
> > 
> >
>






--------------------------------------------------------------------------------------------------------------------------
Atenção! As mensagens deste grupo são de acesso público e de inteira 
responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--------------------------------------------------------------------------------------------------------------------------__________________________________________________________________

OPORTUNIDADES DE TRABALHO, VAGAS, EMPREGOS PARA PROFISSIONAIS ORACLE VISITE: 
http://www.oraclebr.com.br/
__________________________________________________________________
Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine  
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

 



Responder a