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.