而是触发器或计算列?哪个更好?

2024-01-12

我想知道下面两种方法之间是否存在性能差异。 基本上,问题是我们允许在 id 中使用空格和破折号,但某些遗留应用程序无法使用它们,因此它们被删除。 据我所知,最简洁的方法是在触发器中或作为计算列。 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
)

哪一个最好?


计算列将是最好的。

The INSTEAD OF触发器将创建整个伪inserted表中tempdb first.

对于带有您的触发器版本CREATE TABLE声明(堆上的非聚集PK)

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

Gives me

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

而计算列版本类似,但避免了worktable reads.

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

你有什么理由坚持这个价值观吗? (与非持久计算列相反)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

而是触发器或计算列?哪个更好? 的相关文章

随机推荐