在SQL Server 2012中,我有這個where子句一個很大的查詢:條件「去哪兒」條款和自定義功能
(1 = Case
When (@bSomeSpecialCheck = 'Y') Then
Case When (dbo.SomeFunction(SomeColumn, @SomeParam)=1) Then 1 Else 0 End
Else 1 End)
我知道「SomeFunction」是一個緩慢的過程,我希望這樣的僅在@SomeParam中存在值時才被評估。所以我寫了這種方式,因爲如果不需要,我想避免執行「SomeFunction」。
那麼,事情是,無論@bSomeSpecialCheck始終是「N」,似乎SQL Server正在評估整個案件,因爲如果我把它寫這樣的測試目的:
(1 = Case
When (@bSomeSpecialCheck = 'Y') Then
Case When (1=1) Then 1 Else 0 End
Else 1 End)
我得到即時響應,所以我知道我的慢函數「SomeFunction」正在被評估,但爲什麼? 僅當@bSomeSpecialCheck爲「Y」時,我如何避免評估SomeFunction?
你可以作爲參數添加到@bSomeSpecialCheck和dbo.SomeFunction決定裏面有什麼回報,有或沒有計算... – bummi
的只調用「SomeFunction」已經引起緩慢,因爲有大約200,000條記錄需要評估,我試圖通過使函數變爲虛擬並立即返回true,並且它與啓用內部計算一樣慢。 –
您的原始表情可以被分解。以下是功能上相當的和更簡短的:'1 = CASE WHEN @bSomeSpecialCheck ='Y'THEN dbo.SomeFunction(SomeColumn,@SomeParam)ELSE 1 END' –