A saída de EXPLAIN PLAN é uma saída de depuração do otimizador de consulta do Oracle. O COST é a saída final do otimizador baseado em custo (CBO), cuja finalidade é selecionar qual dos muitos planos possíveis diferentes deve ser usado para executar a consulta. O CBO calcula um Custo relativo para cada plano e, em seguida, escolhe o plano com o menor custo.
(Nota:em alguns casos o CBO não tem tempo suficiente para avaliar todos os planos possíveis; nestes casos ele apenas escolhe o plano com o menor custo encontrado até o momento)
Em geral, um dos maiores contribuintes para uma consulta lenta é o número de linhas lidas para atender a consulta (blocos, para ser mais preciso), então o custo será baseado em parte no número de linhas que as estimativas do otimizador precisarão ser lidas.
Por exemplo, digamos que você tenha a seguinte consulta:
SELECT emp_id FROM employees WHERE months_of_service = 6;
(Os
months_of_service
coluna tem uma restrição NOT NULL nela e um índice comum nela.) Existem dois planos básicos que o otimizador pode escolher aqui:
- Plano 1:leia todas as linhas da tabela "employees", para cada uma, verifique se o predicado é verdadeiro (
months_of_service=6
). - Plano 2:leia o índice em que
months_of_service=6
(isso resulta em um conjunto de ROWIDs) e acesse a tabela com base nos ROWIDs retornados.
Vamos imaginar que a tabela "employees" tenha 1.000.000 (1 milhão) de linhas. Vamos imaginar ainda que os valores para months_of_service variam de 1 a 12 e são distribuídos de maneira bastante uniforme por algum motivo.
O custo do Plano 1 , que envolve um FULL SCAN, será o custo de leitura de todas as linhas da tabela de funcionários, que é aproximadamente igual a 1.000.000; mas como o Oracle geralmente poderá ler os blocos usando leituras de vários blocos, o custo real será menor (dependendo de como seu banco de dados está configurado) - por exemplo, vamos imaginar que a contagem de leitura de vários blocos seja 10 - o custo calculado da varredura completa será 1.000.000/10; Custo total =100.000.
O custo do Plano 2 , que envolve um INDEX RANGE SCAN e uma pesquisa de tabela por ROWID, será o custo de varredura do índice, mais o custo de acesso à tabela por ROWID. Não vou entrar em como as varreduras de intervalo de índice são custeadas, mas vamos imaginar que o custo da varredura de intervalo de índice seja 1 por linha; esperamos encontrar uma correspondência em 1 de 12 casos, portanto, o custo da varredura de índice é 1.000.000 / 12 =83.333; mais o custo de acesso à tabela (suponha 1 bloco de leitura por acesso, não podemos usar leituras multi-bloco aqui) =83.333; Custo total =166.666.
Como você pode ver, o custo do Plano 1 (varredura completa) é MENOR que o custo do Plano 2 (varredura de índice + acesso por rowid) - o que significa que o CBO escolheria a varredura COMPLETA.
Se as suposições feitas aqui pelo otimizador forem verdadeiras, na verdade o Plano 1 será preferível e muito mais eficiente que o Plano 2 - o que refuta o mito de que as varreduras COMPLETAS são "sempre ruins".
Os resultados seriam bem diferentes se a meta do otimizador fosse FIRST_ROWS(n) em vez de ALL_ROWS - nesse caso, o otimizador favoreceria o Plano 2 porque geralmente retornará as primeiras linhas mais rapidamente, ao custo de ser menos eficiente para toda a consulta .