作为存储过程缓慢,作为查询快 - 而不是参数嗅探

时间:2013-08-21 07:18:10

标签: sql sql-server database-performance

我有一个困惑的问题。我有一个包含少量JOIN的查询的SP(其中2个是LEFT JOIN)。 SP需要10秒,如果我作为查询执行查询 - 它需要200毫秒...

这不是参数嗅探问题:即使我清理缓存并仅使用一组参数执行SP - 仍然很慢。 我还尝试使用重新编译来执行SP,并在SP中的查询中添加选项(重新编译) - 仍然很慢。

我试试这些链接:

我还要提到:

  1. SP的2个参数是表类型。
  2. SP中没有动态SQL。
  3. 那么 - 这里的故事是什么?

    这是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 个答案:

答案 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

我想这个问题与表格类型参数有关,但我仍然不明白为什么和什么......