2013-08-21 80 views
0

我有一個困惑的問題。我有一個包含少數JOIN的查詢(其中2個是LEFT JOIN)。 SP需要10秒鐘,如果我執行查詢作爲查詢 - 這需要200毫秒... ...緩慢的存儲過程,快速查詢 - 不參數嗅探

這不是參數嗅探問題:即使我清理緩存並執行SP只有一組參數 - 仍然很慢。 我也嘗試使用重新編譯來執行SP,並在SP中的查詢中添加選項(重新編譯) - 仍然很慢。

我嘗試這些鏈接:

我也有提及:的

  1. 2參數SP是表格類型。
  2. SP中沒有動態SQL。

那麼 - 這裏有什麼故事?

這是SP代碼:

CREATE PROCEDURE [dbo].[spr_spr] 
    @ListOfIDs dbo.tt_IDsList READONLY, -- (one column - ID) 
    @ListOfTwoIDs dbo.tt_TwoIDsRelationList READONLY, -- (two columns - FirstID, SecondID) 
    @SomeID int = NULL 
AS 

IF @SomeID IS NULL 
    SELECT ..... , 
      cast ((CASE WHEN le.ID IS NOT NULL THEN 1 ELSE 0 END) as bit) as HasLinkedID 
    FROM  @ListOfIDs ids 
    JOIN  dbo.tbl1 ra    ON ids.ID = ra.RR_RowID           
    JOIN  dbo.tbl2 rr    ON ra.RR_RowID = rr.RowID 
    JOIN  dbo.tbl3 res   ON res.tbl3ID = ra.tbl3ID 
    JOIN  dbo.tbl4 cal   ON cal.ObjectID = rr.ObjectID 
    JOIN  @ListOfTwoIDs IdsRel ON cal.FirstID = IdsRel.FirstID 
             AND res.SecondID = IdsRel.SecondID 
    LEFT JOIN dbo.tbl5 p    ON ra.tbl5ID = p.tbl5ID 
    LEFT JOIN dbo.tbl6 le    ON le.tbl6ID = ra.tbl6ID 

ELSE 
    .... -- same query with one change 
+1

我們可以看到SP代碼嗎? –

+0

與@jyparask一致,最好是提供你的代碼供我們考慮=) –

+0

從你提供的第一個鏈接接受的答案應該做的伎倆。只需將您的輸入參數複製到局部變量中,然後使用它們。 –

回答

0

這是解決方案:

CREATE TABLE #ListOfIDs (ID int) 
insert into #ListOfIDs (ID) select ID from @ListOfIDs 

CREATE TABLE #ListOfTwoIDs (FirstID int, SecondID int) 
insert into #ListOfTwoIDs (FirstID, SecondID) select FirstID, SecondID from @ListOfTwoIDs 

我想,這個問題是與表類型的參數,但我還是不明白爲什麼和什麼...