簡體   English   中英

作為存儲過程慢,作為查詢快-不嗅探參數

[英]Slow as a stored procedure, fast as a query - not parameter sniffing

我有一個困惑的問題。 我有一個SP,其中包含帶有少量JOIN(其中2個為LEFT JOIN)的查詢。 SP需要10秒鍾,如果我將查詢作為查詢執行,則需要200毫秒...

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

我嘗試這些鏈接:

我還必須提到:

  1. SP的2個參數是表類型。
  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

這是解決方案:

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

我想問題出在表類型參數,但是我仍然不明白為什么和什么...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM