0
Posted on Monday, January 04, 2016 by 醉·醉·鱼 and labeled under

引用 http://www.brentozar.com/archive/2013/06/the-elephant-and-the-mouse-or-parameter-sniffing-in-sql-server/

什么是parameter sniffing

来看个例子。
拿AdventureWorks2012为例,执行下面的query

可以看到每个query的IO和执行计划。



创建一个SP。


CREATE PROCEDURE Get_OrderID_OrderQty
 @ProductID INT
AS 

SELECT SalesOrderDetailID, OrderQty
FROM Sales.SalesOrderDetail
WHERE ProductID = @ProductID;

执行下面的query。第一次执行的query plan会被cache起来,并被第二个query引用。问题也就出在第二次query上面。可以从IO 和执行计划上面看出,SQL SERVER使用了一个不是很好,有时候可能会使很糟糕的执行计划。IO从之前的10跑到了1246,看执行计划也会发现,预估的是返回4688条记录,实际上只有2条记录,相差太大了。






实际上,Sales.SalesOrderDetail也只有1237个page。

DBCC IND ('AdventureWorks2012', 'Sales.SalesOrderDetail', 0);

这就是parameter sniffing,由于传入的参数的不同,会倒是返回的结果集差异太大,而SQL SERVER却不能够正确的选择最优的执行计划。

0
Responses to ... 关于Parameter sniffing的那些事儿 - 什么是parameter sniffing

Post a Comment