如何快速查看大型执行计划中IO成本、CPU成本等的总成本?
嘿,这个问题我太熟了——处理大型执行计划时手动加总每个节点的成本真的是噩梦!下面给你分数据库讲几个直接拿总成本的实用方法,不用再一个个掰手指头算:
针对不同数据库的快速查看方法
SQL Server
- 图形执行计划(SSMS):打开执行计划后,右键点击最顶部的根节点(一般是SELECT/INSERT/UPDATE这类语句节点),选择「属性」。在弹出的属性面板里,直接找
Total CPU、Total IO、Total Cost这些字段,全都是整个执行计划的汇总值,根本不用管下面的子节点。 - XML执行计划解析:如果是用
SET SHOWPLAN_XML ON或者实际执行计划导出的XML,要么直接用XML工具查看顶层QueryPlan节点的TotalCost/TotalCPU/TotalIO属性,要么用系统函数快速查询:
SELECT qp.query_plan.value('declare namespace p="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; (/p:ShowPlanXML/p:BatchSequence/p:Batch/p:Statements/p:StmtSimple/p:QueryPlan/@TotalCost)[1]', 'float') AS TotalCost, qp.query_plan.value('declare namespace p="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; (/p:ShowPlanXML/p:BatchSequence/p:Batch/p:Statements/p:StmtSimple/p:QueryPlan/@TotalCPU)[1]', 'float') AS TotalCPU, qp.query_plan.value('declare namespace p="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; (/p:ShowPlanXML/p:BatchSequence/p:Batch/p:Statements/p:StmtSimple/p:QueryPlan/@TotalIO)[1]', 'float') AS TotalIO FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp -- 替换成你的查询对应的sql_handle或plan_handle WHERE qs.sql_handle = (SELECT sql_handle FROM sys.dm_exec_sql_text(0x01000600D74C2703B076D200600000000000000000000000));
PostgreSQL
- JSON格式执行计划:执行
EXPLAIN (ANALYZE, FORMAT JSON),输出的JSON结构里,顶层节点的Total Cost就是整个计划的总成本。如果要更细的CPU/IO耗时,还能看Planning Time和Execution Time字段;要是想查IO细节,再加BUFFERS参数:EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON)。 - pgAdmin图形界面:在pgAdmin里打开执行计划后,顶部的「摘要」面板会直接显示「Total Cost」,所有汇总指标一目了然,不用逐个节点核对。
MySQL
- EXPLAIN ANALYZE(8.0.18+):执行
EXPLAIN ANALYZE,输出的最后一行会明确标注Total cost,同时还会显示Execution time等汇总指标。 - MySQL Workbench图形执行计划:切换到「Execution Plan」标签页,最上方的「Query Cost」就是整个计划的总成本,CPU、IO相关的消耗也会在面板的摘要区域直接展示。
通用小技巧
不管用什么数据库,只要执行计划支持XML/JSON输出格式,都可以直接解析顶层节点的成本属性,完全不用遍历所有子节点。另外像SQL Sentry Plan Explorer这类第三方工具,会自动帮你汇总所有成本指标,还能可视化展示瓶颈,省不少事。
内容的提问来源于stack exchange,提问作者MIKE
相关产品推荐
相关产品推荐

