Você está na página 1de 13

Pgina 1 PL / SQL Enhancements em Banco de Dados Oracle 11 g Um Oracle Livro Branco Novembro 2007 Pgina 2 PL / SQL Melhorias no Oracle

Database 11 g 12-novembro-2007 www.oracle.com/technology/tech/pl_sql/pdf/plsql_new_in_11gr1.pdf NOTA O seguinte a finalidade de descrever nossa direo geral dos produtos. pretende-se apenas para fins informativos, e no pode ser incorporado a nenhum contrato. Ele no um compromisso de entrega de qualquer material, cdigo ou funcionalidade, e deve no pode ser usado na tomada de decises de compra. O desenvolvimento de liberao, e tempo dos recursos ou funcionalidades descritos para os produtos da Oracle permanece a critrio exclusivo da Oracle. Pgina 3 PL / SQL Melhorias no Oracle Database 11 g pgina 1 12-novembro-2007 www.oracle.com/technology/tech/pl_sql/pdf/plsql_new_in_11gr1.pdf PL / SQL Melhorias no Oracle Database 11 g RESUMO Oracle Database 11 g traz PL / SQL melhorias nas seguintes categorias: transparente e "controlado boto" melhorias de desempenho; novos recursos de linguagem que voc usa em seus programas para obter melhor desempenho; novos recursos de linguagem que trazem funcionalidade que voc mais cedo no poderia alcanar, ou poderia alcanar apenas com solues complexos; novos recursos de linguagem que melhoram a usabilidade de programao em PL / SQL. Eu fiz uma seleo unashamedly pessoais de alguns desses recursos para descrever em detalhes justo neste papel. Eu usei dois critrios: o meu instinto de classificao baseada na de acordo com sua importncia relativa para os clientes, e meu julgamento de se os leitores puderam apreciar algum fundo que improvvel encontrar em outras contas. Para completar, vou terminar por apenas listando as outras caractersticas e dando uma conta do esqueleto de cada um. Pgina 4 PL / SQL Melhorias no Oracle Database 11 g pgina 2 12-novembro-2007 www.oracle.com/technology/tech/pl_sql/pdf/plsql_new_in_11gr1.pdf MAIS SOBRE O sistema de classificao Voc pode notar que este esquema de classificao para a maioria dos trabalhos anteriores Banco de Dados releases Oracle. Oracle Database 10 g introduziu um novo compilador de otimizao e um recm- sintonizado ambiente de execuo. No poderia haver melhor exemplo de uma totalmente melhoria de desempenho transparente, tudo que voc tem a fazer upgrade (que processo necessita recompilao das existentes PL / SQL objetos) eo tempo execuo de seu cdigo PL / SQL (no contando o tempo passar fazendo SQL) cortado em metade. Oracle9i Database i introduzido compilao nativa. Ele exigia alguns DBA set- up - mas do ponto de vista do desenvolvedor, nenhuma alterao de cdigo so necessrias. Em vez disso, voc tinha acabado de recompilar unidades escolhidas mencionar um novo PL / SQL compilador parmetro (= Plsql_Code_Type nativo). Isso o que quero dizer com knob- controlada. A verso do banco de dados que no mais suportada

introduzido sintaxe especial para fazendo SQL operaes de seleo e as operaes DML (insert, delete, etc) em granel. Esses recursos de linguagem aumentar o desempenho reduzindo o nmero de mudanas de contexto entre PL / SQL 's ambiente de execuo e de SQL execuo de meio ambiente. No entanto, os desenvolvedores primeiro teve que aprender a nova sintaxe e compreender os casos de uso onde estes recursos de linguagem iria entregar benefcio, ento (para as unidades j existentes), tiveram de fazer um caso de renovao cdigo projetos. Isto o que quero dizer com um recurso de linguagem desempenho: seu benefcio certamente no trouxe transparente. O exemplo cannico de um recurso de linguagem funcionalidade (de novo, introduzido para h muito tempo que eu no preciso dizer quando) o pacote DBMS_SQL. Clientes simplesmente no tm mecanismos que lhes permitam ampliar PL / SQL (antes DBMS_SQL foi introduzido) para permitir que ele para executar instrues SQL cujo texto no conhecido at a execuo (ou instrues SQL cujo texto voc sabe a compile- tempo, mas que no so suportados pelo SQL esttico). Estritamente falando, uma Oracle-fornecidos pacote no uma caracterstica da linguagem PL / SQL. No entanto, quando o pacote expe subprogramas que implementaes wrap que so programados diretamente no cdigo do executvel Oracle (e no poderia ser implementado em PL / SQL sozinho), a distino discutvel. Oracle9i Database i introduziu a expresso caso (em ambos os SQL e PL / SQL) ea declarao do caso (em PL / SQL). Esses recursos de linguagem no permitem desenvolvedores programar qualquer coisa que eles no podiam escrever sem a nova sintaxe. Mas as construes permitem que os desenvolvedores a pensar mais claramente sobre o cdigo que est prestes a escrever - e, mais tarde, a compreender mais facilmente as suas prprias ou de outros cdigo dos desenvolvedores que usa essas construes. Isto, naturalmente, aumenta o probabilidade de o cdigo estar correto. Estes so exemplos de recursos de usabilidade. By the way, novos recursos nem sempre perfeitamente na ranhura este esquema. Nativo SQL dinmico (em comparao com o DBMS_SQL prexistentes) traz um desempenho benefcio, um benefcio funcionalidade (que permite retornar um cursor ref para o cliente de banco de dados), e um benefcio de usabilidade ( imensamente mais compacto do que o equivalente DBMS_SQL cdigo). Pgina 5 PL / SQL Melhorias no Oracle Database 11 g pgina 3 12-novembro-2007 www.oracle.com/technology/tech/pl_sql/pdf/plsql_new_in_11gr1.pdf MELHORIA DO DESEMPENHO TRANSPARENTE: Compilao nativa REAIS Oracle9i Database i introduzido PL / SQL compilao nativa; Oracle Database 10 g trouxe o armazenamento das DLLs nativas no catlogo, e Banco de Dados Oracle 11 g traz completa out-of-the-box transparncia ao recurso. Mais sobre isso anon. Mas, primeiro, eu acho que vai ajudar a lembr-lo que a compilao PL / SQL nativa (e no ), e como o regime anterior (que informalmente chamada C-nativo) funcionou. PL / SQL notoriamente uma linguagem interpretada. Isso no significa que a fonte texto processado declarao declarao em tempo de execuo (como nos velhos tempos com BASIC), mas sim, PL / SQL compilado na forma ordinria em cdigo de mquina chamado de M-Code. No entanto, a mquina de destino virtual: a PVM chamada - para PL / SQL da mquina virtual. (Desta forma, como Java com sua JVM.) O PVM implementado como um conjunto de sub-rotinas no executvel Oracle e em tempo de execuo o M-Code escaneado pela outra sub-rotina tal. A verificao detecta cada opcode sucessivas e seus operandos e, em seguida, chama a subrotina que implementa esta opcode com os argumentos

