我在SQL Server 2008 R2
的特定查询中遇到了奇怪的行为。我有一个查询,它执行了1900万次读取并且非常耗时,当我尝试检查其缓存计划时,该计划没有问题,没有任何问题。
执行DBCC FREEPROCCACHE
后,相同的查询执行400次读取(耗时16 ms)。结论是,查询是以错误的计划执行的,但这不是我从SQL Server获得的信息。
有谁知道发生了什么事?在下面查找我用于提取计划的查询:
SELECT
sqltext.TEXT,
sqlplan.query_plan,
req.session_id [Session ID],
p.kpid [Thread ID],
p.program_name,
req.status,
req.command,
req.cpu_time,
req.logical_reads,
req.blocking_session_id,
req.transaction_id,
req.total_elapsed_time,
req.wait_resource
FROM sys.dm_exec_requests req inner join
sys.sysprocesses p on req.session_id = p.spid
CROSS APPLY sys.dm_exec_query_plan(req.plan_handle) AS sqlplan
CROSS APPLY sys.dm_exec_sql_text(req.sql_handle) AS sqltext
和
SELECT db.name,
cp.objtype AS ObjectType,
OBJECT_NAME(st.objectid,st.dbid) AS ObjectName,
cp.usecounts AS ExecutionCount,
st.TEXT AS QueryText,
qp.query_plan AS QueryPlan
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
INNER JOIN sys.sysdatabases db on st.dbid = db.dbid
where st.TEXT like '%part_of_query%'
另一个信息是查询计划在free cache命令之前和之后是相同的。
干杯
更新
ç计IO:
表'VIA_ACL_DETAIL'。扫描计数0,逻辑读取2,物理读取0,预读取读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。 表'VIA_ENTITY'。扫描计数0,逻辑读取6,物理读取0,预读取读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。 表'VIA_ACCOUNT'。扫描计数0,逻辑读取6,物理读取1,预读取读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。 表'VIA_RESOURCE'。扫描计数0,逻辑读取15,物理读取0,预读取读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。 表'VIA_ACL'。扫描计数1,逻辑读取4,物理读取1,预读取读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。 表'VIA_BUSINESS_NODE_USER'。扫描计数1,逻辑读取3,物理读取1,预读取读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。 表'VIA_USER'。扫描计数0,逻辑读取3,物理读取1,预读取读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。