Mito T-SQL: Cláusula GROUP BY garante ordenação do result set

De vez em quando alguém me questiona: é realmente necessário explicitar uma cláusula ORDER BY quando utilizo um GROUP BY? O GROUP BY não força o ordenamento da query?

A resposta que costumo deixar é “Não. GROUP BY não garante ordenação”.  Isso é fato e o contrário é mito.

 

Vejamos alguns exemplos simples que comprovam essa questão.

use Northwind
go

— Esta query não retorna resultado ordenado
select o.ShipCountry, count(*) qt
from dbo.Orders o
group by o.ShipCountry

— Result set

image

— Plano de execução

image

Observe que no plano de execução não existe o operador SORT, responsável justamente por fazer a ordenação.

 

No segundo exemplo, a seguir, estou agrupando por duas colunas e deixando sem cláusula ORDER BY.

— Agrupando com duas colunas sem ORDER BY
select o.ShipCountry, o.ShipCity, count(*) qt
from dbo.Orders o
group by o.ShipCountry, o.ShipCity

 

Vamos agora observar o plano de execução para entendermos o que o otimizador fez.

image

Inicialmente nota-se que foi incluído um Sort, justamente porque estamos agrupando por mais de uma coluna. Mas qual o critério de ordenação nesse caso?

image

Veja que o otimizador escolheu ordenar de “forma contrária”: primeiro por cidade e depois por país. Portanto, o resultado não será o esperado, já que para esse exemplo, o natural é que os registros sejam listados na ordem Páis – Cidade.

image

 

Assim feito, só nos resta aplicar uma tradicional clásula ORDER BY para garantir a ordenação esperada pelo usuário.

select o.ShipCountry, o.ShipCity, count(*) qt
from dbo.Orders o
group by o.ShipCountry, o.ShipCity
order by o.ShipCountry, o.ShipCity

O plano de execução gerado é o mesmo, exceto que agora, para o operador Sort, o otimizador seguiu a ordem explicitada em ORDER BY.

image

 

Segue o result set:

image

Até o próximo post.



Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s