apropriados real. Claro, isso digitalizao de tempo de execuo do Cdigo M-leva alguns recursos e exatamente, e apenas, isso que a compilao PL / SQL nativa melhora. Quando voc escolhe Plsql_Code_Type = nativo, a compilao de sua unidade segue exatamente o mesmo caminho como quando voc escolhe interpretado at o estgio em que um pr-cursor do o cdigo de mquina de destino est disponvel. Em seguida, o ramo caminhos: em modo interpretado, o M-Code produzido e no modo nativo, um DLL especfico da plataforma produzido, que em tempo de execuo chama exatamente o sub-rotinas PVM mesmo com o mesmos argumentos que teria sido chamado por digitalizar o M-Code. (Vou usar DLL como uma abreviao genrica para biblioteca, compartilhveis dinamicamente linkable; o arquivo tipo em sistemas Windows passa a ser. dll e em sistemas Unix .-lo.) A diferena que o esforo de digitalizao foi movido de tempo de execuo para compilar tempo e, claro, isso melhora o desempenho do runtime. Significativamente, pois exatamente a mesma sub-rotinas PVM so chamados com exatamente os mesmos argumentos em ambos interpretados e modos de natal, o modo nativo garantido para ter exatamente o mesma semntica de modo interpretado. Isso significa que toda uma classe de questo que eu periodicamente ouvir (por exemplo, " PL / SQL compilao nativa compatvel com ? modo de servidor compartilhado ") tem uma resposta simples genrica:" Sim, porque ambos interpretados e modos de compilao nativa fazer exatamente a mesma coisa em tempo de execuo. " Ento ... onde que C entram em cena? Claramente, a compilao PL / SQL nativa tem que trabalhar em uma variedade de plataformas e isso implica um esforo de portar. Em Oracle9i Database i e no Oracle Database 10 g, que "terceirizado" o esforo dos ficando o executvel do Oracle para transformar o cdigo de mquina de pr-cursor em um texto de origem C equivalente. Em seguida, ele escreveu isso como um arquivo de sistema operacional e invocado o compilador C e linker para essa plataforma para gerar a necessria especfico da plataforma DLL. Ns usamos essa mesma abordagem, tanto em Banco de Dados Oracle9 i e em Banco de Dados Oracle 10 g, a nica diferena foi que no primeiro, o lugar cannico de armazenamento foi o sistema de arquivos (o que causou algumas dificuldades com RAC e com backup), mas no segundo, o lugar cannico de armazenamento foi o catlogo. No entanto, mesmo neste ltimo, as DLLs tinha que ser materializado na sistema de arquivos em tempo de compilao e em tempo de execuo porque o sistema operacional utilitrios necessrios contamos com isso - da Plsql_Native_Library_Dir e Plsql_Native_Library_Subdir_Count parmetros de inicializao. Aviso prvio, a propsito, que no h nenhum significado em C, por si s, era apenas um 3GL conveniente em que o Pgina 6 PL / SQL Melhorias no Oracle Database 11 g Pgina 4 12-novembro-2007 www.oracle.com/technology/tech/pl_sql/pdf/plsql_new_in_11gr1.pdf desenvolvedores da Oracle Corporation eram fluentes e para o qual foi um compilador prontamente disponvel em todas as plataformas de interesse. Este esquema funcionou perfeitamente bem do ponto de vista tcnico, mas sofria de alguns inconvenientes usabilidade grave: a religio alguns clientes simplesmente probe a instalao de um compilador C em uma mquina de produo (e voc no pode discutir com isso); outros clientes estavam relutantes em pagar por licenas de um compilador C (e para alguma razo, desconfiava gcc) e outros clientes encontraram as tarefas de configurao DBA (Instalar o compilador C, verificando o arquivo no diretrio spnc_commands plsql Incio em Oracle, e definindo o Plsql_Native_Library_Dir e Parmetros

Plsql_Native_Library_Subdir_Count) demasiado assustadora. O resultado lquido foi que a compilao PL / SQL nativo, que proporciona um desempenho inquestionvel benefcio para qualquer esforo de desenvolvimento, tem sido muito pouco utilizado. By the way, as pessoas muitas vezes perguntam: "Ser que compilar o pacote Oracle fornecido nativamente melhorar a sua performance? "Isso ajuda a saber, primeiro, que a maioria destes so implementado diretamente no executvel Oracle (que por acaso escrito em C) e so apenas expostos por meio de PL / SQL wrappers (como foi mencionado em conexo com DBMS_SQL). Em outras palavras, eles j so mais do que nativo nativo (se voc ver o que eu quero dizer: no h PVM na foto) e por isso ajuda apenas marginalmente para compilar os invlucros nativamente. (No entanto, nunca prejudica a fazer isso.) O objetivo do "real nativo" projeto de Banco de Dados Oracle 11 g foi, portanto, remover a dependncia de um compilador C eo vinculador do sistema operacional e carregador utilitrios programando o executvel do Oracle para transformar o cdigo de mquina- pr-cursor diretamente para a necessria plataforma de cdigo especfico da mquina. (Claro, essa meta implcita morder a bala e fazer a tarefa para cada plataforma de interesse.) Um objetivo secundrio foi acelerar o tempo de compilao. E um objetivo tercirio no era para prejudicar o desempenho do runtime. O projeto foi um sucesso completo: agora a DLL PL / SQL nativa nunca se materializa no sistema de arquivos e por isso a necessidade para a gesto do Plsql_Native_Library_Dir e Plsql_Native_Library_Subdir_Count parmetros eo contedo dos diretrios que denotava desaparece. Velocidade de compilao aumentou cerca de 2x. E, longe de ser prejudicado, velocidade de execuo tem aumentado visivelmente. PL / SQL compilao nativa agora s tem um boto: Plsql_Code_Type. O DBA no tem deveres de configurao e por unidade deciso de compilao para uma DLL nativa ou M-Code podem ser feitas pelo desenvolvedor seguro no conhecimento que o escolha ser automaticamente honrado em qualquer local de instalao. Pgina 7 PL / SQL Melhorias no Oracle Database 11 g pgina 5 12-novembro-2007 www.oracle.com/technology/tech/pl_sql/pdf/plsql_new_in_11gr1.pdf MELHORIA DO DESEMPENHO TRANSPARENTE: refinadas O rastreamento de dependncia Desde a aurora dos tempos, PL / SQL programadores tm desfrutado de um benefcio que (se que programa somente em PL / SQL) que pode at no ter percebido que eles esto recebendo: eles no tem que pensar sobre o equivalente a um arquivo de fazer. Quando um sistema de PL / SQL unidades e outros objetos de banco (tabelas, vises, seqncias, e afins) fazem referncias mtuas, suficiente apenas para deixar o cdigo fonte expressar essas relacionamentos e para criar as unidades em qualquer ordem. Desde que o cdigo-fonte livre de erros, ento tudo que voc precisa fazer criar todos os objetos e, em seguida, de referncia qualquer um de interesse. No importa que, durante a criao, alguns acabam invlido porque voc escolheu um fim infeliz. Oracle Database acessa o metadados de dependncia que foi criado como um efeito colateral da compilao e compila automaticamente invlida qualquer unidade em que a referida unidade escolhida (Recursivamente) depende. Mais tarde, se voc alterar qualquer unidade, em seguida, todos os seus dependentes so (Recursivamente) invalidada e, na prxima tentativa de qualquer unidade de referncia, o mesmo implcita recursiva recompilao acontece novamente. Em outras palavras, Oracle Database mantm uma invariante: voc no pode fazer referncia a um sucesso objeto a menos que ele e todos os

