参数嗅探故障排除

时间:2016-06-16 11:39:45

标签: sql sql-server

在tsql中完成某些事情需要一些帮助。 我正在收集sql探测器跟踪数据以获取特定的存储过程执行,基本上我试图从textdata列中去掉参数值 以下数据集的示例,我需要将参数值输出

exec test
exec test @aa=10
exec test @aa=10,@bb=10
exec test @aa=10,@bb=10,@cc=100
exec test @aa=10,@bb=1000,@cc=1

所以输出表可能看起来像

aa   bb     cc
10   Null  NUll
10    10   NULL
10    10   100
10   1000   1

我只是想知道传递给sp的常见参数是什么,所以如果有其他简单的方法可以告诉我。

2 个答案:

答案 0 :(得分:2)

几乎没有什么方法可以让我想一想..

1.使用计划缓存

select query_plan from sys.dm_exec_cached_plans cp
cross apply
sys.dm_exec_text_query_plan(cp.plan_handle,default,default)
where objtype='proc' and object_name(objectid)='usp_test'

现在上面的查询计划是一个xml,它将包含所有values used at compile time。这个程序非常有一些,你只会获得编译的值。但由于计划缓存失效而导致的时间由于{ {3}},随着时间的推移,您将获得新的值

2.修改你存储的proc以将所有param值插入到其他表中,如下面的

create proc usp_test
(
@a int=1,
@b int =2
)

as
begin
insert into sometable 
select @a,@b,getdate()
end

除了上述方法之外,我无法想象你可以获得传递的参数值(排除正在运行的跟踪)

如果您希望对参数嗅探进行故障排除,通过收集所有参数值,这可能不是准确的方法

答案 1 :(得分:0)

我的理解是你想要克服参数嗅探问题。

你可以这样做,

create proc usp_test
(
@aa int,
@bb int ,
@cc int
)

as
begin

    DECLARE @aa1 INT
    SET @aa1 = @aa
    DECLARE @bb1 INT
    SET @bb1 = @bb
    DECLARE @cc1 INT
    SET @cc1 = @cc


select col1,col2 from testtable
    where col1=@aa1 and col2=@bb1

end

https://www.simple-talk.com/sql/t-sql-programming/parameter-sniffing/

https://blogs.technet.microsoft.com/mdegre/2011/11/06/what-is-parameter-sniffing/