Sql server 哪个更快(ISNULL(@SKU,)=“”)或(@SKU为NULL或@SKU=“”)

Sql server 哪个更快(ISNULL(@SKU,)=“”)或(@SKU为NULL或@SKU=“”),sql-server,performance,tsql,stored-procedures,Sql Server,Performance,Tsql,Stored Procedures,如果@SKU为NULL或@SKU=,我会使用一个if,但我的朋友说,与if相比,它需要更多的时间ISNULL@SKU, = . 所以你应该用IFISNULL@SKU, = . 但我想我用的是正确的。所以请告诉我哪一个跑得更快 这是我的存储过程: CREATE PROCEDURE USP_GetExistingRefunds ( @OrderNo VARCHAR(50), @SKU VARCHAR(255), @ProfileID INT ) AS

如果@SKU为NULL或@SKU=,我会使用一个if,但我的朋友说,与if相比,它需要更多的时间ISNULL@SKU, = . 所以你应该用IFISNULL@SKU, = . 但我想我用的是正确的。所以请告诉我哪一个跑得更快

这是我的存储过程:

CREATE PROCEDURE USP_GetExistingRefunds  
(  
  @OrderNo VARCHAR(50),  
  @SKU VARCHAR(255),   
  @ProfileID INT   
)  
AS   
BEGIN    
  --IF ISNULL(@SKU, '') = '' --this work faster or 
  IF @SKU IS NULL OR @SKU = '' --this work faster 
  BEGIN 
    SELECT OrderNo, SKU, ISNULL(Quantity, 0) Quantity, ISNULL(Amount, 0) Amount  
    FROM StoreRefundOrder SRO   
    INNER JOIN StoreRefundOrderItem SROI ON SRO.ID = SROI.RefundOrderID   
    WHERE SRO.OrderNo = @OrderNo    
    AND ProfileID = @ProfileID    
  END 
  ELSE
  BEGIN 
    SELECT OrderNo, SKU, ISNULL(SUM(Quantity), 0) Quantity, ISNULL(SUM(Amount), 0) Amount  
    FROM StoreRefundOrder SRO   
    INNER JOIN StoreRefundOrderItem SROI ON SRO.ID = SROI.RefundOrderID   
    WHERE SRO.OrderNo = @OrderNo   
    AND SROI.SKU = @SKU  
    AND ProfileID = @ProfileID   
    GROUP BY OrderNo, SKU   
  END    
END
如果@SKU为NULL或@SKU=同时检查NULL和blank。在第二种情况下,如果Isnull@sku,您正在检查null并为null值赋值。两者都是不同的情况

哪个更快ISNULL@SKU、=或@SKU为空或@SKU=

在这种情况下,这真的不重要。如果要与列进行比较,则SKU为NULL或SKU=更可取,因为它可以使用索引,但与变量进行单个比较的任何差异都将以微秒为单位,并与SELECT语句的执行时间相形见绌

为了简化IF语句,我可能会将其颠倒如下

  IF @SKU <> '' --Not null or empty string
  BEGIN 
    SELECT OrderNo, SKU, ISNULL(SUM(Quantity), 0) Quantity, ISNULL(SUM(Amount), 0) Amount  
    FROM StoreRefundOrder SRO   
    INNER JOIN StoreRefundOrderItem SROI ON SRO.ID = SROI.RefundOrderID   
    WHERE SRO.OrderNo = @OrderNo   
    AND SROI.SKU = @SKU  
    AND ProfileID = @ProfileID   
    GROUP BY OrderNo, SKU  
  END 
  ELSE
  BEGIN 
     SELECT OrderNo, SKU, ISNULL(Quantity, 0) Quantity, ISNULL(Amount, 0) Amount  
    FROM StoreRefundOrder SRO   
    INNER JOIN StoreRefundOrderItem SROI ON SRO.ID = SROI.RefundOrderID   
    WHERE SRO.OrderNo = @OrderNo    
    AND ProfileID = @ProfileID  
  END  

有点想发表评论

