Eu tenho uma pergunta sobre o desempenho dos gatilhos.
CREATE TABLE [dbo].[_test](
[ID] [INT] IDENTITY(1,1) NOT NULL,
[Date] [DATETIME] NULL,
[DateYearID] [INT] NULL,
[DateQuarterID] [INT] NULL,
[Date1] [DATETIME] NULL,
[Date1YearID] [INT] NULL,
[Date1QuarterID] [INT] NULL)
Agora eu quero ter um gatilho que deve atualizar as colunas DateYearID e DateQuarterID se eu atualizar a coluna Date (ou inserir uma nova linha) e deve atualizar as colunas Date1YearID e Date1QuarterID se eu atualizar a coluna Date1 (ou inserir uma nova linha). O que é melhor, ter um único gatilho como
IF UPDATE(DATE)
UPDATE _test SET DateYearID = ... , DateQuarterID = ...
IF UPDATE (DATE1)
UPDATE _test SET Date1YearID = ... , Date1QuarterID = ...
ou ter dois gatilhos diferentes, primeiro deles atualizando as colunas DateYearID,DateQuarterID e o segundo atualizando as colunas DateYear1ID,DateQuarter1ID.
Estou usando o SQLServer 2014.
Muito obrigado pela ajuda.
Eu sugeriria um único gatilho, com uma única passagem inserida e/ou a tabela base, e apenas atualizando todos os quatro valores para qualquer linha afetada. Eu provei antes que evitar atualizar colunas em uma linha onde outros valores de coluna foram alterados não vale o esforço , e que atualizar a mesma linha duas vezes de dois gatilhos diferentes será mais lento .
(Além disso, apenas como um aparte, observe que
UPDATE()
informa que a coluna foi referenciada em uma instrução de atualização, mas não garante que o valor foi alterado.)E sim, concordo com o comentário de Gianluca : dependendo de como essas quatro colunas são calculadas, você pode não precisar de um gatilho. Você pode nem precisar de uma coluna computada - cálculos simples (como
DATEPART(YEAR,Date1)
) geralmente são melhor executados no momento da consulta e somente quando você precisar deles. O armazenamento de dados redundantes é superestimado - E/S e memória são muito mais importantes do que a CPU em quase todos os sistemas, mesmo com os atuais SSDs e unidades flash PCIe...