Você está na página 1de 4

BOAS PRATICAS DE PROGRAMAO PLSQL - PARTE 1

Ola !!! Estou enviando este artigo de "Boas Praticas de programao PL/SQL" ou seja, so alguns assuntos que acho interessante e uso no meu dia-a-dia. Estes tpicos so algumas dicas de como programar ou melhorar a programao. Espero que gostem e se possvel mandem algumas dicas para incrementar meu artigo...

Ola !!! Estou enviando este artigo de "Boas Praticas de programao PL/SQL" ou seja, so alguns assuntos que acho interessante e uso no meu dia-a-dia. Estes tpicos so algumas dicas de como programar ou melhorar a programao. Espero que gostem e se possvel mandem algumas dicas para incrementar meu artigo... 1 - Introduo Problemas com aplicaes de baixa performance podem estar freqentemente relacionados a consultas SQL mal estruturadas ou a um design de banco de dados ineficiente. A metodologia e tuning da Oracle, tradicionalmente focada no design da aplicao e no tuning de consultas SQL antes mesmo de analisar quaisquer tipos de problemas relacionados configurao do banco de dados. A otimizao de uma consulta constitui em determinar a melhor estratgia para execut-la no banco de dados. O otimizador do Oracle escolhe, por exemplo, se usar um ndice ou no para uma consulta especifica e que tcnicas de JOIN usar na juno de mltiplas tabelas. Estas decises tm um impacto muito grande na performance de um SQL e por isso a otimizao de uma consulta essencial para qualquer aplicao e de extrema importncia para a performance de um banco de dados relacional. muito importante que os desenvolvedores conheam o otimizador do Oracle como tambm os conceitos relativos tuning. Tal conhecimento ir ajudar a escrever consultas muito mais eficientes e rpidas. A proposta deste artigo justamente fornecer uma base terica e pratica dos principais conceitos relativos a tuning para que voc j comece a escrever SQLs muito mais rpidos. 2 - SQL Performance e Tuning 2.1 - Conhea bem a aplicao como os dados contidos nela. Informaes idnticas quase sempre podem ser encontradas em diferentes fontes de dados. Se familiarize com estas fontes; voc deve estar atento ao volume e a distribuio destes dados no banco de dados. Voc tambm deve ter um profundo conhecimento do seu modelo de dados, como o relacionamento entre as entidades de negcios, antes de escrever seu SQL. Este entendimento vai ajudar a escrita de consultas mais eficientes para retirar dados de mltiplas tabelas. 2.2 - Entenda o Otimizador O otimizador determina a maneira mais eficiente de se rodar um SQL. Para executar qualquer SQL o Oracle tem que derivar um "plano de execuo". O plano de execuo de uma consulta uma descrio de como o Oracle ir implementar a recuperao dos dados para satisfazer a um determinado SQL. Desde a verso 7 at a 9 o Oracle possui dois otimizadores que sero descritos a seguir: 2.2.1 - Otimizador Baseado em Regra (Ruled Based Optimizer - RBO) O RBO utiliza uma srie de regras rgidas para determinar um plano de execuo para cada SQL. Se voc conhecer as regras voc pode construir uma consulta SQL para acessar os dados da maneira desejada. O RBO no est sendo mais aperfeioado e foi descontinuado pela Oracle s sendo suportado at o Oracle 9i. 2.2.2 - Otimizador Baseado em Custo (cost Based Optimizer - CBO) Introduzido no Oracle 7, o CBO tentar achar o plano de execuo que possui o menor custo para acessar os dados tanto para uma quantidade de trabalho especifica como para um tempo inicial de resposta mais rpido. Os Custos de diferentes planos so calculados e a opo que apresentar o menor custo de execuo escolhida. So coletadas estatsticas referentes s tabelas do banco de dados e estas so usadas para determinar um plano de execuo timo. O CBO no entende as caractersticas relacionadas a uma aplicao, como tambm no pode entender completamente o impacto de relacionamentos complexos nos joins de algumas tabelas. Ele apenas possui uma fonte de informaes limitadas, baseada em estatsticas, para determinar o melhor plano de execuo para cada consulta. Como o CBO assume alguns valores relativos ao custo, o plano escolhido pode no ser necessariamente o melhor plano de execuo. Portanto voc deve estar sempre preparado para otimizar estes SQLs em busca do plano timo quando preciso. 2.3 - Entenda o que seletividade A seletividade a primeira e mais importante medida do Otimizador Baseado em Custo. Ela representa uma frao de linhas de um conjunto resultante de uma tabela ou o resultado de um "join" ou um "group by". O CBO utiliza estatsticas para determinar a seletividade de um determinado predicado (clausula where ou having). A seletividade diretamente ligada ao predicado da consulta como ID = 1245, ou uma combinao de predicados, como ID = 1245 AND STATUS=A. O propsito do predicado de uma consulta limitar o escopo dela a um certo nmero de linhas em que estamos interessados. Portanto, a seletividade de um predicado indica quantas linhas de um conjunto vo ser filtradas por uma determinada condio. A seletividade varia numa faixa de valores de 0.0 at 1.0 onde a seletividade de 0 indica que nenhuma linha ser selecionada e 1 que todas as linhas sero selecionadas. A seletividade igual ao numero de valores distintos que uma coluna possui. (1/NVD onde NVD significa o Numero de Valores Distintos). Haysar Alfredo Conte Maluf Lelis - DBA haysar@gmail.com Nota: Autor: HAYSAR ALFREDO CONTE MALUF LELIS BOAS PRATICAS DE PROGRAMAO PLSQL - PARTE 2