正如许多人已经注意到的,在这种情况下,你的两个选择并没有产生任何明显的区别。但在将来,当您想到几种不同的编码方式时,您可以快速轻松地实现一些标准实践,以便自己进行测试

在代码块顶部,添加以下命令:

SET STATISTICS TIME, IO ON;
您可以使用TIME或IO,但我几乎总是想同时看到这两个选项,所以我总是同时打开它们

此添加操作的输出将在一个或多个查询运行后显示在消息窗口中,并将为您提供有关哪种方法更快或对SQL Server引擎造成的压力更小的具体信息

您需要对每个选项运行一些测试。特别是热缓存/冷缓存,但几次迭代是获得平均值或消除异常值结果的最佳方法

我很奇怪,所以我总是用以下方式关闭代码块:

SET STATISTICS TIME, IO OFF;
但严格地说,这是不必要的。我只是想重置我更改的任何东西,只是为了避免忘记重置重要的东西

Kendra Little在IF/ELSE程序批处理的上下文中具有

这没有任何区别。确定值是否为空或未知实际上需要0.00毫秒,确定值是否为空则需要0.00毫秒ISNULL@SKU, = . 如果存在差异,它很可能以纳秒为单位进行测量。同样,这是在过程批处理的上下文中进行的,因为该语句只被计算一次

在筛选器上下文中,例如ON、WHERE或HAVING子句

这里的差异实际上是巨大的,不能低估。这很难用涉及的参数和变量来解释,因此,为了简洁起见,我向您展示了一个示例数据:

IF OBJECT_ID('tempdb..#things','U') IS NOT NULL DROP TABLE #things;

SELECT TOP (10000) Txt = SUBSTRING(LEFT(NEWID(),36),1,ABS(CHECKSUM(NEWID())%x.N))
INTO   #things 
FROM       (VALUES(1),(30),(40),(NULL)) AS x(N)
CROSS JOIN sys. all_columns;

UPDATE #things SET Txt = NEWID() WHERE txt = '0';

CREATE NONCLUSTERED INDEX nc_things1 ON #things(Txt);
以下查询将查找包含或不包含空格或null的行

-- Finding things that are blank or NULL
SELECT t.Txt
FROM   #things AS t
WHERE  t.Txt IS NULL OR t.Txt = '';

-- Finding things that are NOT blank or NULL
SELECT t.Txt
FROM   #things AS t
WHERE  NOT(t.Txt IS NULL OR t.Txt = '');

SELECT t.Txt
FROM   #things AS t
WHERE  t.Txt > '';

-- Finding things that are blank or NULL
SELECT t.Txt
FROM   #things AS t
WHERE  ISNULL(t.Txt,'') = '';

-- Finding things that are NOT blank or NULL
SELECT t.Txt
FROM   #things AS t
WHERE  ISNULL(t.Txt,'') <> '';

即使有任何不同的表现,我怀疑它是significant@DaleK,你说得对,我只是想念它。thanxIn数据库性能的伟大方案这是一个微不足道的情况,不值得花费任何时间。您将遇到更多影响深远的问题。例如,建议始终为对象设置架构前言,而不是从StoreReturnOrder SRO使用从dbo开始。StoreReturnOrder SRO假设您的方案是dbo。您是否从实际执行计划开始分析,以确保您没有参与其中?你知道瓶颈在哪里吗?看,OP已经说过失踪是一个打字错误。而且你没有解决性能问题——这才是问题所在!当使用SET ANSIU NULLS OFF时,这将不起作用,尽管它很快就会被禁用deprecated@kobik-是的,但我强烈建议人们不要使用该选项,我不会编写代码来满足它。
IF '' =   0  PRINT 'True' ELSE PRINT 'False'; -- Returns True
IF '' =  '0' PRINT 'True' ELSE PRINT 'False'; -- Returns False
IF '' >  -1  PRINT 'True' ELSE PRINT 'False'; -- Returns True
IF '' > '-1' PRINT 'True' ELSE PRINT 'False'; -- Returns False