objetos que recursivamente referncias vlido e todos os objetos foi compilado com as verses mais recentes de todos os objetos que ele referncias. Ele consegue isso atravs de invalidao e recompilao implcita de invlidos objetos: ou todas as compilaes, tais so livres de erros, e sua referncia objeto escolhido calmamente bem-sucedida; ou haja pelo menos um erro de compilao, o seu objeto escolhido acaba invlida, e voc ter um erro de execuo limpo. Em outras palavras, Banco de Dados Oracle garante que voc no pode comear porque um comportamento misterioso determinado objeto invoca uma verso obsoleta de um dos objetos dos quais ele depende. (Isto libera voc de considerar toda uma classe de causas potenciais durante um exerccio de depurao.) Este "automtico fazer" ambiente claramente depende criticamente o fato de que quando um objeto criado ou modificado, a lista de objetos do qual ele depende mantido at data. Devido a esta misso criticidade, Banco de Dados Oracle, embora Lanamento 10.2, usou uma abordagem que, obviamente, garante exatido - mas, ao a despesa de otimizaes possveis: informaes de dependncia foi gravado no a granularidade do objeto inteiro. Assim, se voc fez uma alterao em um existente objeto que voc poderia a razo no faria com que voc tem que alterar qualquer dos seus objetos dependentes para refletir esta mudana, voc, no entanto, observaram que essas dependentes foram invalidados. (O exemplo mais bvio de um tal "inocentes" a mudana para adicionar um novo subprograma - o que no adiciona uma sobrecarga nova para um subprograma existentes -. pacote com uma especificao existente) No so apenas os dependentes imediata desnecessariamente (do ponto de vista "lgico") invalidado - Mas tambm a cascata invalidaes. O resultado lquido, enquanto correo garantida, consumir recursos de computao significativa quando uma instalados aplicao corrigido fazendo compilaes que poderia, em princpio, ser evitado - no Por outras palavras, para estender o tempo para a queda prevista da aplicao. Oracle Database 11 g resolve este por informaes de gravao no de dependncia no granularidade de todo o objeto, mas sim na granularidade do elemento dentro do objeto. Por exemplo, se p1 procedimento chama p2 procedimento no pacote Pkg, ento os metadados para p1 vai incluir o fato de a dependncia em cima de p2 (Com uma lista especfica de parmetros formais com seus tipos de dados e modos) dentro Pkg pacote. Isso significa que, agora, a adio de um novo procedimento para p3 Pkg pacote no invalidar qualquer dos dependentes dos Pkg - o que significa em vez que o tempo de inatividade que voc precisa para remendar aplicao reduzido. Note-se que Pgina 8 PL / SQL Melhorias no Oracle Database 11 g pgina 6 12-novembro-2007 www.oracle.com/technology/tech/pl_sql/pdf/plsql_new_in_11gr1.pdf a instalao de um banco de dados Oracle patchset permitido alterar pacote especificaes, mas apenas de uma forma estritamente compatvel: em outras palavras, todos os existentes cdigo deve funcionar corretamente contra as novas verses do pacote de especificaes sem fazer alteraes no cdigo. Antes de Banco de Dados Oracle 11 g, a instalao de tal patchset poderia causar a invalidao cascata enorme, agora, como um instalao no ir causar a invalidao. Que levar a uma reduo dramtica na o tempo de inatividade necessrio para instalar um patchset banco de dados. Observe, finalmente, que o rastreamento nova dependncia de granulao fina no resolve patching inscrio on-line e atualizao. fcil ver que porque um dos problemas mais bvios que voc se encontra, se voc tentar atualizar um pacote de stateful corpo usando uma sesso quando outra sesso foi instanciado o notrio so- 4068

