2014-07-14 31 views
0

我有下面列的表格,性能ISNULL的

ID(int), 
RegardingContactID(int), 
RegardingAccountId(int), 
RegardingIncidentID(int), 
RegardingType(varchar) 

RegardingType可以是“联系人”,“帐户”,“九一八”事变

基本上我想抽象所有RegardingXXXID列如下:

SELECT 
    ID, 
    ISNULL(RegardingContactID, ISNULL(RegardingAccountId, RegardingIncidentID)) AS RegardingID, 
    RegardingType 

这似乎意在工作,但ISNULL并不显得高性能大型数据集。

是否有一个更优雅/高性能的方式来实现这一目标?

+1

为什么你认为'isnull'这是造成糟糕表现的原因? –

+0

因为我在没有ISNULL的情况下运行SELECT,并在单独的查询中返回每个ID列,并使用ISNULL将其与上面的查询进行比较 –

+2

不要与三个不同的查询进行比较。与在相同查询中将值返回为三列进行比较。 –

回答

1

我建议你使用COALESCE代替ISNULL

SELECT ID, 
     COALESCE(RegardingContactID, RegardingAccountId, RegardingIncidentID) AS RegardingID, 
+0

什么使你相信COALESCE比Isnull更好 –

+0

@NeerajPrasadSharma。在一个阶段执行'COALESCE'具有比执行'ISNULL'两次更好的性能。 –

+0

'COALESCE'也是ANSI标准SQL,而'ISNULL'是MS特定的扩展。 –

1

如果我们挖多一点,COALESCE基本上转化为CASE声明SQL Server引擎到这样的事情:

select case 
     when RegardingContactID is not null then RegardingContactID 
     when RegardingAccountId is not null then RegardingAccountId 
     when RegardingIncidentID is not null then RegardingIncidentID 
     end AS RegardingID 

但您可能会以此结束:

select case 
     when RegardingType = 'Contact' then RegardingContactID 
     when RegardingType = 'Account' then RegardingAccountId 
     when RegardingType = 'Incident' then RegardingIncidentId 
     end as RegardingID 

其中,imho与您的原始目标更相关。

PS。 ISNULL性能相当不错。这只是评估链(3次)可能会导致性能下降。

0

正如其他人所说,COALESCE是更优雅,可能会表现更好。

但关于性能,我建议基准两种方法,这是如何实现它的唯一方法。另一种方法可能是选择所有3列,并在处理查询结果的应用程序中选择正确的一列。