Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

mson77

10g - CBO e index

Recommended Posts

Olás,

 

Falando sobre Oracle 10g (10.2.0.1) em Win32-bit:

[*]Como eu faço p usar CBO? Digo, como eu ativo e parametrizo essa "feature"?

[*]CBO e index são conflitantes ou se ajudam mutuamente para melhorar desempenho de um comando SQL?

Obrigado,

 

 

mson77

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mson,

 

CBO - [ Cost Based Optimazer ] é um padrão que o otimizador do Oracle (SQL Engine) utiliza para realizar os planos de execuções para cada instrução SQL no banco de dados, existe a opção RBO [ Rule Based Optimazer ], onde não precisa de estatísticas em tabelas e índices, ao contrário de CBO. Que pode ser alterado no parâmetro optimizer_mode.

 

Tabelas e índices trabalham muito bem com CBO, no 10G, é somente CBO *somente com outros parâmetros de compatibilidade dá para trabalhar com RBO* , existem muitos outros parâmetros na instância que tu pode configurar o optimizador e melhorar em N% a performace de suas consultas.

 

Mas lembre-se, para trabalhar no modo CBO, as tabelas e índices sempre deverão ter estatísticas (na DBA_TABLES|DBA_INDEXES a columa LAST_ANALYZED) com valores atuais, isso trará bons planos de execuções.

 

Abraços,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,

 

Entao CBO é uma escolha... correto? (Oracle 10g)

Como/onde eu defino se o oracle vai usar CBO ou não?

==> O que são index parallel e non-parallel? Pra que serve essa propriedade?

 

=============================

Eu fui no sqlplus e executei:

sql> dbms_stats.gather_schema_stats(ownname=>'meuschema',estimate_percent=>10,granularity=>'auto',cascade=>true);

 

... demorou uns 3min para terminar de processar.

Nesse momento... eu entendo que apenas habilitei o oracle para coletar estatistica... é isso?

Bem... eu supus que fosse isso... e ai eu rodei minha aplicação.