chamado famlia de erros, mas a nulidade (ou mesmo supresso) de um pacote corpo famosa no invalida a sua especificao. A introduo de um rico conjunto de recursos para apoiar a atualizao do aplicativo on-line deve esperar at que uma verso futura de banco de dados Oracle. Pgina 9 PL / SQL Melhorias no Oracle Database 11 g pgina 7 12-novembro-2007 www.oracle.com/technology/tech/pl_sql/pdf/plsql_new_in_11gr1.pdf KNOB-CONTROLADA melhoria de desempenho: INTRA-UNIDADE inlining Programadores (em qualquer lngua) so encorajados a limitar o tamanho do executvel seo de cada subprograma. As opinies variam, mas a preferncia mais comuns Parece no haver mais de um par de screenfulls. No entanto, os programadores sabem, tambm, que h um custo inevitvel associada a uma chamada de subrotina. Considere, por exemplo, a tarefa de adicionar dois nmeros. Provavelmente todo programador sabe que a: = b + c; ser mais rpido em tempo de execuo do que uma: Soma = (a, b), onde a funo Sum () faz o que o prprio nome diz - e compreende por que assim. Este compreenso pode levar a um dilema desconfortvel: se o cdigo para clareza (e, consequentemente, maior probabilidade de acerto) ou para a velocidade de execuo. Suponha que voc tem para digitalizar um texto em Ingls e contar o nmero de "substancial palavras "(ou seja, excluindo palavras como, o, eu, voc, e, mas, para, onde, a partir de, sob, e assim por diante). Um loop principal como este evidentemente correto: Voc pode imaginar como escrever Found_Another_Word () que verifica o texto de entrada, extrai a palavra seguinte, passa esta de volta como um parmetro de sada e retorna true at falhar para extrair outra palavra. Ele iria usar Instr () para encontrar o prximo espaos em branco e, em seguida, substr () para extrair os caracteres entre o final do ltimo espao em branco eo incio da prxima. No a cincia de foguetes, mas definitivamente o tipo de cdigo que voc gostaria de isolar em um subprograma dedicado. Um argumento similar aplica-se a Is_Substantial (). E voc pode imaginar, tambm, como o cdigo ficaria se voc insistiu em priorizar o desempenho e evitou encapsular a lgica de Found_Another_Word () e Is_Substantial () em subprogramas: mais difcil de escrever e certamente mais difcil para o seu sucessor a manter. Uma maneira de ter seu bolo e com-lo usar um pr-processador antes da compilao adequada que reconhea especiais mark-up cdigos no texto de origem (onde de outra forma voc chamar um subprograma) e que substitui o texto de origem de que o mark-up denota. Esta abordagem chamada inlining e familiar aos programadores C. Ns se considerar a extenso PL / SQL 's recurso de compilao condicional para apoiar uma abordagem semelhante, mas preferiu delegar a tarefa para o compilador. Oracle Database 11 g linha traz uma nova pragma com valores permitidos "sim" e "no". Ao escrever isto: imediatamente antes da instruo que chama Found_Another_Word (), enquanto Plsql_Optimize_Level = 2, os pedidos programador que Found_Another_Word () deve ser inlined neste site chamada. (Inlining nunca feito quando Plsql_Optimize_Level inferior a 2.) Em certos casos, a solicitao no pode ser honrado por razes que so complexas demais para explicar. No entanto, o programador nunca precisa ser em qualquer dvida sobre o resultado do pedido. Quando inlining feito, este relatado usando o compilador do sistema avisos como este: PLW-06005: inlining de mobilizao do 'FOUND_ANOTHER_WORD' procedimento foi realizado Para o registro, o inlining no feito no regime do texto de origem PL / SQL mas, sim, no regime do da representao intermediria que de r em ( selecionar

