Sql 在需要时创建变量是否有助于提高性能?

Sql 在需要时创建变量是否有助于提高性能?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,在存储过程、函数或触发器中需要时创建变量是否有助于性能优化? 以下哪一个更好,或者两者性能相同 备选案文1: 备选案文2: 对于变量,不要说得太具体,除非说一旦声明了变量,它就可以通过批处理过程使用: 变量的作用域从声明它的点一直持续到声明它的批处理或存储过程结束 我的假设是,如果你不使用文档的话,最好以后再声明,避免声明。然而,真正的答案将是对其进行测试和分析。无论哪一个在实践中效果更好,都将是真正的解决方案,IMHO 我也希望这不是一个过早的优化。如果为了让脚本运行得更快而采用声明顺序,那么

在存储过程、函数或触发器中需要时创建变量是否有助于性能优化? 以下哪一个更好,或者两者性能相同

备选案文1:

备选案文2:

对于变量,不要说得太具体,除非说一旦声明了变量,它就可以通过批处理过程使用:

变量的作用域从声明它的点一直持续到声明它的批处理或存储过程结束

我的假设是,如果你不使用文档的话,最好以后再声明,避免声明。然而,真正的答案将是对其进行测试和分析。无论哪一个在实践中效果更好,都将是真正的解决方案,IMHO


我也希望这不是一个过早的优化。如果为了让脚本运行得更快而采用声明顺序,那么您可能找错了地方。

您可能想先了解一下这一点:同意GranadCoder-因为这两种方法都不正确,因为它们都假设插入和删除的脚本包含一行,所以我不会重点关注这一点。一旦切换到执行基于集合的更新,可能根本就不会有任何局部变量;这就像在你最喜欢的跑鞋上挑选空气动力学鞋带来缩短你的冲刺时间。如果你要声明表变量,这可能是一个大问题,我仍然认为这不是问题所在,但考虑到内存占用较大,这可能是有争议的,但确定应该声明浮动的位置甚至不值得研究。如果查询速度变慢,那么分析一下查询,看看它是如何执行的。引入表是否会减慢查询速度,PKs是否有意义,等等。
CREATE TRIGGER [dbo].[UpdateAmount] ON [RequestDB].[dbo].[Invoice]
AFTER UPDATE
AS
BEGIN
 IF UPDATE(Service_Amount)
 BEGIN
  DECLARE @NewService_Amount float,@OldService_Amount float //Var Created When needed
  SELECT @NewService_Amount = I.Service_Amount FROM INSERTED I
  SELECT @OldService_Amount = D.Service_Amount FROM DELETED D   
  IF (@NewService_Amount <> @OldService_Amount)
  BEGIN
   SELECT @InvId = I.Id FROM INSERTED I 
   DECLARE @DiffService_Amount float //Var Created When needed
   SET @DiffService_Amount = @NewService_Amount - @OldService_Amount
   UPDATE [RequestDB].[dbo].[Request] SET Actual_Amount = @DiffService_Amount WHERE Invoice_Id = @InvId
  END
 END
END
CREATE TRIGGER [dbo].[UpdateAmount] ON [RequestDB].[dbo].[Invoice]
AFTER UPDATE
AS
BEGIN
 DECLARE @NewService_Amount float,@OldService_Amount float.@DiffService_Amount float //All Var Created at once on top of code
 IF UPDATE(Service_Amount)
 BEGIN
  SELECT @NewService_Amount = I.Service_Amount FROM INSERTED I /*For New UPDATE Value: INSERTED. For Old BEFORE UPDATE Valie: DELETED*/
  SELECT @OldService_Amount = D.Service_Amount FROM DELETED D   
  IF (@NewService_Amount <> @OldService_Amount)
  BEGIN
   SELECT @InvId = I.Id FROM INSERTED I 
   SET @DiffService_Amount = @NewService_Amount - @OldService_Amount
   UPDATE [RequestDB].[dbo].[Request] SET Actual_Amount = @DiffService_Amount WHERE Invoice_Id = @InvId
  END
 END
END