我有以下查询。出于性能优化的原因,我被要求用SQL中的ISNULL函数替换逻辑。我怎样才能做到这一点?请指点。
SELECT CASE
WHEN tb1.[tag-value] IS NOT NULL THEN tb1.[tag-value]
ELSE 'N/A'
END AS [tag-value]
FROM @AgentTableFilt ta发布于 2015-04-16 11:55:08
这应该能满足你的需要
SELECT ISNULL(ta.[tag-value], 'N/A') AS [tag-value]
FROM @AgentTableFilt ta或者您可以使用以下方法
SELECT COALESCE(ta.[tag-value], 'N/A') AS [tag-value]
FROM @AgentTableFilt ta发布于 2015-04-16 12:43:18
与CASE相比,我不认为任何这些建议都是性能上的特别改进,因为这已经是非常基本的了。
另一种可能的选择(尽管同样不值得,因为这只是编写您的CASE的一种简短的方式)用于Server 2012及以上。
如果您实现了这一点,那么我想看看要求您优化CASE的人的反应是什么,因为应该没有任何区别。
SELECT IIF(ta.[tag-value] IS NULL, 'N/A', ta.[tag-value]) AS [tag-value]
FROM @AgentTableFilt ta我通过测试 @Martin在他的评论中进行了链接(并为IIF添加了我自己的),结果与其他选项大致相同(如果不是稍快的话)。不过,它的可读性可能稍差一些,因此它取决于您对逻辑的熟悉程度。
当然,您应该在您自己的数据上测试这一点,因为对您的服务器最优的可能不是对其他服务器最优的。
DECLARE @i INT
SET @i = 1
DECLARE @CPU INT
SET @CPU = @@CPU_BUSY
DECLARE @StartDate DATETIME
SET @StartDate = GETDATE()
WHILE @i <= 1000000
BEGIN
IF COALESCE('abc', 'def') = 'def'
PRINT 1
SET @i = @i + 1
END
PRINT 'COALESCE, both non-null'
PRINT 'Total CPU time: ' + CONVERT(varchar, @@CPU_BUSY - @CPU)
PRINT 'Total milliseconds: ' + CONVERT(varchar, DATEDIFF(ms, @StartDate, GETDATE()))
PRINT ''
GO
DECLARE @i INT SET @i = 1
DECLARE @CPU INT SET @CPU = @@CPU_BUSY
DECLARE @StartDate DATETIME SET @StartDate = GETDATE()
WHILE @i <= 1000000
BEGIN
IF ISNULL('abc', 'def') = 'def'
PRINT 1
SET @i = @i + 1
END
PRINT 'ISNULL, both non-null'
PRINT 'Total CPU time: ' + CONVERT(varchar, @@CPU_BUSY - @CPU)
PRINT 'Total milliseconds: ' + CONVERT(varchar, DATEDIFF(ms, @StartDate, GETDATE()))
PRINT ''
GO
DECLARE @i INT SET @i = 1
DECLARE @CPU INT SET @CPU = @@CPU_BUSY
DECLARE @StartDate DATETIME SET @StartDate = GETDATE()
WHILE @i <= 1000000
BEGIN
IF IIF('def' IS NULL, 'abc', 'def' ) = 'abc'
PRINT 1
SET @i = @i + 1
END
PRINT 'IIF, both non-null'
PRINT 'Total CPU time: ' + CONVERT(varchar, @@CPU_BUSY - @CPU)
PRINT 'Total milliseconds: ' + CONVERT(varchar, DATEDIFF(ms, @StartDate, GETDATE()))PRINT ''
GO合并,都是非空的
总CPU时间: 22
总毫秒: 810
ISNULL,均为非空
总CPU时间: 37
总毫秒: 910
IIF,均为非空
总CPU时间: 21
总毫秒: 783
https://dba.stackexchange.com/questions/98025
复制相似问题