a.PK, a.v1 de ta onde a.PK> some_value por fim a.PK) lao Process_One_Record (r); end loop; pragma inline (Found_Another_Word, 'yes'); Pgina 10 PL / SQL Melhorias no Oracle Database 11 g pgina 8 12-novembro-2007 www.oracle.com/technology/tech/pl_sql/pdf/plsql_new_in_11gr1.pdf gerados a partir da sada da anlise sinttica e semntica do compilador fase. Oracle Database 11 g tambm traz um novo valor permitido de 3 para o Plsql_Optimize_Level parmetro compilador. Isto instrui o compilador automaticamente para procurar oportunidades de subprogramas embutidos em seus locais de chamada mesmo quando o programador no o tenha requerido com inline pragma. Neste nvel interno pragma, (My_Subprogram, 'yes'); solicita ao compilador para classificar este site chamada alta entre os candidatos para inlining descobre usando heurstica prpria. em este nvel que dizer "no" no pragma significativa: este um mandato para o compilador no para o subprograma embutido naquele local da chamada. Eu implementei o algoritmo para contar as palavras substanciais em um texto usando o abordagem que eu ilustrado acima. Os subprogramas ajudante foram declarados localmente no procedimento de teste de declarar seo. (Eu no vou mostrar a voc o meu cdigo, voc vai ser mais convencido se voc escrever o seu prprio.) eu no usar a instruo em linha pragma. Eu compilou o primeiro a utilizar Plsql_Optimize_Level = 2 e em seguida, usando o nvel 3. No nvel 3, o compilador relatados PLW-06005 para a chamada para cada um dos Found_Another_Word () e Is_Substantial (). Ele tambm relatou o seguinte: PLW-06006: uncalled procedimento "FOUND_ANOTHER_WORD" removido. eo mesmo para Is_Substantial (). Esta realmente uma melhoria autnomos para os avisos. Voc vai ter o mesmo aviso, em qualquer nvel de otimizao, se voc compilar uma unidade que define um procedimento local que voc nunca invocar. No meu teste, usando um texto de cerca de 32k caracteres selecionados aleatoriamente a partir do internet, vi que inlining feita a velocidade do programa por ficar on para 10x. claro, sua milhagem pode variar! As pessoas muitas vezes perguntam: " inlining uma panacia universal? Devo sempre compilar com Plsql_Optimize_Level = 3? "A resposta que isto no como definio de nvel 2 ou como sempre compilao com Plsql_Code_Type nativa =. Estas escolhas ltimo nunca pode prejudicar o desempenho do runtime, o pior risco no tanto de um ganho como voc poderia ter esperado. claro que, tanto as escolhas fazem aumentar o tempo de compilao; mas geralmente uma deciso simples para uma implantao de produo de optar por investir em um custo em tempo de compilao de colher os frutos durante a execuo. Inlining, por outro Por outro lado, tem o potencial de prejudicar o desempenho do runtime. A explicao demasiado complexo para fazer justia neste ensaio -, mas, grosso modo, isso tem a ver com consideraes como estas: o otimizador capaz mais facilmente deduzir a propriedades de um subprograma - para que ele possa, por exemplo, com segurana iar uma chamada com argumentos invariante de lao para fora de um loop - do que capaz de deduzir propriedades correspondentes de um trecho de cdigo comum. Inlining tambm tem a possibilidade de causar inchao cdigo (apesar do fato de que o otimizador tem um governador bloat) ou, contra-intuitiva para os iniciados, para reduzir volume de cdigo. Reduo pode ocorrer quando um subprograma chamado com inlined argumentos reais cujos valores o otimizador sabe em tempo de compilao e que determinar o fluxo de controle; em tais circunstncias, os

