我在sql server 2005中有一个参数嗅探问题,用于动态参数化查询,该查询通过ado.net在C#客户端生成,并使用LocalSystem作为应用程序池的标识在IIS的Web应用程序中访问。
当我在SSMS中运行查询时它非常快,但是从客户端运行30秒后它会超时,所以我确定参数嗅探。
现在,我想查看从客户端缓存的查询的查询计划,但我似乎无法在SSMS中复制查询以使用该缓存计划。
我运行了跟踪并获得了确切的查询以及客户端使用的所有设置参数,但是当我在SSMS中运行它时,仍然没有给出缓存的查询计划。我假设这与ApplicationName,NTUserName或LoginName(也由跟踪提供)有关,但我不确定这些中的哪一个或哪些组合我需要设置(或者如何在SSMS中执行)运行查询,以便它使用缓存的查询计划。
答案 0 :(得分:0)
让查询运行,然后在运行时执行以下脚本
SELECT session_id, blocking_session_id, command, cpu_time, reads, writes, logical_reads, row_count, total_elapsed_time, granted_query_memory, DB_NAME(DATABASE_ID),
last_wait_type, wait_resource, start_time, open_transaction_count, query_plan, text
FROM master.sys.dm_exec_requests (nolock) CROSS APPLY sys.dm_exec_query_plan(plan_handle) CROSS APPLY sys.dm_exec_sql_text(sql_handle)
WHERE session_id <> @@SPID
这将返回估计的计划以及所有当前运行的查询的其他信息(您需要VIEW SERVER STATE权限)。
通常UPDATE STATISTICS会在这种情况下帮助您,或者制作您自己的统计数据。如果你想帮助查询计划在某处托管XML,我将很乐意提供帮助。