Guia SQL Server

Performance no SQL Server: eliminando o operador Sort

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (15)  (0)

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

Motivação

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.

Veja neste artigo como otimizar a performance de consultas no SQL Server através da remoção do operador Sort. Saiba mais sobre o Plano de Execução

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.

01  CREATE TABLE Carro
02  (
03  	IdCarro INT IDENTITY PRIMARY KEY,
04	Modelo VARCHAR(50),
05	Marca VARCHAR(50),
06	Ano VARCHAR(4)	
07  )
08  GO
09
10  CREATE TABLE Venda
11  (
12     IdVenda INT IDENTITY PRIMARY KEY,
13     IdCarro INT,
14     Preco NUMERIC(12,2)
15   )
16   GO
17   
18   ALTER TABLE Venda
19   ADD FOREIGN KEY IdCarro REFERENCES Carro (IdCarro)
Listagem 1. Script de criação das tabelas de exemplo

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

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
Listagem 2. Populando as tabelas criadas

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.

SELECT	Marca
,	SUM (Preco)
FROM	Venda A
INNER JOIN Carro B ON A.Id_Carro = B.IdCarro
GROUP BY
  Marca
ORDER BY Marca
Listagem 3. Exemplo de consulta que usa o operador Sort 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. Saiba mais sobre o SQL Server
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)

Veja neste artigo como otimizar a performance de consultas no SQL Server através da remoção do operador Sort. Saiba mais sobre as melhores práticas com índices

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.

Veja neste artigo como otimizar a performance de consultas no SQL Server através da remoção do operador Sort. Saiba mais sobre o Processamento no SQL Server

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?