Me preguntaba si había alguna diferencia de rendimiento entre los dos enfoques a continuación. Básicamente, el problema es que permitimos espacios y guiones en una identificación, pero ciertas aplicaciones heredadas no pueden usarlas para que se eliminen. Por lo que puedo ver, la mejor forma de hacerlo es en un desencadenante 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 servidores de prueba, no parece haber ninguna diferencia entre los dos métodos, ¿alguien más tiene alguna entrada?¿En su lugar desencadenador o columna calculada? ¿cual es mejor?
[base de datos SQL Server 2008] [Tabla de consulta 20000000 filas y en crecimiento]
Opción 1 - Crear gatillo
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 - Se utiliza 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?
Pensé que tenía que mantener la columna calculada, ya que se está utilizando como parte de un índice. (http://msdn.microsoft.com/en-us/library/ms189292.aspx#BKMK_persisted) ¿No es eso correcto? –
@EoinO - No. No para este caso, solo para valores imprecisos (float) o funciones/tipos CLR. –
Gracias @Martin, ¡Sus respuestas han sido realmente informativas! Re: comentario persistido, si está ejecutando miles de registros, ¿se calcularía este valor cada vez? –