Eoi*_*n O 8 sql triggers calculated-columns sql-server-2008
我想知道下面这两种方法之间是否有任何性能差异.基本上,问题是我们允许在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
Run Code Online (Sandbox Code Playgroud)
与选项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
)
Run Code Online (Sandbox Code Playgroud)
哪一个最好?
计算列将是最好的.
该INSTEAD OF触发器将创建整个伪inserted表tempdb第一.

对于带有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
Run Code Online (Sandbox Code Playgroud)
给我
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
Run Code Online (Sandbox Code Playgroud)
而计算的列版本类似但避免worktable读取.
Table 'Mem_lkup'. Scan count 0, logical reads 7555
Table 'spt_values'. Scan count 1, logical reads 15
Run Code Online (Sandbox Code Playgroud)
你有什么理由坚持这个价值吗?(而不是具有非持久计算列)
| 归档时间: |
|
| 查看次数: |
3177 次 |
| 最近记录: |