dicas Oracle por Burleson Consulting |
dentro desses dois Otimizadores, a Oracle fornece vários modos de otimizador. Um modo otimizador pode ser definido para todo o banco de dados ou para uma sessão específica do Oracle. Os modos otimizador incluem rule, first_rows, all_rows e choose. Vamos dar uma olhada em cada um desses objetivos.
modo de regra
a dica de regra ignorará o CBO e as estatísticas e gerará um plano de execução baseado apenas nas informações básicas do dicionário de dados. É sempre uma boa ideia tentar ajustar uma instrução SQL específica usando o RBO usando uma dica de regra ou emitindo a regra alter session set optimizer_goal=. No entanto, lembre-se sempre de que o RBO pode escolher um índice menor que o ideal para atender a uma consulta.
Optimizer_mode=escolher
o modo escolher otimizador permite que a Oracle escolha a meta mais adequada do otimizador. Este é o modo otimizador padrão no Oracle e geralmente usa a presença de estatísticas para determinar qual otimizador invocar. Se não houver estatísticas, a Oracle usará o objetivo da regra. Se existirem estatísticas, a Oracle escolherá first_rows ou all_rows, dependendo da presença de índices e da configuração para paralelismo e db_file_multiblock_read_count.
Aviso: ter estatísticas incompletas com o modo choose optimizer pode causar grandes desacelerações. Se o Oracle detectar uma única tabela em uma consulta com estatísticas, ele usará o otimizador baseado em custos e computará estatísticas para as outras tabelas em tempo de execução. Isso pode causar uma enorme desaceleração na execução do SQL. Esse problema é muito comum com os iniciantes do Oracle Remote DBA porque o modo padrão é choose e porque os DBAs remotos iniciantes às vezes emitem seletivamente o comando analyze, sem perceber que estão afetando os tempos de execução do SQL.
first_rows mode
este é um modo otimizador baseado em custos que retornará linhas o mais rápido possível, mesmo que a consulta geral seja executada por mais tempo ou consuma mais recursos. O modo first_rows optimizer geralmente envolve a escolha de uma varredura de índice completo em uma varredura paralela de tabela completa. Como o modo first_rows favorece as varreduras de índice em varreduras de tabela completa, o modo first_rows é mais apropriado para sistemas on-line onde o usuário final deseja ver alguns resultados o mais rápido possível.
all_rows mode
este é um modo otimizador baseado em custos que garante que o tempo geral de consulta seja minimizado, mesmo que demore mais para receber a primeira linha. Isso geralmente envolve a escolha de uma varredura paralela de tabela completa em uma varredura de índice completo. Como o modo all_rows favorece varreduras de tabela completa, o modo all_rows é mais adequado para consultas orientadas a lote onde linhas intermediárias não são necessárias para visualização.
o que é “melhor”? Execução rápida vs. uso mínimo de recursos.
para entender a filosofia da Oracle em relação à execução rápida e ao consumo mínimo de recursos, precisamos olhar para um exemplo simples. Para ilustrar a diferença entre all_rows e first_rows com um simples exemplo, considere a seguinte consulta:
selecione
sobrenome
de
cliente
order by
sobrenome;
Esta consulta pode ser realizada de duas maneiras:
-
tabela Completa de digitalização – Aqui realizamos uma tabela completa varredura em paralelo e classificar as linhas no tablespace TEMP. Por uma questão de ilustração, vamos supor que esse plano de execução produza o tempo de execução geral mais rápido e o uso mínimo de recursos (Figura 2).
Figura 2: Execute uma varredura de tabela completa e uma classificação (all_rows)
-
verificação de índice completo – aqui recuperamos as linhas na ordem last_name usando um last_name_index. Essa técnica resulta em leituras mais físicas, mas começa a retornar linhas classificadas quase que imediatamente (Figura 3).
Figura 3: Execute uma recuperação de índice (first_rows)
novamente, assumindo que aceitamos a varredura de tabela completa e a classificação são menos intensivas em E/S do que a varredura de índice completo, então podemos ver claramente a diferença nos Objetivos do otimizador. A verificação de índice completo começará a retornar linhas quase imediatamente à custa de E/S extra, enquanto a verificação de tabela completa exigirá menos recursos, mas o conjunto de resultados não estará disponível até o final da consulta.
este é um trecho de “Oracle high-Performance SQL Tuning” por Donald K. Burleson, publicado pela Oracle Press.