- Um componente que faz a diferença em um RDBMS é otimizador de plano acesso de queries, este utiliza-se de cálculos baseados em custo ou regra.
No caso do Informix desde a versão 7.X (1994?) o otimizador é baseada em custo, no Informix Online (1990?) lembro-me que não tinha histograma mas creio que já era baseado em custo, porque estou contando esta histórinha?
Bom o Oracle passou a utilizar otimizador baseado em custo a partir da versão 10.X (2004?) , na versão 9.i o otimizador era hibrido o DBA escolhia: custo ou regra. (É mole!!?)
Voltando a nossas diretivas, temos os seguintes tipos:
Diretivas de Métodos de Acesso
São diretivas que influenciam no caminho usado no plano de acesso, tais como acesso full, indexado etc.
Segue abaixo lista de diretivas:
FULL - Força um acesso sequencial na tabela
AVOID_FULL - Evita que seja executado um acesso sequencial na tabela
INDEX - Força a pesquisa no indice informado
AVOID_INDEX - Desconsidera o indice informado
INDEX_SJ - Força a auto-junção pelo indice informado
AVOID_INDEX_SJ - Evita a auto-junção através do índice informado.
São diretivas que influenciam a forma como a junção entre as tabelas será feita, por exemplo ler tabela a e buscar ocorrência na tabela B (Nested Loop)
Segue abaixo lista de diretivas:
USE_NL
AVOID_NL
USE_HASH
USE_HASH (tabname)
USE_HASH (tabname/BUILD)
USE_HASH (tabname/PROBE AVOID_HASH
Existe somente uma, indica que a ordem de acesso das tabelas na junção será de acordo com a ordem das tabelas na cláusula from do SQL.
ORDERED
Diretivas de Metas
Estas definem o comportamento do otimizador em relação ao retorno do resultado da query.
FIRST_ROWS - O retorno da query ocorre logo após a leitura das primeiras linhas, com isto é mais fácil interromper uma query quando vemos que a mesma não está rápida.
ALL_ROWS - O retorno das primeiras linhas da query ocorre após a leitura de todas as linhas envolvidas na consulta.
Diretivas de Explain
No exemplo abaixo usamo uma diretiva para que o otimizador exiba ao output do plano de acesso no arquivo de explain.
SELECT {+ EXPLAIN } *
FROM Tabela1 a, Tabela2 b
WHERE b.customer_num = a.customer_num
No exemplo abaixo usamo uma diretiva para que o otimizador exiba ao output do plano de acesso no arquivo de explain, porém a query não será executada, somente será criado o plano fe acesso.
SELECT {+ EXPLAIN AVOID_EXECUTE} ......
Definindo Diretivas ExternasUma diretiva externa é aquela que pode ser armazenada dentro do banco de dados, imagine um ERP onde você não tenha acesso ao código fonte, e foi detectada uma query onde o plano de acesso não esta legal.
Bom neste caso é possível armazenar esta query juntamente com as diretivas dentro de uma tabela de catálogo do Informix, sempre que este comando sql for parseado o engine irá aplicar as diretivas.
Veja exemplo abaixo:
save external directives {+ ORDERED USE_NL(u)} active for SELECT * FROM Tabela1 a, Tabela2 b WHERE b.cod_emp = a.cod_emp
Para consultar as diretivas externas em catálogo:
select * from sysmaster:sysdirectives
Para desativar uma diretiva externa:
UPDATE sysdirectives set active = 0 where id = ?
Para excluir uma diretiva externa:
DELETE from sysdirectives where id = 2
Normalmente quando falamos do otimizador temos que falar de várias tópicos, pois o cálculo do custo está relacionado ao custo de I/O, Network, CPU e seletividade.
Não quero entrar em update statistics mas vale lembrar que além de atualizar as estatisticas do catálogo e gerar os bins do histograma o mesmo tem mais funções, dentre elas varrer as páginas de índices que foram marcadas como excluídas e reenviar para a fila do B-Tree cleaner para que as mesmas sejam removidas.
Eu já tinha ouvido algumas discussões sobre o assunto: Update Statistics reorganiza os índices? Não é bem assim, ele apenas remove entradas marcadas como excluídas dos índices.
Por isto não esqueça de atualizar a estatisticas de suas tabelas e procedures, se você ainda não usa a versão 11.50 começa a pensar em usá-la, pois nesta versão a atualização de estatisticas é automática.
Dúvidas? Pregutas? Questions? Askpuentes!!
Nenhum comentário:
Postar um comentário
Observação: somente um membro deste blog pode postar um comentário.