6

我似乎無法弄清楚爲什麼SQL Server在將代碼包裝到ITVF中時採取了完全不同的執行計劃。在ITVF內部自行運行代碼時,查詢將在5秒內運行。如果我將它保存爲ITVF,它將運行20分鐘而不會產生結果。我希望在ITVF中有這樣的代碼重用。任何想法將代碼保存爲ITVF都會導致嚴重的性能問題?保存爲內聯表值函數時,T-SQL代碼非常慢

CREATE FUNCTION myfunction 
(
    @start_date date, 
    @stop_date date 
) 
RETURNS TABLE 
AS 
RETURN 
(
    with 
    ad as (
     select [START_DATE] 
       ,[STOP_DATE] 
       ,ID 
       ,NAME 
       ,'domain1\' + lower(DOMAIN1_NAME) 
       collate database_default as ad_name 
     from EMP_INFO 
     where DOMAIN1_NAME != '' 
     union 
     select [START_DATE] 
       ,[STOP_DATE] 
       ,ID 
       ,NAME 
       ,'domain2\' + lower(DOMAIN2_NAME) 
       collate database_default as ad_name 
     from EMP_INFO 
     where DOMAIN2_NAME != '' 
    ) 
    select ad.ID 
      ,ad.NAME 
      ,COUNT(*) as MONITORS 
    from scores 
    join users 
     on (scores.evaluator_id = users.[user_id]) 
    join ad 
     on (lower(users.auth_login) = ad.ad_name and 
      scores.[start_date] between ad.[START_DATE] and ad.[STOP_DATE]) 
    where scores.[start_date] between @start_date and @stop_date 
    group by ad.ID 
      ,ad.NAME 
) 

編輯:

好吧...我想我想通了這個問題...但我不明白。可能我應該發佈一個全新的問題,讓我知道你的想法。這裏的問題是當我用文字調用函數時,它真的很慢......當我用變量調用它時它很快。

-- Executes in about 3 seconds 
declare @start_date date = '2012-03-01'; 
declare @stop_date date = '2012-03-31'; 
select * 
from myfunction(@start_date, @stop_date); 

--Takes forever! Never completes execution... 
select * 
from myfunction('2012-03-01', '2012-03-31') 

任何想法?

+0

對於初學者'(低(users.auth_login)= ad.ad_name'非優化搜索 – SQLMenace 2012-04-04 19:19:07

+0

不錯!是不是熟悉SARG,很好的信息,我已經移除了lower()函數,並且仍然存在相同的問題。事實上,我已經將邏輯分成了一個視圖,刪除了聚合部分,並且可以進行聚合如果我在一個函數中包裝這個視圖,我會遇到同樣的問題... – pyrospade 2012-04-04 19:57:49

+0

你可以發佈內聯和非內聯執行計劃嗎? – EBarr 2012-04-04 20:06:23

回答

5

當您使用文字時,SQL Server可以查看列統計信息來估計將返回多少行,並根據該假設選擇合適的計劃。當你使用變量的時候,這些值在編譯時是不知道的,所以它會回到猜測。

如果計劃在猜測時比預測的實際統計數字更好,那麼這表明統計數據可能需要更新。

如果你有統計數據的自動更新開啓,那麼你很可能在這裏碰到問題Statistics, row estimations and the ascending date column

+1

哇,永遠不會猜到。好信息!只要我獲得聲譽,就會投票! – pyrospade 2012-04-06 22:05:54