Ol, primeiramente, gostaria de agradecer os comentrios e e-mails que recebi, gostei mesmo e espero que continuem, pois o intuito destes artigos no falar o que certo ou errado e sim aprender mais e mais... Estou escrevendo a parte 2 do artigo, mas ainda tem mais!!!

2.4. Entenda o que so Variveis de Ligao (Bind Variables) As variveis de ligao (bind) permitem que uma instruo SQL seja preparada uma nica vez pelo banco de dados e executada inmeras vezes, mesmo com valores diferentes para estas variveis. Esta economia na fase de preparao a cada execuo representa um ganho de eficincia (tempo e recursos) na aplicao e no servidor de banco de dados. Alm disso, variveis de ligao facilitam a validao de tipo de dados dos valores de entrada fornecidos dinamicamente e evitam os riscos de vulnerabilidade de segurana e integridade existentes quando se constri uma instruo SQL por concatenao de strings (Select Dinmico). Assim, este recurso traz tambm robustez e segurana execuo de SQL nas aplicaes. Portanto, h grande importncia e vantagens no uso de SQL preparados e variveis de ligao (bind) nas aplicaes interagindo com bancos de dados, especialmente quando envolvem valores dinmicos e parmetros fornecidos pelo usurio, de forma que este recurso deve ser utilizado sempre, tratando-se de boa prtica de programao, portanto minha dica que usem e abusem de bind variables !!! 2.5. Escreva SQLs idnticos em suas aplicaes Tire toda a vantagem do uso de variveis de ligao (Bind Variables), stored procedures e packages quando possvel. Os benefcios de Sqls idnticos incluem a reduo de uso de memria no servidor do banco de dados como a execuo de consultas mais rpidas, pois no necessria a fase de "parse" durante a execuo do comando. Por exemplo, estes SQL's no so iguais: Exemplos: select * from employee where empid = 10; select * from employee where empid = 20; Usando uma Bind Variable chamada i_empid, a consulta ficaria assim: select * from employee where empid = :i_empid; Para que os comandos se tornem iguais voc deve sempre usar variveis no lugar de dados fixos, como mostra o exemplo acima. 2.6. Use ndices nas tabelas cuidadosamente - Nao perseguio aos programadores ..rs..rs..rs Para tirar vantagem dos ndices, escreva seu SQL de uma maneira que ele faa uso dele. O otimizador do Oracle no usar o acesso atravs de um ndice simplesmente porque ele existe em uma coluna, o meio de acesso tem que ser provido pelo seu SQL ! Tenha certeza de ter criado todos os ndices necessrios nas tabelas, mas tome cuidado com o excesso de ndices, pois eles podem degradar a performance de DMLs na tabela. Ento como escolher que colunas indexar? Use ndices em colunas que so freqentemente usados na clausula WHERE de consultas da aplicao ou de consultas usadas por usurios finais. Indexe as colunas que so freqentemente usadas para juntar (JOIN) as tabelas nas diferentes consultas. Prefira fazer JOIN pelas chaves primarias e chaves estrangeiras. Use ndices apenas em colunas que possuem uma baixa porcentagem de linhas com valores iguais. No use ndices em colunas que so usadas apenas com funes e operadores na clausula WHERE. No indexe colunas que so freqentemente modificadas ou quando a eficincia ganha atravs da criao de um ndice no valha a pena devido perda de performance em operaes de INSERT, UPDATE e DELETE. Com a criao do ndice, estas operaes perdero em performance devido necessidade de manter o ndice correto. ndices nicos (UNIQUE) so melhores que os no nicos devido a melhor seletividade. Use ndices nicos em chaves primrias e ndices no nicos em chaves estrangeiras (FOREIGN KEY) e colunas usadas freqentemente nas clausulas WHERE. 2.7. Use o "Explain Plan" quando possvel - SEMPRE !!! Se familiarize com a ferramenta EXPLAIN PLAN e use-a para otimizar seu SQL. O Explain Plan ir te ajudar a descobrir, atravs do plano de execuo da consulta, os meios de acesso que o Oracle est utilizando para acessar as tabelas do banco de dados. Segue aqui como executar o EXPLAIN na mo mas temos muitas ferramentas de programao, boas ferramentas por sinal, so elas (SQL DEVELOPER (QUEST), SQL DEVELOPER (ORACLE), TOAD (QUEST). Primeiro precisamos criar a Plan_TAble, ser nesta tabela que ficaro as informaes: create table PLAN_TABLE ( statement_id varchar2(30), timestamp date, remarks varchar2(80), operation varchar2(30), options varchar2(30), object_node varchar2(128), object_owner varchar2(30), object_name varchar2(30), object_instance numeric, object_type varchar2(30), optimizer varchar2(255), search_columns number, id numeric, parent_id numeric, position numeric,

