2011-12-07 56 views
2

SQL查询存在性能问题。 这是我的查询带参数的SQL Server性能问题

declare @siteId int,  
@totalCount int 

SELECT @totalCount = COUNT(DISTINCT pro.product_id) 
    FROM product AS pro 
    INNER JOIN product_to_category AS proCat ON pro.product_id = proCat.product_id 
    INNER JOIN product_to_vendor proVen ON pro.product_id = proVen.product_id 
WHERE pro.site_id = @siteId 
    AND pro.product_type <> 3 
print @totalCount 

这是需要6秒钟的执行..

当我删除参数如下

@totalCount int 

SELECT @totalCount = COUNT(DISTINCT pro.product_id) 
FROM product AS pro 
INNER JOIN product_to_category AS proCat ON pro.product_id = proCat.product_id 
INNER JOIN product_to_vendor proVen ON pro.product_id = proVen.product_id 
WHERE pro.site_id = 28 
AND pro.product_type <> 3 
print @totalCount 

,并再次执行查询时,只需要2秒钟。

有没有一种方法来提高这样的查询性能? 为什么需要花时间为参数赋值? 有任何意见....

+1

你有什么索引在你的表上? – Taryn

+0

@Tharaka,您是否尝试在运行硬编码版本后立即重新运行查询的参数化版本?如果是这样,需要多长时间? –

+0

是product.site_id int? – gbn

回答

2

这不是一个参数,它是一个变量。

SQL Server不嗅出变量的值,因此它不知道在编译时它将包含值28

添加OPTION (RECOMPILE)到您的查询的末尾得到它重新编译后的声明变量的值已经被赋值,它应该生成一个更合适的执行计划。

+0

我试过OPTION(RECOMPILE)。对于子存储过程不适用于嵌套存储过程。是否有其他解决方案? – Tharaka

+0

你把它加到查询的末尾'... WHERE pro.site_id = @siteId AND pro.product_type <> 3 OPTION(RECOMPILE)' –