En cambio, ¿disparador o columna calculada? ¿cual es mejor?

Me preguntaba si había alguna diferencia de performance entre los dos enfoques a continuación. Básicamente, el problema es que permitimos espacios y guiones en una identificación, pero ciertas aplicaciones henetworkingadas no pueden usarlas para que se eliminen. Hasta donde puedo ver, la mejor forma de hacerlo es en un disparador o en una columna calificada. El SQL se muestra a continuación (limpiado y anonimizado así que le pedimos disculpas si se deslizó un error) Hasta ahora en nuestros serveres de testing, no parece haber ninguna diferencia entre los dos methods, ¿alguien más tiene alguna input?

[Base de datos SQL Server 2008] [Tabla de búsqueda 20000000 filas y creciendo]

Opción 1 – Crear disparador

CREATE TRIGGER triMem_Lkup on Mem_Lkup INSTEAD OF INSERT AS BEGIN INSERT INTO Mem_lkup SELECT ex_id, contact_gid, id_type_code, date_time_created, (replace(replace([ex_id],' ',''),'-','')) as ex_id_calc FROM inserted END GO 

Versus Opción 2: use una columna calculada

 CREATE TABLE [dbo].[Mem_lkup]( [mem_lkup_sid] [int] IDENTITY(1,1) NOT NULL, [ex_id] [varchar](18) NOT NULL, [contact_gid] [int] NOT NULL, [id_type_code] [char] (1) NOT NULL, [date_time_created] [datetime] NOT NULL, [ex_id_calc] AS CAST( replace( replace([ex_id],' ','') ,'-','') AS varchar(18)) PERSISTED CONSTRAINT [PK_Mem_Lkup] PRIMARY KEY NONCLUSTERED ( [mem_lkup_sid] ASC ) 

¿Cuál es el mejor?

Las columnas calculadas serán las mejores.

El activador INSTEAD OF creará primero toda la tabla pseudo inserted en tempdb .

Plan

Para la versión desencadenante con su instrucción CREATE TABLE (PK no agrupado en un montón)

 SET STATISTICS IO ON; INSERT INTO [_test].[dbo].[Mem_lkup] ([ex_id] ,[contact_gid] ,[id_type_code] ,[date_time_created]) SELECT type AS [ex_id] ,1 [contact_gid] ,'A' [id_type_code] ,getdate() [date_time_created] FROM master..spt_values 

Me da

 Table 'Worktable'. Scan count 0, logical reads 5076 Table 'spt_values'. Scan count 1, logical reads 15 Table 'Mem_lkup'. Scan count 0, logical reads 7549 Table 'Worktable'. Scan count 1, logical reads 15 

Mientras que la versión de columna calculada es similar pero evita las lecturas de la worktable .

 Table 'Mem_lkup'. Scan count 0, logical reads 7555 Table 'spt_values'. Scan count 1, logical reads 15 

Sin embargo, ¿hay alguna razón por la que estés persistiendo en este valor? (en lugar de tener una columna calculada no persistente)