cost numeric, cardinality numeric, bytes numeric, other_tag varchar2(255), partition_start varchar2(255), partition_stop varchar2(255), partition_id numeric, other long, distribution varchar2(30)); Ou pode usar o script da Oracle o utlxplan.sql que fica em $ORACLE_HOME/rdbms/admin grant insert,delete,select,update on plan_table to public ; Depois de criado basta rodarmos a nossa query que queremos analisar antes de colocar em produo (TODAS)... EXPLAIN PLAN set STATEMENT_ID='TESTE' FOR --Este o comando e depois vem a query SELECT dist.distributor_id, dist.city, dist.state, dist.zip_code, district.name, emp.last_name FROM distributor dist, district, employee emp WHERE emp.employee_id = dist.manager_id AND district.district_id = dist.district_id; Aps executar a sua query, o sqlplus ir voltar a mensagem explain (explicado), a basta rodar o select: SELECT LPAD(' ',2*(LEVEL-1))|| OPERATION|| ' '||OPTIONS || ' '||OBJECT_NAME||' '|| DECODE(ID, 0,'COST = '||POSITION) "QUERY PLAN" FROM PLAN_TABLE START WITH ID = 0 AND STATEMENT_ID = 'TESTE' CONNECT BY PRIOR ID = PARENT_ID AND STATEMENT_ID = 'TESTE' ORDER BY ID Ou pode usar o script da Oracle utlxplp.sql que fica no mesmo local que o primeiro.Alm disso tem as ferramentas que fazer o explian para te auxiliar.