Qdo rodo a minha aplicação... (estou pedindo um relatorio)... esse relatorio demora uns 30min. Isso mesmo... :(

Entao... imaginei que a primeira vez apos o comando "gather"... ele vai coletar info de estatistica.

Entao... na 2a.vez qdo eu rodar o meu relatorio... esse tempo de 30min nao deveria diminuir?

Onde eu estou errando?

 

Obrigado,

 

mson77

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá,

 

Entao CBO é uma escolha... correto? (Oracle 10g)

R: Se sua instância estiver com o parâmetro optmizer_mode = CHOOSE ou com ALL_ROWS, FIST_ROWS ou N_ROWS as consultas serão por CBO.

 

Como/onde eu defino se o oracle vai usar CBO ou não?

 

R: Nos parâmetros da instância como dito acima e coletando estatísticas de tabelas e índices.

 

O que são index parallel e non-parallel? Pra que serve essa propriedade?

 

R: Parallel é um recurso de paralelismo do Oracle (somente em versão EE - Enterprise Edition) quando se tem no servidor mais que 1 processador, ele pode paralisar instruções DML e DDL, não confunda com OPS - Oracle Parallel Server, onde se trabalha com bancos de dados em paralelo para maximizar performance.

 

O Index parallel é uma opção que o Oracle fornece dizendo que a consulta desse índice será paralisada, ou seja, irá utilizar 2 ou mais threads para realizar um rápido acesso aos dados e NON-PARALLE diz que não será utilizado paralelismo.

 

Eu fui no sqlplus e executei:

sql> dbms_stats.gather_schema_stats(ownname=>'meuschema',estimate_percent=>10,granularity=>'auto',cascade=>true);

R: Isso coleta apenas informações sobre o owner, automaticamente, meio que sem querer, seria uma forma de forçar a utilização do CBO no banco de dados sobre esse usuário. Para ter melhores resultados, faça essa coleta:

 

SQL> exec dbms_stats.gather_schema_stats (ownname=>'USUARIO',estimate_percent=>null,cascade=>true);

 

Esse comando lhe diz que será coletado estatísticas completas do seu owner, ou seja, será coletadas estatísticas para as tabelas e índices (cascade=>true) por completo (estimate_percent=>null).

 

... demorou uns 3min para terminar de processar.

R: Isso mesmo, dependendo dos tamanhos dos segmentos do seu owner, quantidade de registros, nível de processamento da máquina, isso pode demorar mesmo, em alguns casos, dias!!!!

 

Nesse momento... eu entendo que apenas habilitei o oracle para coletar estatistica... é isso?

R: O Oracle não irá coletar as estatísticas automaticamente, tu terá que criar procedimentos para isso quando for necessário. Ele apenas coleto as informações pq tu pediu.

 

Bem... eu supus que fosse isso... e ai eu rodei minha aplicação.

Qdo rodo a minha aplicação... (estou pedindo um relatorio)... esse relatorio demora uns 30min. Isso mesmo... :(

Entao... imaginei que a primeira vez apos o comando "gather"... ele vai coletar info de estatistica.

Entao... na 2a.vez qdo eu rodar o meu relatorio... esse tempo de 30min nao deveria diminuir?

 

R: Sim se as estatísticas que pediu ao Oracle está correto, é sempre bom passar por completo e nos índices, agora, temos que ver se o relatório está bem feito, é bom fazer um trace sobre ele.

 

Onde eu estou errando?

 

R: Recomendo ler um pouco sobre otimizador de banco de dados para entender melhor como funciona todo o "engine" do Oracle e seus comportamentos. No site da Oracle existem excelentes documentos sobre o assunto.

Obrigado,

 

R: De nada... estamos aqui para ajudar. rs rs rs. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Rodrigo,

 

MUITO OBRIGADO pela sua enorme atenção!

 

Revisando:

 

1) Qdo eu dou o comando:

select value from v$parameter where name='optimizer_mode'
==> eu entendo que esse parametro serve para TODAS as sessoes... correto?

mas... qdo eu dou o comando:

alter session set optimizer_mode='rule'
==> eu entendo que a alteracao é APENAS para a sessão corrente... correto?

ou seria para TODAS as sessoes futuras?

==============================================

 

Para uma inicialização básica... de ajuste de CBO... qual seria a sua recomendação para os parametros abaixo:

[*]optimizer_index_cost_adj

[*]optimizer_search_limit

[*]optimizer_max_permutations

E qual é o comando para deixar configurado sempre que o oracle iniciar? Seria o "alter session" ou altera DIRETO no spfile/pfile?

 

Obrigado,

 

mson77

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá:

 

1) Qdo eu dou o comando:

select value from v$parameter where name='optimizer_mode'

==> eu entendo que esse parametro serve para TODAS as sessoes... correto?

R: SIM! Pois esse parâmetro está configurado para a instância Oracle.

 

mas... qdo eu dou o comando:

alter session set optimizer_mode='rule'

==> eu entendo que a alteracao é APENAS para a sessão corrente... correto?

 

R: SIM! ALTER SESSION SET é somente para a sessão que está logada.

 

ou seria para TODAS as sessoes futuras?

R: NÃO! Somente para a sessão atual. As futuras vão sempre utilizar a que está configurado na instância, que é o primeiro caso.

 

Para uma inicialização básica... de ajuste de CBO... qual seria a sua recomendação para os parametros abaixo:

[*]optimizer_index_cost_adj

[*]optimizer_search_limit

[*]optimizer_max_permutations

R: Utilize sempre os valores padrões, assim que estiver conhecendo a funcionalidade desses parâmetros e conhecer bem seu ambiente Oracle, aí, poderá alterar e configurar de acordo com a aplicação.

 

E qual é o comando para deixar configurado sempre que o oracle iniciar? Seria o "alter session" ou altera DIRETO no spfile/pfile?

R: O ALTER SESSION é sempre na sessão e é válido somente para a sessão, para o banco de dados Oracle sempre utilizar um determinado valor é necessário colocar o valor no arquivo de parametrização (PFILE) ou no server parameter file (SPFILE).

 

Porém, lembre-se sempre de verificar se o parâmetro que está alterando é dinâmico ou estático, pois, em alguns parâmetros é necessário realizar um STOP/START do banco de dados.

 

Abraços, http://forum.imasters.com.br/public/style_emoticons/default/shifty.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.