ramos de cdigo pode ser eliminadas em tempo de compilao. Em concluso, ento, recomendamos experimentao para determinar a eficcia de inlining. Pgina 11 PL / SQL Melhorias no Oracle Database 11 g pgina 9 12-novembro-2007 www.oracle.com/technology/tech/pl_sql/pdf/plsql_new_in_11gr1.pdf Recurso de linguagem PERFORMANCE: O PL / SQL CACHE resultado da funo Oracle Database 11 g apresenta tanto um SQL cache de resultados de consulta e um PL / SQL cache do resultado da funo. Ambos usam a mesma infra-estrutura e por isso til para descrev-las em uma nica conta. Em primeiro lugar, para compreender o benefcio da consulta SQL cache de resultados, considere uma consulta que tem de processar uma grande quantidade de dados para produzir um conjunto de resultados pequeno, onde as alteraes de dados subjacentes raramente em comparao com a freqncia com que a consulta executada - por exemplo, para encontrar o maior valor mdio da renda agrupados por estado sobre a totalidade populao - ou alguma mtrica similar. Mesmo quando o SGA grande o suficiente para que todos os os blocos de dados necessrios podem ser mantidos no cache de buffer do bloco, caro computao (se no a leitura de disco) deve ser feito, antes de Banco de Dados Oracle 11 g, para obter o resultado exigido cada vez que a consulta executada. O resultado da consulta SQL do cache salva esse clculo por caching o resultado. O cache no pool compartilhado e por isso os resultados que um caches sesso beneficiar outras sesses. Claro, o cache interopervel RAC. A maneira mais simples de solicitar cache resultado adicionar uma dica (Escrito / * + * result_cache /) para a instruo SQL. Quando qualquer uma das tabelas que esto envolvidos na determinao do resultado da consulta sofrer uma mudana, ento o resultados em cache so automaticamente eliminados. Agora, para entender o benefcio da cache de resultados de PL / SQL funo, considere um funo que executa vrias consultas SQL (onde talvez um parametrizado acordo com os resultados de uma consulta anterior), e em seguida, executa alguns clculos com base nos resultados. (Assuma que complicado ou impossvel para expressar a clculo em uma nica consulta SQL.) Enquanto isso ajudaria apenas para adicionar o result_cache dica para as consultas SQL, mesmo beneficiar mais desempenho possvel atravs da cache o resultado da funo. (Isso evita a troca de contexto entre o PL / SQL e os ambientes de execuo SQL.) Este solicitada, adicionando a palavra-chave result_cache a declarao da funo no lugar onde outras propriedades como authid e parallel_enable so especificados. No entanto, cabe ao programador responsabilidade de mencionar explicitamente a lista de tabelas cujos dados determinar a resultado da funo. Isto feito com a clusula relies_on. Quando a funo de declarao e definio so separadas, pois esto com uma funo declarada em um especificao do pacote ou com uma funo local que a frente-declarados, ento ns Recomendamos que apenas a definio do uso da clusula relies_on. A definio seria parecido com este: Observe que, no caso SQL suficiente apenas para dizer result_cache - o compilador SQL trabalha fora o que as tabelas esto envolvidos na determinao do resultado, mas no PL / SQL caso o programador deve fornecer esta informao. Isso reflete a diferena entre o SQL como uma linguagem declarativa que descreve o resultado necessrio sem especificando como deve ser calculado e PL / SQL como uma linguagem imperativa que especifica como o resultado deve ser calculado sem expressar a inteno explicitamente. Quando uma consulta SQL usa espaos reservados, ento muitos resultados so armazenados em cache para que consulta introduzidos pela combinao de

argumentos de ligao para que a consulta foi executados. Da mesma forma, quando uma funo PL / SQL tem parmetros formais, ento muitos resultados so armazenados em cache para essa funo, introduzido pela combinao de real argumentos com os quais a funo foi invocada. H algumas restries sobre funo f (p1 em Typ_1, p2 em Typ_2 retorno ,...) Typ_R result_cache relies_on (Tab_1, Tab_2, Tab_3 ,...) ... Pgina 12 PL / SQL Melhorias no Oracle Database 11 g pgina 10 12-novembro-2007 www.oracle.com/technology/tech/pl_sql/pdf/plsql_new_in_11gr1.pdf os tipos de dados permitidos para os parmetros formais e retorno da funo. Para exemplo, voc no pode ter um parmetro de no escalar formal (que regra tambm exclui os tipos de dados LOB) ou um retorno lob. Estas restries so explicadas no documentao. Um candidato bvio para o cache do resultado da consulta SQL a consulta que se traduz uma tecla numrica para o texto de exibio contra o que ele representa uma lista de tabela de valores. Este caso de uso se estende naturalmente ao PL / SQL. Tenho visto que os programadores freqentemente usar uma funo PL / SQL para retornar um conjunto de resultados do inner join de uma tabela de dados com um ou lista de parceiros vrias tabelas de valores (por exemplo, para listar os funcionrios com o nome de seu departamento). Aqui, bastante comum para carregar a lista de valores de dados em um ndice pacote global por tabela varchar2 quando o pacote instanciado e depois usar isso para substituir o texto de exibio para a chave em PL / SQL seguinte cdigo apenas uma consulta em relao a tabela de dados nico. Esta cache sistema oferece um benefcio de desempenho notvel (que, claro, por isso que popular). No entanto, ele sofre de dois problemas cruciais: correo s pode ser afirmado, em vez de garantir, por ensaiando um argumento sobre a estabilidade da lista de valores da tabela em operao normal, e quando cada um dos muitos sesses simultneas caches sua prpria cpia da tabela de pesquisa, em seguida, escalabilidade se torna um problema. Ao escrever o resultado em cache funo PL / SQL que, para exemplo, retorna o ndice de varchar2 tabela de pesquisa, estas duas desvantagens so eliminadas. Alm disso, o benefcio de gerenciamento de cache (um envelhecimento LRU-base a poltica, e assim por diante) fornecida de forma transparente - enquanto na mo-codificado abordagem que eu nunca vi esse esquema codificado manualmente. Como mencionado, tanto o cache do resultado da consulta SQL e o resultado da funo PL / SQL cache de utilizar a mesma infra-estrutura: memria alocada dinamicamente a partir do piscina comum, regido pelo parmetro de inicializao Result_Cache_Max_Size. O pacote DBMS_Result_Cache expe subprogramas cache de gesto (por exemplo, para ignorar o cache, para limp-lo completamente, para purgar os resultados de uma consulta especificada ou funo, e para desativar o modo bypass). Uma famlia de catlogo pontos de vista com nomes que comeam com v $ Result_Cache_ (e correspondentes gv $ exibies para RAC) expor informaes que permite que o engenheiro de desempenho para decidir se, para cada consulta e funo, o cache est valendo a pena. (Claro que, se voc cache de um resultado que removida antes de acessar o valor em cache, ou que nunca acessado, ento o efeito ser o de diminuir o desempenho.) Engenheiros na equipe PL / SQL Oracle usado na sede do PL nova / SQL Hierrquica Profiler (veja abaixo) para observar um teste automatizado de um APEX 1 aplicao. Este identificados funes candidato muitos para o resultado cache. A implementao do prottipo APEX que recompilado as funes

