gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:13:31 27 4
gpt4 key购买 nike

我想知道下面两种方法之间是否有任何性能差异。
基本上,问题是我们允许在 id 中使用空格和破折号,但某些遗留应用程序无法使用这些,因此它们被删除了。
据我所知,最简洁的方法是在触发器中或作为计算列。
SQL 如下所示(已清理并匿名,因此如果出现错误,请道歉)
到目前为止,在我们的测试服务器上,这两种方法似乎没有任何区别,还有其他人有任何意见吗?

【数据库SQL Server 2008】
【查表2000万行且不断增长】

选项 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
)

哪一个最好?

最佳答案

计算列将是最好的。
INSTEAD OF触发器将创建整个伪 inserted表中 tempdb第一的。

Plan

对于带有您的 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

给我
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读。
Table 'Mem_lkup'. Scan count 0, logical reads 7555
Table 'spt_values'. Scan count 1, logical reads 15

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

关于sql - 而是触发器或计算列?哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9911882/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com