navicat点“解释”后看到的oracle执行计划是扁平化表格,含operation、name、rows、cost、time等列,id非执行顺序,需依缩进判断先后;默认不显示谓词信息,需用'advanced'模式才可见access/filter条件。
navicat点“解释”后看到的oracle执行计划长什么样
navicat 对 oracle 执行计划的渲染,本质是自动执行 explain plan for + select * from table(dbms_xplan.display) 两步,并把结果以表格形式展示。它不会显示 sql*plus 那种带缩进的树状结构,而是扁平化列出每行操作(operation)、对应对象(name)、预估行数(rows)、成本(cost)和时间(time)。你看到的第一列 id 不是执行顺序编号,真正要看执行先后,得靠 operation 的缩进层级——缩进越深,越先执行。
关键字段怎么看:Rows、Cost、Operation 到底在说啥
Rows 是 Oracle 优化器对当前步骤输出行数的估算,不是真实值。如果某步 Rows 显示 100000,但实际表才 1000 行,说明统计信息过期,该跑 DBMS_STATS.GATHER_TABLE_STATS 了。Cost 是综合 CPU、IO 的代价估算,数值本身没单位,只用于横向比较——同一语句不同写法的 Cost 越低越好,但跨语句比 Cost 没意义。Operation 字段才是核心,比如 TABLE ACCESS FULL 表示全表扫描,INDEX RANGE SCAN 表示走了索引范围查找,NESTED LOOPS 表示嵌套循环连接。注意看 Operation 后面是否带 UNIQUE 或 RANGE,这直接反映索引使用质量。
为什么“解释”出来的计划里看不到谓词信息(Predicate Information)
Navicat 默认调用的是 DBMS_XPLAN.DISPLAY,它只返回基础执行路径,不包含谓词过滤细节。而真正关键的 Access(走索引的条件)和 Filter(回表后过滤的条件)藏在 DBMS_XPLAN.DISPLAY_FORMAT 的 ADVANCED 模式里。想看到这些,得手动补一句:SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(NULL, NULL, 'ADVANCED'))。否则你可能误判:明明写了 WHERE id = ?,却看不到 Access 条件,以为没走索引,其实是 Navicat 界面截断了这部分输出。
容易被忽略的权限和前置条件
Navicat 能成功生成 Oracle 执行计划,依赖两个隐性前提:PLAN_TABLE 表必须存在(通常由 UTLXPLAN.SQL 脚本创建),且当前用户有写入权限;用户还需具备 SELECT_CATALOG_ROLE 或 SELECT ANY DICTIONARY 权限,否则查 DBA_HIST_SQLSTAT 这类视图会报 ORA-00942。另外,如果 SQL 里用了绑定变量(如 WHERE name = :v_name),Navicat 的“解释”模式不会代入实际值,可能导致计划失真——这时候得用 DBMS_XPLAN.DISPLAY_CURSOR 查刚执行过的游标,而不是靠 DISPLAY。











