我的ERP供应商在桌面上有以下触发器:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[SOItem_DeleteCheck]
ON [dbo].[soitem]
FOR DELETE
AS
BEGIN
DECLARE @RecCnt int, @LogInfo varchar(256)
SET @RecCnt = (SELECT COUNT(*) FROM deleted)
IF @RecCnt > 150
BEGIN
RAISERROR (54010, 18, 1, 'SOItem') WITH LOG
ROLLBACK TRANSACTION
END
SET @LogInfo = 'Deleting ' + LTRIM(STR(@RecCnt)) + ' Rows From SOItem'
EXEC LogDeletes @LogInfo
END
GO
这对我来说似乎效率很低。不选择count(*)需要比Count(特定字段)更长的时间吗?
答案 0 :(得分:1)
老实说,即使速度较慢,我也可以在不到一毫秒的时间内在我最大的表上运行一个类似的选择,这个表有数百万行,这个触发器不太可能触及。改变它没有真正的性能提升。我很好奇你为什么要回滚超过150条记录的任何交易。
答案 1 :(得分:1)
我认为在过去,计数(1)与计数(*)有一个好处,我们都被教导使用这种方法,但在这一点上,它更多的是关于风格而不是表现。