ARTICLE DETAIL

资讯详情

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

获取SQL执行计划的常见几种方法:从 explain plan 到 display_cursor 的 TaoToken 配置骨架

获取SQL执行计划的常见几种方法:从 explain plan 到 display_cursor 的 TaoToken 配置骨架 1. 为什么你抓到的执行计划总是不对很多做 Oracle 优化的朋友都遇到过这种尴尬明明用explain plan for看到走了索引实际跑起来却慢得要命或者反过来autotrace显示全表扫描但生产环境上这条 SQL 却快得飞起。问题不在于工具本身而在于你抓到的到底是不是真实执行过的计划。Oracle 获取 SQL 执行计划的手段主要有四类explain plan、autotrace、SQL_TRACE、display_cursor。它们看起来都能输出一张 PLAN_TABLE_OUTPUT 表格但背后的数据来源完全不同。explain plan只是让优化器预演一遍SQL 根本没执行autotrace会真正执行并给出统计信息SQL_TRACE和display_cursor则是从 library cache 或 trace 文件里捞出已经发生过的执行路径。选错工具你看到的可能就是另一个平行宇宙里的计划。这篇内容面向正在做 Oracle SQL 调优、需要快速定位执行计划差异的 DBA 和后端开发。我会把四种方法的适用时机、输出差异讲清楚同时给出一套可复制的config.toml与settings.json骨架把 TaoToken 作为统一的 Key/API 通道接进你的 AI 辅助工具链让模型帮你解读执行计划、对比 plan hash、定位全表扫描的根因。每一步都有可验证的动作跟着做就能确认执行计划被正确抓取。2. TaoToken 前置统一 Key 与 API 通道在开始写 SQL 之前先把工具链的入口理顺。TaoToken 在这里扮演的角色是统一的模型调用通道你不需要在每台机器、每个编辑器插件里分别配置不同厂商的 Key而是通过一个 API 端点 一个 Key 完成所有 AI 辅助能力的接入。对于 Oracle 调优这种需要反复让模型解读执行计划、生成等价改写 SQL 的场景统一通道能省掉大量切换成本。你需要准备的东西只有两样一个可用的 API Key以及正确的 base_url。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后在控制台生成 Key。API 端点固定为 https://taotoken.net/api 注意这个地址后面不加任何 UTM 参数保持干净。注意Key 只生成一次页面关闭后无法再次查看完整值建议生成后立刻写入本地配置文件或密码管理器。不要把 Key 硬编码进会提交到 Git 的脚本里。拿到 Key 之后先做一次最小连通性验证确认通道可用再往下走。这一步能帮你排除掉后面 80% 的模型没响应类问题。curl -s https://taotoken.net/api/v1/models \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ | head -c 500如果返回的是模型列表 JSON说明 Key 和网络都正常。如果返回 401检查 Key 是否复制完整返回 404 则确认 base_url 没有多写路径。3. 可复制配置config.toml 与 settings.json 骨架不同的 AI 辅助工具读取配置的方式不一样。命令行类工具比如一些 coding agent通常读config.toml而编辑器插件类比如 Claude Code 风格的接入更常见的是settings.json。下面两份骨架你可以直接复制把sk-开头的占位符换成自己的 Key 即可。先看config.toml适合放在项目根目录或用户主目录下# ~/.taotoken/config.toml # TaoToken 统一接入配置骨架 [provider] name taotoken base_url https://taotoken.net/api api_key sk-替换成你的Key timeout_seconds 60 max_retries 3 [model] default claude-sonnet # 解读执行计划建议用长上下文模型plan 输出动辄几百行 context_window 200000 [oracle] # 与执行计划抓取相关的本地约定 plan_table PLAN_TABLE trace_dir /u01/app/oracle/diag/rdbms/orcl/orcl/trace default_format advanced再看settings.json适合编辑器插件或需要 JSON 配置的工具{ taotoken: { baseUrl: https://taotoken.net/api, apiKey: sk-替换成你的Key, models: { chat: claude-sonnet, code: claude-sonnet }, request: { timeout: 60000, retries: 3 } }, oraclePlan: { planTable: PLAN_TABLE, traceDir: /u01/app/oracle/diag/rdbms/orcl/orcl/trace, displayFormat: advanced, sqlIdCache: true } }两份配置的核心字段是一致的base_url指向 https://taotoken.net/api api_key填你的 Key模型选择上建议用长上下文版本因为display_cursor配合formatadvanced时输出会包含 Outline Data、Query Block Name、Column Projection 等大段内容短上下文模型容易截断。提示如果你同时用多个工具把 Key 放在环境变量TAOTOKEN_API_KEY里配置文件里用${TAOTOKEN_API_KEY}引用避免明文散落多处。4. 四类执行计划抓取方法与逐条验证配置就绪后进入正题。下面按预演 → 真实执行 → 会话跟踪 → 事后回捞的顺序把四种方法串起来每种都给出可复制的 SQL 和验证动作。4.1 explain plan预演型适合第三方工具explain plan for是最顺手的一种因为它不真正执行 SQL只让优化器分析一遍把结果写进PLAN_TABLE。第三方工具TOAD、PL/SQL Developer里也能直接用。explain plan for select count(*) from t1; select * from table(dbms_xplan.display());想看更详细的信息把 format 换成advancedselect * from table(dbms_xplan.display(null, null, advanced));输出里会多出 Outline Data、Query Block Name、Column Projection 三段。Outline Data 尤其有用它记录了优化器生成这个计划时用的 hint 集合是判断计划为什么长这样的关键线索。但explain plan有两个坑必须记住第一它不执行 SQL所以统计信息可能和真实执行时不一致第二遇到绑定变量时生成的计划往往不准因为它不知道绑定值是什么。所以它适合快速预判不适合作为性能问题的最终依据。4.2 autotrace真实执行 统计信息autotrace会真正执行 SQL并给出执行计划加统计信息。配置它需要先跑plustrce.sql并授权-- 以 SYS 或 SYSDBA 登录 ?/sqlplus/admin/plustrce.sql grant plustrace to scott;然后在目标用户下开启set autotrace on; select count(*) from t1;set autotrace有四种常用组合输出差异很大命令返回结果集执行计划统计信息set autotrace on是是是set autotrace traceonly否是是set autotrace traceonly explain否是否set autotrace traceonly statistics否否是traceonly系列不返回结果集在数据量大的表上能省掉大量网络传输是调优时最常用的形态。统计信息里的consistent gets和physical reads是判断真实开销的核心指标。4.3 SQL_TRACE会话级跟踪输出到 trace 文件当 SQL 出现性能问题需要看执行过程中到底发生了什么时SQL_TRACE更合适。它把整个过程写进 trace 文件包含解析、执行、等待等细节。alter session set tracefile_identifier ocpyang; alter session set sql_trace true; select * from t1; alter session set sql_trace false;设置tracefile_identifier是为了方便找文件。11g 之后 trace 默认在$ORACLE_BASE/diag/rdbms/db/instance/trace下。你也可以直接用 SQL 查出当前 trace 文件名SELECT d.VALUE || / || LOWER(RTRIM(i.INSTANCE, CHR(0))) || _ora_ || p.spid || .trc AS trace_file_name FROM (SELECT p.spid FROM v$mystat m, v$session s, v$process p WHERE m.statistic# 1 AND s.SID m.SID AND p.addr s.paddr) p, (SELECT t.INSTANCE FROM v$thread t, v$parameter v WHERE v.NAME thread AND (v.VALUE 0 OR t.thread# TO_NUMBER(v.VALUE))) i, (SELECT VALUE FROM v$parameter WHERE NAME user_dump_dest) d;拿到文件名后用tkprof格式化可读性会好很多tkprof orcl_ora_68612.trc output.txt explainscott/tiger sysno4.4 display_cursor回捞刚刚真实执行的计划这是最贴近生产真相的一种。display_cursor从 library cache 里捞出已经执行过的 SQL 计划不指定 sql_id 时默认取当前会话刚执行的那条。select count(*) from t1; select sql_id from v$sql where sql_text select count(*) from t1; select * from table(dbms_xplan.display_cursor(5bc0v4my7dvr5));不指定 sql_id 的写法更省事select * from table(dbms_xplan.display_cursor);它同样支持 format 参数advanced能抽出更详细的执行信息。注意display_cursor在 SQL*Plus 里最稳部分第三方工具调用可能异常。4.5 用 TaoToken 让模型解读计划抓到计划之后把输出贴给模型让它帮你做三件事对比两个 plan hash 的差异、指出全表扫描的 Operation、根据 Outline Data 反推可用的 hint。这一步通过前面配好的通道调用即可curl -s https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: claude-sonnet, messages: [ {role: user, content: 以下是 display_cursor 抓到的执行计划请指出 TABLE ACCESS FULL 出现在哪个 Id并给出可能的索引建议\n粘贴计划} ] }返回的解读结果可以直接对照你的PLAN_TABLE_OUTPUT逐行核对确认模型没有编造不存在的 Operation。5. 本篇常见错排查SP2-0618 无法找到会话标识符这是autotrace没配好PLUSTRACE角色没授予当前用户。回到 4.2 节用 SYS 跑plustrce.sql后grant plustrace to 用户。display_cursor 返回空说明 SQL 已经不在 shared pool 里了可能被 aged out。改用display_awr从 AWR 里捞或者重新执行一次 SQL 再立刻调用。explain plan 和实际计划不一致这是预期行为不是 bug。explain plan不执行 SQL绑定变量场景下必然有偏差。要真实计划就用display_cursor。trace 文件找不到确认user_dump_dest或 11g 之后的diagnostic_dest路径用 4.3 节的 SQL 直接查文件名别靠猜。模型返回 401 或超时检查config.toml/settings.json里的base_url是否为 https://taotoken.net/api Key 是否完整以及timeout_seconds是否够长。执行计划文本很长超时设 60 秒以上比较稳。formatadvanced 输出被截断换长上下文模型或在请求里明确要求分段输出不要省略 Outline Data。6. 把通道固定下来把方法用成习惯四种方法没有优劣只有场景匹配预判用explain plan看真实开销用autotrace追过程用SQL_TRACE回捞生产真相用display_cursor。真正省时间的是把 TaoToken 的 Key 和 API 通道固定进你的config.toml与settings.json这样每次抓到计划都能立刻丢给模型解读不用再折腾环境。如果你主要做长期 SQL 调优和 Agent 辅助编码建议直接开通 Coding Plan把模型调用额度固定下来https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。接入细节和参数说明看文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。想先验证模型对执行计划的解读能力用模型对话页贴一段display_cursor输出试一次https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。
返回列表