Digamos que eu tenha uma tabela agrupada em PrimaryKey e, em todos os casos, desejo que meus resultados sejam ordenados por PrimaryKey , portanto, sempre ORDER BY PrimaryKey
em todas as consultas.
Isso ORDER BY
afeta o desempenho de alguma forma ou é ignorado pelo criador de perfil porque as linhas já estão nessa ordem?
Estou usando um banco de dados SQL Server 2005.
É quase certo que afetará o desempenho.
Se você acabou de fazer uma consulta como
Provavelmente não afetará nada.
Tenha em mente, porém, que isso apenas determina a ordem das linhas no nível folha do índice clusterizado. Se você fizer isso
JOIN
ou usar outros índices que evitem pesquisas de chave,ORDER BY
isso gerará trabalho adicional.Se todos os índices e todas as tabelas que você fará
JOIN
ou referenciará ao consultar esta tabela forem todos ordenados pela mesma chave (na mesma direção), isso provavelmente não afetará o desempenho. Fora desse cenário muito limitado, você verá um sucesso.Use apenas
ORDER BY
quando a ordem dos resultados realmente importa. Na minha experiência, raramente é necessário.Para uma consulta complexa, o SQL Server pode decidir que precisa classificar partes dos dados em sua consulta e pode até exigir vários operadores de classificação com base nos índices disponíveis e na complexidade de sua consulta.
Essas classificações podem definitivamente afetar o desempenho de sua consulta, especialmente se você estiver trabalhando com tabelas grandes e, em alguns casos, descobrirá que adicionar uma instrução Order By alterará significativamente o plano de execução que o SQL Server gera para sua consulta.
Se você estiver interessado em ver o impacto da classificação das consultas que está ajustando, execute o plano real com o SQL Sentry Plan Explorer (gratuito) ou use o SSMS com "Incluir plano de execução real" ativado e observe o Indicador ordenado passando o mouse sobre as etapas de dados individuais no plano. No Plan Explorer, você também pode ver a coluna Ordered na visualização Plan Tree ou Top Operations.
Para algo tão simples como:
Você deve descobrir que, embora Ordenar por não pareça alterar o plano de consulta de sua consulta, o indicador Ordenado no plano de execução muda de Falso para Verdadeiro quando você adiciona Ordenar por.
Você deve ter ouvido que "a ordem dos resultados retornados de uma instrução SELECT não pode ser garantida sem uma cláusula ORDER BY" ; Uma razão para isso é um recurso do Enterprise Edition do SQL Server que permite que o SQL Server pegue carona uma varredura de tabela em cima da outra, às vezes chamada de varredura "Merry-go-round" e também chamada de "Verificação avançada" .
Para pesquisas adicionais, recomendo fortemente os dois livros a seguir, atualmente disponíveis como e-books gratuitos da RedGate:
Espero que isto ajude!
Observe o plano de consulta para ambas as consultas, você verá que a cláusula "ordenar por" resultará em uma espécie de dados que são retornados pelo restante da consulta (que deve estar na memória, mas pode ser paginado se a memória for insuficiente ). O tempo que a classificação leva está relacionado à quantidade de dados (é preciso percorrê-la pelo menos uma vez) e quão bem ordenados os dados já estão (eles podem ser ordenados corretamente se você estiver classificando em uma coluna indexada ou dados unidos em um coluna indexada)