【发布时间】:2013-08-21 07:18:09
【问题描述】:
我有一个困惑的问题。我有一个 SP,其中包含一个带有少量 JOIN 的查询(其中 2 个是 LEFT JOIN)。 SP 需要 10 秒,如果我将查询作为查询执行 - 需要 200 毫秒...
这不是参数嗅探问题:即使我清理缓存并仅使用一组参数执行 SP - 仍然很慢。 我还尝试通过重新编译来执行 SP,并在 SP 的查询中添加选项(重新编译) - 仍然很慢。
我试试这些链接:
- Query runs fast, but runs slow in stored procedure
- SQL Server: Query fast, but slow from procedure
- Query times out when executed from web, but super-fast when executed from SSMS
我还要提一下:
- SP的2个参数是table类型的。
- 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
【问题讨论】:
-
能看到SP代码吗?
-
同意@jyparask,最好提供您的代码供我们考虑=)
-
您提供的第一个链接中接受的答案应该可以解决问题。只需将输入参数复制到局部变量中,然后使用它们即可。
-
“将查询作为查询执行”是什么意思?你能展示一下运行速度快的代码吗?
-
上次重新编译 SP 是什么时候?如果它是旧的,它可能没有使用最新的索引。
标签: sql sql-server database-performance