identificadas com a propriedade result_cache (e clusulas relies_on apropriado) mostrou uma melhoria de desempenho de cerca de 15%. 1. APEX est para o Oracle Application Express. Pgina 13 PL / SQL Melhorias no Oracle Database 11 g pgina 11 12-novembro-2007 www.oracle.com/technology/tech/pl_sql/pdf/plsql_new_in_11gr1.pdf OUTRAS NEW PL / SQL no Oracle Database CARACTERSTICAS 11 G Recurso de linguagem funcionalidade: Concluso SQL dinmica A imediata execuo pode tomar um clob. DBMS_SQL. Parse () pode tomar um clob. DBMS_SQL pode lidar com tipos definidos pelo usurio na lista de seleo e para a ligao. Voc pode converter um DBMS_SQL cursor numrico para um cursor ref (de modo que voc pode pass-lo de volta a um cliente de banco de dados ou, quando voc conhece a lista de seleo em tempo de compilao, voc pode busc-la em um registro ou a granel busc-la em uma coleo de registros). Voc pode converter um ref cursor para um cursor DBMS_SQL numrico (de modo que voc pode descrev-lo). Voc agora necessidade DBMS_SQL apenas para "Mtodo 4" ou para os requisitos de arcanos, como execuo DDL em um link de banco de dados. Recurso de linguagem funcionalidade: DBMS_SQL segurana Uma tentativa de adivinhar o valor numrico de uma abertura (e analisados) DBMS_SQL cursor (para que voc possa inescrupulosamente seqestrar ele, religar para ver os dados que voc no deve, e execut-lo e buscar a partir dele) agora causa um erro e desativa DBMS_SQL para essa sesso. Os subprogramas de ligao e execuo deve ser invocado pela CURRENT_USER mesmo, com as mesmas funes, como invocou o parse. Opcionalmente, atravs de um nova DBMS_SQL Parse (). sobrecarga, a invocao de todos os subprogramas DBMS_SQL pode ser restrita, desta forma. Recurso de linguagem funcionalidade: De gro fino controle de acesso para UTL_TCP, etc No mais o suficiente para ter o privilgio EXECUTE UTL_TCP e seus primos (UTL_HTTP, UTL_SMTP, UTL_MAIL, Utl_Inaddr). You must also have the specific privilege to establish a TCP/IP connection to each node:port combination that you intend to access. The fine grained privileges are granted by getting the DBA to create an ACL (of users and roles), and to apply this to a port (range) on a node , using the DBMS_Network_Acl_Admin package. Functionality language feature: Create a disabled trigger; specify trigger firing order Use the disable keyword in the create statement to avoid the risk that, if the trigger fails to compile, DDL to the table will cause the ORA-04098 error. Usar o follows keyword in the create statement to control the mutual firing order for triggers at the same timing point (eg, before each row ). This helps when triggers are generated programmatically. Functionality language feature: Invoke a specific overridden ADT method If you don't know what dynamic polymorphism is and don't write hierarchies of ADTs with overridden member subprograms, then this feature won't interest voc. Else, read on. New syntax allows the implementation of an overriding subprogram to invoke the member subprogram that it overrides that is defined in a specified supertype. This was the motivating use case; but the same syntax can also be used ordinarily to extend the dot notation that invokes an objects mtodo. The plain dot notation invokes the method as overridden at this objects type level in the hierarchy; the extended notation allows you to invoke a particular overridden method at any level in the hierarchy. Pgina 14

