ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Oracle 执行计划三件套:dbms_xplan.display、display_cursor 与 autotrace 配 TaoToken 实战

Oracle 执行计划三件套:dbms_xplan.display、display_cursor 与 autotrace 配 TaoToken 实战 1. 三种执行计划获取方式到底差在哪dbms_xplan.display、dbms_xplan.display_cursor和autotrace是 Oracle SQL 调优里最常被拿来对比的三件套。它们都能输出执行计划但拿到的计划来源完全不同用错场景就会得出错误结论。简单说dbms_xplan.display读的是PLAN_TABLE里的预估计划dbms_xplan.display_cursor读的是库缓存里真实跑过的计划autotrace则是 SQL*Plus 自带的一键开关底层还是走预估或统计两条路。我见过太多人用explain plan for生成计划后看到走索引就放心了结果生产上还是全表扫描。原因就是预估计划不执行 SQL不窥视绑定变量环境统计信息也可能对不上。真正要定位线上慢 SQL必须拿到库缓存里的真实计划也就是display_cursor的活。这篇面向的是正在做 Oracle SQL 调优、想搞清楚三者边界并快速定位全表扫描和索引失效的 DBA 或后端开发。我会给出可复制的 SQL*Plus 配置片段再配一套 TaoToken 统一 Key 接入 AI 辅助解读执行计划的settings.json骨架让 AI 帮你把一长串计划文本翻译成人话。TaoToken 在这里的角色是统一模型入口官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址 https://taotoken.net/api 一个 Key 就能调多家模型省去到处申请账号的麻烦。先给一张对照表把三者的核心差异钉死维度dbms_xplan.displaydbms_xplan.display_cursorautotrace计划来源PLAN_TABLE预估库缓存 v$sql_plan真实预估或真实统计是否执行 SQL否否读已执行计划ON 会执行TRACEONLY 不执行绑定变量窥视不考虑已包含视模式而定适用场景开发期快速看预估线上慢 SQL 复盘交互式单条测试需要权限基本权限查 v$ 视图权限PLUSTRACE 角色display_cursor的关键优势在于它读的是优化器实际选择并执行过的计划包含Rows、Cost、Time等运行时信息配合ALLSTATS LAST还能看到A-Rows实际行数和E-Rows预估行数的偏差。这个偏差就是索引失效和全表扫描的报警器当A-Rows远大于E-Rows说明统计信息不准或谓词选择性判断错误优化器可能因此放弃索引。而autotrace的定位是开发期快速验证。SET AUTOTRACE ON会真的执行 SQL 并给出执行计划和统计信息TRACEONLY则只显示计划不返回结果集适合大表测试。但它有个坑autotrace的统计信息来自会话级v$sesstat差值在高并发会话里可能被其他操作干扰数据不如display_cursor干净。理解这三者的边界后接下来的问题就是怎么把它们接进日常工作流并且让 AI 帮忙解读那些动辄几十行的计划文本。这正是 TaoToken 能补上的环节。2. TaoToken 统一 Key 前置准备在让 AI 解读执行计划之前得先把模型入口打通。TaoToken 提供的是 OpenAI 兼容接口所以任何支持自定义 Base URL 的客户端都能接。你需要准备三样东西Base URL、API Key、Model ID。这三件套在后面的settings.json里会反复出现先记牢。Base URL 填https://taotoken.net/api注意这里不带任何查询参数。API Key 到控制台创建地址是 https://taotoken.net/console/api-keys 创建后复制保存页面只显示一次。Model ID 根据你用的模型填比如claude-sonnet-4-20250514或gpt-4o这类具体以模型对话页面的可选列表为准模型对话入口在 https://taotoken.net/models 。如果你用的是 Claude Code 这类编码 Agent接入方式略有不同需要走 Anthropic 兼容端点文档在 https://taotoken.net/doc Claude Code 专用说明在 https://taotoken.net/claude-code 。但本篇聚焦的是「把执行计划文本丢给 AI 解读」这个动作用 OpenAI 兼容的settings.json就够了。为什么要在 Oracle 调优里引入 AI因为执行计划文本信息密度极高一个中等复杂度的查询计划可能有 30 到 50 行包含TABLE ACCESS FULL、INDEX RANGE SCAN、NESTED LOOPS、HASH JOIN等操作还有Cost、Cardinality、Bytes等数值。人工逐行读很累而且容易漏掉A-Rows和E-Rows的偏差。AI 擅长做模式识别你把计划贴进去让它标出全表扫描节点、指出预估行数与实际行数偏差最大的地方效率提升明显。前置准备的具体动作第一步登录 https://taotoken.net/console/api-keys 创建 Key复制形如sk-xxxx的字符串。第二步确认你要用的 Model ID。打开 https://taotoken.net/models 看可用模型列表选一个上下文窗口够大的因为执行计划文本可能上千 token。第三步把 Base URL、Key、Model ID 写进客户端的配置文件。下一节给出完整的settings.json骨架。这里有个常见误区有人以为 TaoToken 是数据库代理其实它跟 Oracle 没有任何直连关系。它只是模型 API 的统一入口你的执行计划文本是通过 HTTP 请求发给模型的跟数据库连接是两条独立的链路。数据库那边该用 SQLPlus 还是 SQLPlus该配display_cursor还是display_cursor互不影响。另外提醒一句API Key 不要硬编码进脚本提交到代码仓库。用环境变量或者本地配置文件并且把配置文件加进.gitignore。这个习惯在接入任何模型服务时都适用。3. 可复制配置SQL*Plus 片段与 settings.json 骨架这一节给两套可复制的东西一套是 SQL*Plus 里获取执行计划的配置片段一套是 AI 客户端的settings.json骨架。两套配合使用前者负责把计划捞出来后者负责把计划送进 AI。先看 SQLPlus 侧。获取真实执行计划的标准流程是先执行 SQL再从库缓存里捞计划。下面这段可以直接贴进 SQLPlus-- 开启执行计划自动显示方便后续查询 SET LINESIZE 200 SET PAGESIZE 1000 SET LONG 100000 SET LONGCHUNKSIZE 1000 -- 第一步执行你的目标 SQL这里用绑定变量模拟真实场景 VARIABLE v_deptno NUMBER; EXEC :v_deptno : 10; SELECT /* GATHER_PLAN_STATISTICS */ * FROM emp WHERE deptno :v_deptno; -- 第二步从库缓存捞真实计划带运行时统计 SELECT * FROM TABLE(dbms_xplan.display_cursor(NULL, NULL, ALLSTATS LAST));GATHER_PLAN_STATISTICS这个 hint 很关键它让优化器在运行时收集A-Rows等实际统计否则ALLSTATS LAST拿不到实际行数。display_cursor的第一个参数传NULL表示取当前会话最后执行的 SQL第二个参数NULL表示取所有子游标第三个参数ALLSTATS LAST是格式选项。如果你已经知道sql_id比如从v$sql里查到的可以这样取-- 先找到 sql_id 和 child_number SELECT sql_id, child_number, sql_text FROM v$sql WHERE sql_text LIKE %emp% AND sql_text NOT LIKE %v$sql%; -- 再用 sql_id 精确取计划 SELECT * FROM TABLE(dbms_xplan.display_cursor(sql_id, child_number, ALLSTATS LAST));对比一下dbms_xplan.display的用法它读的是PLAN_TABLEEXPLAIN PLAN FOR SELECT * FROM emp WHERE deptno 10; SELECT * FROM TABLE(dbms_xplan.display);注意EXPLAIN PLAN FOR不执行 SQL所以计划是预估的。开发期快速看个大概可以线上复盘别用它。再看autotrace的配置。它需要PLUSTRACE角色通常由 DBA 执行?/sqlplus/admin/plustrce.sql脚本授予。配置好后SET AUTOTRACE ON EXPLAIN SELECT * FROM emp WHERE deptno 10; SET AUTOTRACE OFFON EXPLAIN只显示计划ON STATISTICS只显示统计ON两者都显示TRACEONLY不返回结果集只显示计划。日常测试用TRACEONLY最省事。现在看 AI 客户端的settings.json骨架。以支持 OpenAI 兼容接口的客户端为例配置文件通常长这样{ model: claude-sonnet-4-20250514, base_url: https://taotoken.net/api, api_key: sk-你的Key, temperature: 0.2, max_tokens: 4096, system_prompt: 你是 Oracle 数据库调优专家。用户会给你一段 dbms_xplan 输出的执行计划文本请完成三件事1) 标出所有全表扫描节点2) 找出 A-Rows 与 E-Rows 偏差超过 10 倍的节点3) 给出可能的索引失效原因和改写建议。用中文回答先给结论再给依据。 }temperature设低一点0.2 左右因为调优分析需要稳定输出不需要创意。system_prompt里把任务拆成三步AI 输出会更有结构。max_tokens给足执行计划分析结果可能比较长。如果你用的是 Cline 或类似带 MCP 的客户端配置结构会不同但核心三件套不变Base URL 填https://taotoken.net/apiAPI Key 填控制台创建的 KeyModel ID 填模型列表里的 ID。Cline 的 MCP 配置里baseUrl、apiKey、model三个字段对应这三件套缺一不可。配置写好后把上一节 SQL*Plus 捞出来的计划文本复制粘贴到 AI 对话里就能得到结构化的分析。下一节验证这个流程是否真的跑通。4. 验证请求与成功结果配置写好了得验证它真的能用。验证分两步先确认 SQL*Plus 能正确输出执行计划再确认 AI 能正确解读。第一步在 SQL*Plus 里跑一遍完整流程。假设你已经用GATHER_PLAN_STATISTICS执行了目标 SQL然后调用display_cursor。成功的输出应该类似这样PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- SQL_ID a1b2c3d4e5f6g, child number 0 ------------------------------------- SELECT /* GATHER_PLAN_STATISTICS */ * FROM emp WHERE deptno :v_deptno Plan hash value: 3956160932 -------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 5 |00:00:00.01 | 8 | | 1 | TABLE ACCESS FULL| EMP | 1 | 5 | 5 |00:00:00.01 | 8 | --------------------------------------------------------------------------------看到TABLE ACCESS FULL就说明走了全表扫描。E-Rows是 5A-Rows也是 5偏差不大说明统计信息还算准只是这个查询本身选择性不高优化器认为全表扫描更划算。如果E-Rows是 5 而A-Rows是 5000那就是统计信息严重过期需要重新收集。第二步把这段计划文本复制发给配好 TaoToken 的 AI 客户端。成功的响应应该包含明确指出TABLE ACCESS FULL节点、分析E-Rows与A-Rows的关系、给出是否建议加索引的判断。如果 AI 回复「我无法看到执行计划」或者答非所问说明配置有问题去下一节排查。验证 AI 接口是否通可以先用一个最简单的请求测试。用 curl 发一个 OpenAI 兼容格式的请求curl https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer sk-你的Key \ -d { model: claude-sonnet-4-20250514, messages: [ {role: user, content: 回复 OK 两个字母即可} ] }如果返回的 JSON 里choices[0].message.content包含OK说明 Base URL、Key、Model ID 三件套都对了。如果返回 401是 Key 问题如果返回 404是 Base URL 或路径问题如果返回模型不存在是 Model ID 问题。验证通过后把执行计划文本作为user消息内容发进去就能得到分析。实测下来把system_prompt写清楚任务拆解后AI 对执行计划的解读准确率明显提升尤其是识别A-Rows与E-Rows偏差这块比人工扫一遍快很多。这里有个细节执行计划文本里的竖线表格在复制时可能丢失对齐但不影响 AI 理解因为模型是按 token 处理的不依赖视觉对齐。如果担心格式问题可以在system_prompt里加一句「输入可能是纯文本表格请按列名解析」。验证成功后你就有了一个可复用的工作流SQL*Plus 捞计划AI 解读人工确认。接下来把常见报错过一遍避免踩坑。5. 常见报错排查401、local proxy failed 与 OAuth接入过程中最容易撞上的几类报错这里逐个拆解。注意这些报错分属两个层面AI 接口层面和 Oracle 层面别混在一起排查。401 Unauthorized。这是 AI 接口最常见的报错意思是 Key 无效或没带上。检查三处settings.json里api_key字段是否填了完整的sk-开头字符串请求头Authorization是否是Bearer sk-xxx格式Bearer和 Key 之间有一个空格Key 是否在控制台被删除或过期。如果用的是环境变量确认变量名拼写正确比如TAOTOKEN_API_KEY和代码里读的OPENAI_API_KEY不一致也会导致读到空值。local proxy failed / connection refused。这个报错通常出现在客户端配置了本地代理端口但代理没启动时。检查settings.json或系统环境变量里是否有HTTP_PROXY、HTTPS_PROXY指向127.0.0.1:xxxx。如果有要么启动对应服务要么把这两个变量清掉。TaoToken 的 API 地址是公网可达的不需要额外代理层。清掉代理变量后重启客户端再试。OAuth 相关报错。如果你用的是 Claude Code 或 Codex 这类带 OAuth 登录的客户端可能会看到OAuth token expired或invalid_grant。这类客户端接入 TaoToken 时不要走 OAuth 流程而是走 API Key 模式。Claude Code 的接入文档在 https://taotoken.net/claude-code 里面说明了如何用 API Key 替代 OAuth。Codex 的auth.json配置里把OPENAI_API_KEY字段填成 TaoToken 的 KeyOPENAI_BASE_URL填https://taotoken.net/api就能绕过 OAuth。reading choices 报错。这个报错说明请求发出去了但响应 JSON 里没有choices字段。常见原因是 Model ID 填错服务端返回了错误信息而不是正常补全结果。检查 Model ID 是否在 https://taotoken.net/models 的列表里大小写是否一致。另一个原因是请求体格式不对比如messages数组为空或者model字段缺失。Oracle 侧报错ORA-00942 table or view does not exist。调用dbms_xplan.display_cursor时报这个通常是当前用户没有查v$sql_plan等动态性能视图的权限。需要 DBA 授予SELECT_CATALOG_ROLE或单独授予v$sql_plan、v$sql_plan_statistics_all的查询权限。Oracle 侧报错ORA-01427 single-row subquery returns more than one row。这个跟执行计划无关但常出现在你为了找sql_id写的子查询里。检查v$sql查询条件是否够精确加AND rownum 1或者用sql_id直接过滤。autotrace 报错SP2-0618: Cannot find the Session Identifier。这是PLUSTRACE角色没授予。让 DBA 执行?/sqlplus/admin/plustrce.sql然后GRANT PLUSTRACE TO 你的用户。排查顺序建议先确认 AI 接口通用 curl 测再确认 Oracle 计划能捞出来在 SQL*Plus 里测最后确认两者拼接的流程。分层排查比一上来就怀疑整个链路高效得多。6. 把执行计划解读接进日常调优流三种方式各有各的位置别指望一个打天下。开发期写 SQL用explain plan加dbms_xplan.display快速看预估改索引改写法都方便。上线后出慢查询用display_cursor加ALLSTATS LAST捞真实计划重点看A-Rows和E-Rows的偏差。临时测单条 SQL 性能autotrace TRACEONLY最省事不返回结果集大表也敢跑。把 AI 接进来后工作流变成SQL*Plus 捞计划 → 复制文本 → 丢给配好 TaoToken 的客户端 → 拿到结构化分析 → 人工确认后改索引或改写 SQL。TaoToken 在这里省掉的是多模型切换的账号管理成本一个 Key 走通Base URL 固定https://taotoken.net/apiModel ID 按需换。长期做编码和 Agent 任务的可以看 Coding Plan https://taotoken.net/coding-plan 按量用更划算。最后留一个实用技巧在system_prompt里让 AI 输出「建议执行的 DDL」比如CREATE INDEX idx_emp_deptno ON emp(deptno);这样分析完直接能拿去执行省一步转换。但记住AI 给的索引建议必须人工确认因为模型看不到你的完整表结构和数据分布它只是根据计划文本推断。执行计划解读是辅助最终决策还得靠你对业务和数据的理解。
返回列表