Tenho um banco de dados no SQL Server 2012 SP3 com esta tabela:
CREATE TABLE [dbo].[Code] (
[CodeId] INT IDENTITY (1, 1) NOT NULL,
[Serial] NVARCHAR (20) NOT NULL,
[AggregationLevelId] TINYINT NOT NULL,
[...],
CONSTRAINT [PK_CODE] PRIMARY KEY CLUSTERED ([CodeId] ASC),
CONSTRAINT [UC_CODE_SERIAL] UNIQUE NONCLUSTERED ([Serial] ASC)
)
Usando o Sql Server Management Studio Activity Monitor, vi que a seleção a seguir tem uma duração média de 32 ms.
set @maxCode = (select max(Serial) from Code where AggregationLevelId = @codeLevel);
Existe alguma maneira de melhorá-lo? Eu perguntei isso porque não sei se posso adicionar um novo índice a uma coluna que tenha uma restrição exclusiva.
ATUALIZAR:
Code
tabela também tem este índice:
CREATE NONCLUSTERED INDEX [ix255] ON [dbo].[Code]
(
[AggregationLevelId] ASC
)
INCLUDE ( [Serial],
[CodeId])
WHERE ([CommissioningFlag]=(255))
Para o melhor desempenho de sua consulta, a tabela deve ter um índice em
(AggregationLevelId, Serial)
. Um índice em duas colunas. A ordem das colunas no índice é importante. ComoSerial
é único, esse índice de duas colunas também pode e deve ser declarado único.Você pode criar esse índice além dos índices e restrições existentes. Não há limitação. Isso afetará o desempenho de inserções e atualizações como qualquer outro índice extra.
Provavelmente, o otimizador usaria uma única busca em tal índice para sua consulta, mas ocasionalmente me deparei com uma situação em que a consulta
MAX
não teve um bom desempenho, mesmo com o índice de suporte adequado. (lembro vagamente que acontecia quando a tabela não tinha linhas para o dadoAggregationLevelId
).Então, eu pessoalmente uso a variante equivalente da consulta:
O otimizador deve ser inteligente o suficiente para usar o índice com
Serial ASC
, mesmo que a consulta seja ordenada porSerial DESC
.