2013-08-21 76 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 

我想,这个问题是与表类型的参数,但我还是不明白为什么和什么...