有没有人通过SQL2005/2008的计划缓存标识查询或存储过程在其执行计划中有表/索引扫描的查询?正在搜索表/索引扫描
4
A
回答
4
皮纳尔戴夫实际上做了一个关于这个帖子,并在他的原始文章(几乎没有任何改动要求!)的一些变化,你可以得到正确的答案。如果他有一个帐户,信用卡他:)
了他的问题是:
WITH XMLNAMESPACES(DEFAULT N'http://schemas.microsoft.com/sqlserver/2004/07/showplan'),
CachedPlans
(
ParentOperationID,
OperationID,
PhysicalOperator,
LogicalOperator,
EstimatedCost,
EstimatedIO,
EstimatedCPU,
EstimatedRows,
PlanHandle,
QueryText,
QueryPlan,
CacheObjectType,
ObjectType)
AS
(
SELECT
RelOp.op.value(N'../../@NodeId', N'int') AS ParentOperationID,
RelOp.op.value(N'@NodeId', N'int') AS OperationID,
RelOp.op.value(N'@PhysicalOp', N'varchar(50)') AS PhysicalOperator,
RelOp.op.value(N'@LogicalOp', N'varchar(50)') AS LogicalOperator,
RelOp.op.value(N'@EstimatedTotalSubtreeCost ', N'float') AS EstimatedCost,
RelOp.op.value(N'@EstimateIO', N'float') AS EstimatedIO,
RelOp.op.value(N'@EstimateCPU', N'float') AS EstimatedCPU,
RelOp.op.value(N'@EstimateRows', N'float') AS EstimatedRows,
cp.plan_handle AS PlanHandle,
st.TEXT AS QueryText,
qp.query_plan AS QueryPlan,
cp.cacheobjtype AS CacheObjectType,
cp.objtype AS ObjectType
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qp
CROSS APPLY qp.query_plan.nodes(N'//RelOp') RelOp (op)
)
SELECT
PlanHandle,
ParentOperationID,
OperationID,
PhysicalOperator,
LogicalOperator,
QueryText,
CacheObjectType,
ObjectType,
EstimatedCost,
EstimatedIO,
EstimatedCPU,
EstimatedRows
FROM CachedPlans
WHERE CacheObjectType = N'Compiled Plan'
而且你要上到底有什么特别的是扫描类型(集群,表和索引)
and
(PhysicalOperator = 'Clustered Index Scan' or PhysicalOperator = 'Table Scan'
or PhysicalOperator = 'Index Scan')
获取计划缓存的基本查询并不难,而且您可以手动kruft XQuery,但公平起见,Pinal做了一个很好的版本,因此不让reinv恩。
2
这花了一段时间来说服它给我的答案,但它是一个小小的变化。如果你想要导致扫描的对象名称,那么它可以完成,但是有问题。
有一件事正在限制它的有效性。 Object_Name/sys.Objects的范围是针对数据库的,因此您要从缓存中为任何数据库提取所有计划,但只能命名您当前使用的数据库中的计划。
对象ID不能保证在数据库之间是唯一的,所以有可能给出的ID与您当前的数据库以及另一个ID相匹配,您将得到由它返回的不正确的名称,所以它不是完美的手段。同样,如果您看到对象ID> 0但没有给定名称的任何内容意味着计划来自对象而不是特设查询,但有关该名称的信息位于服务器内不同数据库的系统视图中。
在单个数据库中的服务器上,至少应该是正确的,但是应该用它给出的名称作为指示,而不是福音。
WITH XMLNAMESPACES
(DEFAULT N'http://schemas.microsoft.com/sqlserver/2004/07/showplan'),
CachedPlans
(
ParentOperationID,
OperationID,
PhysicalOperator,
LogicalOperator,
EstimatedCost,
EstimatedIO,
EstimatedCPU,
EstimatedRows,
PlanHandle,
QueryText,
QueryPlan,
CacheObjectType,
ObjectType,
ObjectID)
AS
(
SELECT
RelOp.op.value(N'../../@NodeId', N'int') AS ParentOperationID,
RelOp.op.value(N'@NodeId', N'int') AS OperationID,
RelOp.op.value(N'@PhysicalOp', N'varchar(50)') AS PhysicalOperator,
RelOp.op.value(N'@LogicalOp', N'varchar(50)') AS LogicalOperator,
RelOp.op.value(N'@EstimatedTotalSubtreeCost ', N'float') AS EstimatedCost,
RelOp.op.value(N'@EstimateIO', N'float') AS EstimatedIO,
RelOp.op.value(N'@EstimateCPU', N'float') AS EstimatedCPU,
RelOp.op.value(N'@EstimateRows', N'float') AS EstimatedRows,
cp.plan_handle AS PlanHandle,
st.TEXT AS QueryText,
qp.query_plan AS QueryPlan,
cp.cacheobjtype AS CacheObjectType,
cp.objtype AS ObjectType,
qp.objectid
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qp
CROSS APPLY qp.query_plan.nodes(N'//RelOp') RelOp (op)
)
SELECT
PlanHandle,
ParentOperationID,
OperationID,
PhysicalOperator,
LogicalOperator,
QueryText,
CacheObjectType,
ObjectType,
EstimatedCost,
EstimatedIO,
EstimatedCPU,
EstimatedRows,
QueryPlan,
C.ObjectID,
Object_Name(C.ObjectID)
FROM CachedPlans C
Where
(PhysicalOperator = 'Clustered Index Scan'
or
PhysicalOperator = 'Table Scan'
or
PhysicalOperator = 'Index Scan'
)
相关问题
- 1. 全表扫描或索引扫描
- 2. 索引搜索与聚集索引扫描 - 为什么选择扫描?
- 3. 搜索与扫描
- 4. 表扫描和索引
- 5. 为什么这是索引扫描而不是索引搜索?
- 6. 索引搜索与SQL Server中的索引扫描
- 7. 向后索引扫描与索引扫描
- 8. 索引扫描,表扫描和索引查找有什么区别?
- 9. 索引范围扫描VS索引跳跃式扫描VS索引快速全扫描
- 10. 索引扫描关系
- 11. 聚集索引扫描
- 12. Oracle索引 - 全表扫描/锁定
- 13. 表没有做索引扫描
- 14. 多个索引与强制表扫描
- 15. Sql索引与全表扫描
- 16. 如何直接扫描SQL索引表
- 17. 搜索更高值时索引扫描性能下降
- 18. MySQL的 - 自加入 - 全表扫描(无法扫描索引)
- 19. 表扫描和聚簇索引扫描有什么区别?
- 20. 为什么QO选择聚簇索引扫描与表扫描?
- 21. 为什么索引搜索变得比索引扫描更昂贵
- 22. 为什么选择索引范围扫描通过快速全索引扫描
- 23. 为什么在索引列时收到聚集索引扫描?
- 24. 通过excel列扫描搜索ID
- 25. 如何扫描文件以搜索值
- 26. PostgreSQL的优化:Sequantial扫描VS索引扫描
- 27. 如何确定位图堆扫描和索引扫描?
- 28. DB2 IN-list访问,索引扫描,TS扫描
- 29. PostgreSQL的速度很慢索引扫描
- 30. 为什么会有索引扫描?
以任何方式获得结果集中的过程名称? – 2009-10-14 12:55:41
理论上是的,尽管我必须通过并测试。你不能直接从XML查询计划中抓取它,因为它不在那里,但是查询访问sys.dm_exec_query_plan,它包括objectid列,它为存储的proc/functions提供了一个值,但为adhoc查询/批处理提供了一个空值。左加入到sys.objects并理论上,您有SP名称。 – Andrew 2009-10-14 13:45:46
@KM - 发布修改后的版本以提供过程名称,如果它可以解决它。 – Andrew 2009-10-14 14:33:33