Estou otimizando meu banco de dados SQL Server usando o SQL Server Management Studio Activity Monitor.
As duas sentenças SQL mais caras são:
set @codesToPrintCount =
(select count(CodeId)
from Code
where CommissioningFlag = 255
and AggregationLevelId = @codeLevel);
SET @code = (SELECT TOP 1 Serial
FROM Code
WHERE CommissioningFlag = 255
and AggregationLevelId = @codeLevel);
Este é Code
o script sql da tabela:
CREATE TABLE [dbo].[Code] (
[CodeId] INT IDENTITY (1, 1) NOT NULL,
[Serial] NVARCHAR (20) NOT NULL,
[AggregationLevelId] TINYINT NOT NULL,
[CommissioningFlag] TINYINT NOT NULL,
[ ... ]
CONSTRAINT [PK_CODE] PRIMARY KEY CLUSTERED ([CodeId] ASC),
CONSTRAINT [UC_CODE_SERIAL] UNIQUE NONCLUSTERED ([Serial] ASC),
CONSTRAINT [FK_Code_AggregationLevelConfiguration]
FOREIGN KEY ([AggregationLevelId])
REFERENCES [dbo].[AggregationLevelConfiguration] ([AggregationLevelConfigurationId])
)
Não sei como posso acelerar essas frases.
Há mais linhas Code
nessa tabela com o mesmo valor na AggregationLevelId
coluna do que colunas com o valor 255 em CommissioningFlag
. Ou seja, na Code
tabela existem 1.050.000 linhas com valor AggregationLevelId
igual a @codeLevel
e 32 linhas ou menos com valor 255 na CommissioningFlag
coluna.
É uma boa ideia adicionar dois índices nesta tabela? Um para CommissioningFlag
e outro para AggregationLevelId
.
Neste momento, existem 1.100.000 linhas na Code
tabela e elas levam 23ms e 78ms, respectivamente, para serem executadas.
A propósito, essas duas frases estão em um procedimento armazenado.
Se você não estiver interessado em linhas que não sejam 255, poderá usar um índice filtrado:
Isso significa que ele indexará apenas aqueles que tiverem 255, na ordem AggregationLevelId, incluindo os valores de Serial e CodeId porque você precisa contar/retorná-los.
Se você não puder (ou não quiser) usar um índice filtrado, tente o seguinte (conforme sugerido originalmente em um comentário):