Persistir ou não colunas calculadas no sql server

realizando testes de insert para a tabela com colunas calculadas e não persistidas tivemos os resultados, criando a tabela com 3 colunas calculadas porém não persistidas

CREATE TABLE [dbo].[Viagem_Fuso](

[Viagem] [int] NULL,

[Entrega] [varchar](30) NULL,

[Data] [datetime] NULL,

[Fuso] [smallint] NULL,

[Data_UTC]  AS (dateadd(minute, -((1)*[Fuso]),[Data])),

[Data_UTC-3]  AS (dateadd(minute, -((1)*[Fuso]+(180)),[Data])),

[Data_UTC-4]  AS (dateadd(minute, -((1)*[Fuso]+(240)),[Data]))

) ON [PRIMARY]



GO

 

utilizando o script abaixo para inserir 10 mil registros na tabela

declare @data datetime2 = getdate();

print @data;

insert into viagem_fuso values

(1,'teste', @data, -120)

go 10000

declare @data datetime2 = getdate();

print @data;

Tempo de insert  foi de 30 segundos para inserir 10 mil registros
E o tempo de leitura total foi de 196 milesegundos.

SQL Server Execution Times:

CPU time = 0 ms,  elapsed time = 0 ms.

Table ‘Viagem_Fuso’. Scan count 1, logical reads 60, physical reads 0, read-ahead reads 76, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:

CPU time = 16 ms,  elapsed time = 196 ms.

 

Os Resultados para a mesma tabela com as colunas calculadas e campos persistidos fisicamente;

 

CREATE TABLE [dbo].[Viagem_Fuso2](

[Viagem] [int] NULL,

[Entrega] [varchar](30) NULL,

[Data] [datetime] NULL,

[Fuso] [smallint] NULL,

[Data_UTC]  AS (dateadd(minute, -((1)*[Fuso]),[Data])) persisted ,

[Data_UTC-3]  AS (dateadd(minute, -((1)*[Fuso]+(180)),[Data])) persisted ,

[Data_UTC-4]  AS (dateadd(minute, -((1)*[Fuso]+(240)),[Data])) persisted

) ON [PRIMARY]

Neste novo cenário o tempo de insert foi 29seg

E o tempo de leitura foi de apenas 6milesegundos:

 

set statistics io on;
set statistics time on;

select * from viagem_fuso2

Table ‘Viagem_Fuso2’. Scan count 1, logical reads 91, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 

SQL Server Execution Times:

CPU time = 16 ms,  elapsed time = 6 ms.

 

Conclusão, colunas persistidas consomem um pouco mais de storage, memória(buffer cache), mas apresenta um ganho significativo na redução da utilização de processador no momento da leitura, e no momento do insert o impacto não é significativo.

Translate »