PL/SQL Enhancements in Oracle Database 11 g pgina 12 12-November-2007 www.oracle.com/technology/tech/pl_sql/pdf/plsql_new_in_11gr1.pdf Usability language feature: The compound trigger A well known paradigm uses a before statement trigger, a before each row or after each row trigger, an after statement trigger, a package specification, and its body in concert. The paradigm is useful when you want to notice activity for each row the firing DML affects but act upon this only periodically. This might be to improve efficiency by noticing auditing information, recording this in a package global collection, and bulk inserting it into the audit table; or it might be to avoid the mutating table error. The compound trigger is a single database object that feels rather like a package body and lets to you implement the same paradigm in one unit. It lets you implement a pseudo-procedure for each of the four table timing points and declare state that each of these pseudo-procedures can ver. I called them pseudo-procedures because they look very rather like procedures but they are named using keywords. Como este: The state is managed automatically to have the lifetime of the firing DML statement rather than that of the session. Usability language feature: Use My_Sequence.Nextval in a PL/SQL expression You no longer need to say select My_Sequence.Nextval into v from Dual; The same goes for Currval . Usability language feature: The continue statement PL/SQL catches up with other languages. The continue has a familial relationship to exit . Both can be written unconditionally or together with a boolean expression as the argument of when ; and both can specify the name of an enclosing loop. The difference is that exit abandons the nominated loop but continue starts the next iteration of that loop. Usability language feature: Named and mixed notation from SQL PL/SQL programmers know the value of invoking a subprogram that has a very large number of defaulted formal parameters by writing Interesting_Formal=>Interesting_Actual only for those formal parameters whose default they don't want to accept. Este value has been unavailable when a PL/SQL function is invoked in a SQL declarao. Now this restriction is removed. Usability language feature: when others then null and other compile-time warnings Nave programmers have a tendency to provide a when others then null exception handler for every subprogram because they believe that it's wrong to cause an error (yes, really - read Tom Kyte on this topic). Of course, when a subprogram quietly returns after suppressing an unknown error, and the caller blunders on in blissful ignorance, then anything might happen and debugging is a nightmare. before each row is comear ... end before each row Pgina 15 PL/SQL Enhancements in Oracle Database 11 g pgina 13 12-November-2007 www.oracle.com/technology/tech/pl_sql/pdf/plsql_new_in_11gr1.pdf It would be very labor intensive, and error-prone, to attempt an analysis of extant code to look for this dangerous locution. Now, the compiler spots if a when others handler does not unconditionally re-raise the exception or raise a new one; in this case it issues PLW-06009 . Other new warnings are implemented, for example PLW-06006 , as has been discussed above. Usability language feature: Regexp_Count() in SQL and PL/SQL This is just what its name implies. It would be tedious to write code to produce the same answer without this new function. Pgina 16

PL/SQL Enhancements in Oracle Database 11 g page 14 12-November-2007 www.oracle.com/technology/tech/pl_sql/pdf/plsql_new_in_11gr1.pdf FERRAMENTAS The PL/SQL Hierarchical Profiler Oracle Database 11 g brings a new hierarchical performance profiler for database PL/SQL. In very broad terms, you use it like you use SQL Trace: turn on data collection, run the code, turn off data collection, and format the raw data for human analysis. However, because of the richness of the information gathered, the formatter stores its output in database tables or generates a set of hyperlinked HTML pages. You can then answer questions like these: show me the list of subprograms and SQL statements that were executed during the run, ordered by the elapsed time; for a particular subprogram, show me the time spent in itself and the time spent in each of the subprograms it calls; for a particular subprogram, show me the list of subprograms that call it ordered by the total time for those calls. This information guides you efficiently to the code whose optimization will have the greatest effect. PL/Scope Oracle Database 11 g introduces a new compiler parameter to control the generation of metadata about the identifiers in a unit. If you compile a unit with PLScope_Settings = 'identifiers:all' then you can query one of the DBA_Identifiers catalog view family to get the line and column location for the reference to each identifier and to find out where each identifier is defined (which might be in a different unit, of course). Because PL/SQL is a block structured language, a particular name often corresponds to a different phenomenon at different locations in a unit. Therefore, ordinary text search is a feeble tool to discover where a given identifier is defined or where it is referenced; rather, you need the full intelligence of the PL/SQL compiler. You can use the DBA_Identifiers views to support ad hoc impact analysis queries if, for example, you discover that two subprograms have been given the same name and you want to rename one to lesson lessen the confusion this causes to the programmer (but, of course, not to the compiler). However, this feature was motivated by a different goal: to enable SQL Developer to present source code where the identifier usages hyperlink to their definitions, where identifier definitions hyperlink to lists of hyperlinks to their usages, and so on. This facility is analogous to Cscope (see cscope.sourceforge.net ) which C programmers use. For this reason, we call the feature PL/Scope . Tal facility is especially useful to the programmer who inherits a large corpus of unfamiliar code. CONCLUSO Oracle Database 11 g brings many enhancements to PL/SQL. Estes iro improve the performance, functionality, and security of your applications and will increase your productivity as a developer. Bryn Llewellyn, PL/SQL Product Manager, Oracle Headquarters bryn.llewellyn@oracle.com 12-November-2007 Pgina 17 PL/SQL Enhancements in Oracle Database 11 g Novembro 2007 Bryn Llewellyn, PL/SQL Product Manager, Oracle Headquarters Oracle Corporation Sede Mundial 500 Oracle Parkway Redwood Shores, CA 94065 EUA Telefone para contato: Telefone: +1.650.506.7000 Fax: +1.650.506.7200 oracle.com Copyright 2007, Oracle. Todos os direitos reservados. Este documento fornecido apenas para fins informativos e os seu contedo est sujeito a alterao sem aviso prvio. Este documento no garantia de estar livre de erros, nem sujeito a qualquer other warranties or conditions, whether expressed orally or implied in law, including implied warranties and conditions of merchantability or adequao a um propsito particular. We specifically disclaim any liability with respect to this document and no contractual obligations are direta ou indiretamente por este documento. Este documento no

pode ser reproduzida ou transmitida em qualquer forma ou por qualquer meio, electronic or mechanical, for any purpose, without our prior written permisso. Oracle, JD Edwards, PeopleSoft, and Retek are registered trademarks of Oracle Corporation and/or its affiliates. Other names may be marcas comerciais de seus respectivos proprietrios.