Se você possui uma determinada consulta na sua aplicação que por algum motivo está demorando demais para ser processada, é possível que haja um operador chamado Sort no Plano de Execução. Neste artigo veremos como eliminá-lo e obter ganhos reais em performance no SQL Server.

Passo 1: Entendendo o Operador Sort

O operador Sort é identificado no Plano de Execução da consulta pelo ícone em destaque na Figura 1.

Veja neste artigo como otimizar a performance de consultas no SQL Server através da remoção do operador Sort.
Figura 1. Operador Sort.

Este operador classifica todas as linhas da consulta em ordem. Isto pode levar a um alto consumo de CPU e I/O, dependendo do volume de dados, configuração do servidor, seletividade presente na consulta, etc. Assim, a menos que seja realmente necessário, devemos nos certificar que ele não esteja presente no Plano de Execução.

Passo 2: Criando o ambiente de demonstração

Para demonstrar o impacto do operador Sort e da sua remoção, criaremos duas tabelas, de nomes Carro e Venda, de acordo com a Listagem 1.

Listagem 1. Script de criação das tabelas de exemplo
CREATE TABLE Carro
(
IdCarro INT IDENTITY PRIMARY KEY,
Modelo VARCHAR(50),
Marca VARCHAR(50),
Ano VARCHAR(4)
)
GO

CREATE TABLE Venda
(
IdVenda INT IDENTITY PRIMARY KEY,
IdCarro INT,
Preco NUMERIC(12,2)
)
GO

ALTER TABLE Venda
ADD FOREIGN KEY IdCarro REFERENCES Carro (IdCarro)

Em seguida, basta adicionarmos alguns dados para os testes, conforme o script apresentado na Listagem 2, que populará as duas tabelas.

Listagem 2. Populando as tabelas criadas
INSERT INTO Carro (Modelo, Marca, Ano)
VALUES (‘HB20’,’HYUNDAY’,2015)
, (‘HB20’,’HYUNDAY’,2012)
, (‘GOL’,’VOLKSWAGEN’,2001)
, (‘CITY’,’HONDA’,2014)
, (‘CIVIC’,’HONDA’,2015)
GO

INSERT INTO Venda (Id_Carro, Preco)
VALUES (1,23300.00)
, (2,26500.00)
, (3,12000.00)
, (4,28000.00)
, (5,45000.00)
GO

Passo 3: Realizando a consulta com o Sort

Na Listagem 3 temos um exemplo de consulta que retorna o total de vendas por marca. Ao selecioná-la e pressionar CTRL+L, perceberemos a presença do operador Sort no Plano de Execução, conforme mostra a Figura 2.

Listagem 3. Exemplo de consulta que usa o operador Sort
SELECT Marca
, SUM (Preco)
FROM Venda A
INNER JOIN Carro B ON A.Id_Carro = B.IdCarro
GROUP BY
Marca
ORDER BY Marca
Veja neste artigo como otimizar a performance de consultas no SQL Server através da remoção do operador Sort.
Figura 2. Plano de execução da consulta

Passando o mouse por cima do operador Sort, vemos um resultado semelhante ao da Figura 3, que apresenta um pequeno resumo de estimativa de esforço que o SQL Server teve para ordenar a consulta. Na parte grifada em vermelho, vemos que o SQL Server está ordenando exatamente como solicitamos na Listagem 3.

Veja neste artigo como otimizar a performance de consultas no SQL Server através da remoção do operador Sort.
Figura 3. Detalhes do operador Sort

Passo 4: Eliminando o Sort do Plano de Execução

Para reduzir esse esforço, criaremos um índice na coluna Marca. Os índices são ordenados pelas colunas de modo que o Query Optimizer, que é o responsável pelo nosso Plano de Execução, os identifica e utiliza para evitar o Sort.

O código para sua criação é o seguinte:

CREATE INDEX IDX_Marca on Carro (Marca)

Agora, execute a mesma consulta da Listagem 3, utilizando CTRL + L para exibir o novo Plano de Execução. O retorno será o da Figura 4.

Veja neste artigo como otimizar a performance de consultas no SQL Server através da remoção do operador Sort.
Figura 4. Operador Sort eliminado no Plano de Execução

Perceba que o operador Sort foi eliminado e o Query Optimizer passou a utilizar o índice criado, IDX_Marca. Passe o mouse acima deste novo operador e o resultado será o da Figura 5.

Veja neste artigo como otimizar a performance de consultas no SQL Server através da remoção do operador Sort.
Figura 5. Detalhes da utilização do índice

Conclusão: Comparando ganhos de performance

A Figura 6 exibe um comparativo de ganho de performance, destacando os valores de I/O e Custo do Operador.

Veja neste artigo como otimizar a performance de consultas no SQL Server através da remoção do operador Sort.
Figura 6. Comparativo de performance com e sem o Sort

Perceba que o custo da operação foi reduzido em relação ao Sort, mesmo este sendo apenas um exemplo simples. Em ambientes reais o ganho provavelmente será bem mais expressivo.