2014-07-14 30 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列,並在處理查詢結果的應用程序中選擇正確的一列。