2.8. A Clausula WHERE crucial As seguintes clusulas no WHERE no faro uso do ndice mesmo que ele esteja disponvel: A.COL1 > A.COL2 A.COL1 < A.COL2 A.COL1 >= A.COL2 A.COL1 <= A.COL2 COL1 IS NULL COL1 IS NOT NULL. Um ndice no guarda o ROWID de colunas que possuem valores nulos. Qualquer consulta em linhas que possuam valores nulos o ndice no pode ser utilizado. COL1 NOT IN (value1, value2 ) COL1 != expression COL1 LIKE '%teste' Neste caso, o uso do "%" no inicio da string acaba por suprimir a parte por onde coluna indexada e por isso o ndice no usado. Por outro lado, COL1 LIKE 'teste%' ou COL1 LIKE 'teste%teste%' faz uso do ndice resultando em uma busca por faixas limites. NOT EXISTS subconsulta expression1 = expression2. Quaisquer expresses, funes ou clculos envolvendo colunas indexadas no faro uso do ndice se ele existir. No exemplo a seguir, o uso da funo SQL UPPER vai impedir do ndice ser usado provocando assim uma consulta FULL TABLE SCAN. SELECT DEPT_NAME FROM DEPARTMENT WHERE UPPER(DEPT_NAME) like 'SALES%'; 2.9. Use o WHERE ao invs de HAVING para filtrar linhas Evite o uso da clausula HAVING junto com GROUP BY em uma coluna indexada. Neste caso o ndice no utilizado. Alm disso, exclua as linhas indesejadas na sua consulta utilizando a clausula WHERE ao invs do HAVING. Se a tabela EMP possusse um ndice na coluna DEPTID, a seguinte consulta no faria uso dele: SELECT DEPTID, SUM(SALARY) FROM EMP GROUP BY DEPTID HAVING DEPTID = 100; Entretanto, a mesma consulta pode ser escrita para explorar o ndice:

SELECT DEPTID, SUM(SALARY) FROM EMP WHERE DEPTID = 100 GROUP BY DEPTID; 2.10. Especifique as colunas principais do ndice na clausula WHERE Em um ndice composto a consulta apenas utilizar o ndice se as principais colunas do ndice estiverem especificada na clausula WHERE. A seguinte consulta usar o ndice composto baseado na chave primria (PART_NUM, PRODUCT_ID) da tabela PARTS. SELECT SN_NUM FROM PARTS WHERE PART_NUM = 100; Enquanto esta consulta no se beneficiar do uso do ndice composto: SELECT SN_NUM FROM PARTS WHERE PRODUCT_ID = 5555; A mesma consulta pode ser reescrita para tirar vantagem do ndice. Nesta consulta o valor assumido para a coluna PART_NUM sempre maior que zero. SELECT SN_NUM FROM PARTS WHERE PART_NUM > 0 AND PRODUCT_ID = 5555; 2.11. Compare o INDEX SCAN com o FULL TABLE SCAN Se voc estiver selecionando mais de 15 % das linhas de uma tabela, um FULL TABLE SCAN geralmente mais rpido do que o acesso pelo ndice. Quando o acesso por ndice causar lentido ao invs de apresentar um ganho de performance pode utilizar algumas tcnicas para eliminar o uso do ndice: SELECT EMP_NAME FROM EMP WHERE SALARY+0 = 50000; A consulta a seguir no utilizar o ndice mesmo que exista um na coluna SS# da tabela EMP: SELECT EMP_NAME FROM EMP WHERE SS# || ' ' = '111-22-333'; Um ndice tambm no usado se o Oracle tiver que realizar uma converso implcita de dados. Para o exemplo a seguir, SALARY uma coluna numrica na tabela EMP e uma string convertida num valor numrico: SELECT EMP_NAME FROM EMP WHERE SALARY = '50000'; Quando a porcentagem de linhas acessadas menor que 15 % da tabela, ento o uso do ndice vai ser bem mais performtico.

Você também pode gostar