Sql server 哪个更快(ISNULL(@SKU,)=“”)或(@SKU为NULL或@SKU=“”)
如果@SKU为NULL或@SKU=,我会使用一个if,但我的朋友说,与if相比,它需要更多的时间ISNULL@SKU, = . 所以你应该用IFISNULL@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
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