Digamos que eu tenho uma tabela chamada PEOPLE
com 3 colunas ID, LastName, FirstName
, nenhuma dessas colunas é indexada.
LastName
é mais exclusivo e FirstName
é menos exclusivo.
Se eu fizer duas pesquisas:
select * from PEOPLE where FirstName="F" and LastName="L"
select * from PEOPLE where LastName="L" and FirstName="F"
Minha opinião é que o segundo é mais rápido, porque o critério mais exclusivo ( LastName
) vem em primeiro lugar na where
cláusula e os registros serão eliminados com mais eficiência. Eu não acho que o otimizador seja inteligente o suficiente para otimizar o primeiro sql.
Meu entendimento está correto?
sql
performance
where-clause
Ziyang Zhang
fonte
fonte
Respostas:
Não, essa ordem não importa (ou pelo menos: não deveria importar).
Qualquer otimizador de consulta decente examinará todas as partes da
WHERE
cláusula e descobrirá a maneira mais eficiente de satisfazer essa consulta.Sei que o otimizador de consultas do SQL Server selecionará um índice adequado - não importa em que ordem você tenha suas duas condições. Presumo que outros RDBMS tenham estratégias semelhantes.
O que importa é se você possui ou não um índice adequado para isso!
No caso do SQL Server, ele provavelmente usará um índice se você tiver:
(LastName, FirstName)
(FirstName, LastName)
(LastName)
, ou apenas(FirstName)
(ou ambos)Por outro lado - mais uma vez para o SQL Server - se você usa
SELECT *
para agarrar todas as colunas de uma tabela, ea tabela é bastante pequena, então há uma boa chance do otimizador de consulta vai fazer apenas uma tabela (ou índice de cluster) scan em vez de usar um índice (porque a pesquisa na página de dados completa para obter todas as outras colunas fica muito cara muito rapidamente).fonte
WHERE T1.col_1/T2.col_2 > 10 AND T2.col_2 <> 0
e recebi umDIVIDE BY 0
erro. Depois que eu mudei a ordem, as condições em que a consulta foi executada com êxito. Então, troquei a ordem de volta para que eu esperasse receber o erro novamente, mas desta vez funcionou! No final, minha conclusão foi que, para a primeira execução, a ordem importa, até que o plano de execução seja construído. 'assunto t porque o plano otimizador / exec vai cuidar deleA ordem das cláusulas WHERE não deve fazer diferença em um banco de dados que esteja em conformidade com o padrão SQL. A ordem da avaliação não é garantida na maioria dos bancos de dados.
Não pense que o SQL se preocupa com o pedido. A seguir, gera um erro no SQL Server:
Se a primeira parte desta cláusula fosse executada primeiro, apenas os nomes de tabelas numéricas seriam convertidos como números inteiros. No entanto, ele falha, fornecendo um exemplo claro de que o SQL Server (como em outros bancos de dados) não se importa com a ordem das cláusulas na instrução WHERE.
fonte
ISNUMERIC(table_name) = 1
fosse avaliado primeiro,CAST
só seria chamado para nomes de tabelas numéricas. Mas, como não é avaliado primeiro, tambémCAST
é avaliado por nomes de tabela não numéricos, causando a mensagem de erro.ANSI SQL Draft 2003 5WD-01-Framework-2003-09.pdf
6.3.3.3 Ordem de avaliação da regra
...
Onde a precedência não é determinada pelos Formatos ou por parênteses, geralmente é realizada uma avaliação eficaz das expressões da esquerda para a direita. No entanto, depende da implementação se as expressões são realmente avaliadas da esquerda para a direita, principalmente quando operandos ou operadores podem causar condições a serem geradas ou se os resultados das expressões podem ser determinados sem avaliar completamente todas as partes da expressão.
copiado daqui
fonte
Não, todos os RDBMs começam primeiro analisando a consulta e otimizando-a reordenando sua cláusula where.
Dependendo de qual RDBM você estiver usando, é possível exibir qual é o resultado da análise (pesquise plano de explicação no oracle, por exemplo)
M.
fonte
Declaração OP original
Eu acho que você está confundindo isso com a seleção da ordem das colunas enquanto cria os índices em que é necessário colocar as colunas mais seletivas primeiro que a segunda mais seletiva e assim por diante.
BTW, para as duas consultas acima, o otimizador do servidor SQL não fará nenhuma otimização, mas utilizará o plano Trivila desde que o custo total do plano seja menor que o custo limite do paralelismo.
fonte
É verdade, na medida do possível, assumindo que os nomes não estejam indexados. Dados diferentes tornariam errado, no entanto. Para descobrir qual a maneira de fazê-lo, o que poderia diferir sempre, o DBMS precisaria executar uma consulta de contagem distinta para cada coluna e comparar os números, o que custaria mais do que apenas dar de ombros e continuar com ele.
fonte