Eu tenho um banco de dados SQL Server com uma frase de atualização executada com muita frequência. Eu vi no Activity Monitor que esta frase de atualização dispara 27ms e quero melhorá-la.
Eu verifiquei o plano de execução e vi que a frase de atualização atualiza os índices da exibição:
a consulta de atualização é esta:
UPDATE Code
SET CommissioningFlag = @newCommFlagValue
, Source = @source
, UserName = @username
, LastChange = CAST(SYSDATETIMEOFFSET() as nvarchar(50))
, SentToNextLevel = 0
, HelperCodeId = @helperCodeId
WHERE CodeId = @codeId
E o script realçado da exibição é:
CREATE VIEW dbo.PrintedCodesStatistics
WITH SCHEMABINDING
AS
SELECT AggregationLevelId, COUNT_BIG(*) as CodesPrinted
FROM dbo.Code
WHERE (CommissioningFlag != 255)
GROUP BY AggregationLevelId
GO
CREATE UNIQUE CLUSTERED INDEX [IX_Printed_Statistics]
ON [dbo].[PrintedCodesStatistics]([AggregationLevelId] ASC);
E, finalmente, Code
script de 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)
As exibições retardam a consulta de atualização?
As exibições indexadas contribuem para a sobrecarga de gravação tanto quanto os índices regulares nas tabelas, se não mais.
Toda vez que você escreve nas tabelas base, o índice na visão deve ser atualizado imediatamente.
Tal como acontece com os índices regulares, há uma compensação: se o seu índice desacelerar razoavelmente e aumentar significativamente o desempenho nas leituras, mantenha-o. Se não, livre-se dele.