Вместо триггера или вычисляемого столбца? что лучше?

Мне было интересно, есть ли какая-либо разница в производительности между двумя подходами, описанными ниже. По сути, проблема в том, что мы разрешаем пробелы и тире в идентификаторе, но некоторые устаревшие приложения не могут их использовать, поэтому они удаляются. Насколько я вижу, самый аккуратный способ сделать это - либо в триггере, либо в виде вычисляемого столбца. Ниже приведен SQL-код (, очищенный и анонимизированный, поэтому приносим извинения, если вкралась ошибка). Пока что на наших тестовых серверах нет никакой разницы между этими двумя методами. Есть ли у кого-нибудь еще какие-либо комментарии?

[База данных SQL Server 2008] [Таблица поиска 20000000 строк и растет]

Вариант 1 -Создать триггер

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

По сравнению с Вариант 2 -использовать вычисляемый столбец

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
)

Какой из них лучше?

8
задан Eoin O 28 March 2012 в 16:31
поделиться