Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Por que o Oracle usa DBMS_STATS.GATHER_TABLE_STATS?


A maioria dos bancos de dados corporativos, incluindo o Oracle, usa um otimizador baseado em custo para determinar o plano de consulta apropriado para uma determinada instrução SQL. Isso significa que o otimizador usa informações sobre os dados para determinar como executar uma consulta em vez de depender de regras (era o que o otimizador baseado em regras mais antigo fazia).

Por exemplo, imagine uma tabela para um aplicativo simples de rastreamento de bugs
CREATE TABLE issues (
  issue_id number primary key,
  issue_text clob,
  issue_status varchar2(10)
);

CREATE INDEX idx_issue_status
    ON issues( issue_status );

Se eu for uma grande empresa, posso ter 1 milhão de linhas nesta tabela. Desses, 100 têm um issue_status de ACTIVE, 10.000 têm um issue_status de QUEUED e 989.900 têm o status de COMPLETE. Se eu quiser executar uma consulta na tabela para encontrar meus problemas ativos
SELECT *
  FROM issues
 WHERE issue_status = 'ACTIVE'

o otimizador tem uma escolha. Ele pode usar o índice em issue_status e, em seguida, faça uma pesquisa de linha única na tabela para cada linha no índice que corresponda ou faça uma verificação de tabela nos issues tabela. Qual plano é mais eficiente dependerá dos dados que estão na tabela. Se o Oracle espera que a consulta retorne uma pequena fração dos dados na tabela, usar o índice seria mais eficiente. Se o Oracle espera que a consulta retorne uma fração substancial dos dados na tabela, uma verificação de tabela seria mais eficiente.

DBMS_STATS.GATHER_TABLE_STATS é o que reúne as estatísticas que permitem que a Oracle faça essa determinação. Ele informa ao Oracle que há aproximadamente 1 milhão de linhas na tabela, que existem 3 valores distintos para o issue_status coluna e que os dados estão distribuídos de forma desigual. Portanto, o Oracle sabe usar um índice para a consulta para encontrar todos os problemas ativos. Mas também sabe que quando você se vira e tenta procurar todas as questões fechadas
SELECT *
  FROM issues
 WHERE issue_status = 'CLOSED'

que será mais eficiente fazer uma varredura de tabela.

A coleta de estatísticas permite que os planos de consulta mudem ao longo do tempo à medida que os volumes de dados e as distribuições de dados mudam. Ao instalar o rastreador de problemas pela primeira vez, você terá muito poucos problemas CONCLUÍDOS e mais problemas ATIVOS e EM FILA. Com o tempo, o número de questões CONCLUÍDAS aumenta muito mais rapidamente. À medida que você obtém mais linhas na tabela e a fração relativa dessas linhas que estão nos vários status muda, os planos de consulta mudam para que, no mundo ideal, você sempre obtenha o plano mais eficiente possível.