多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

根据SQL_ID查看执行计划:用TaoToken统一Key打通数据库诊断链路

根据SQL_ID查看执行计划:用TaoToken统一Key打通数据库诊断链路 1. 慢查询排查现场拿到 SQL_ID 之后到底卡在哪线上告警响了AWR 报告里翻出一个 SQL_ID比如c1j018vt5ajdu你心里清楚这条语句大概率就是罪魁祸首。但接下来呢很多 DBA 和后端工程师的真实困境不是找不到 SQL_ID而是拿到 SQL_ID 之后执行计划怎么快速、准确地调出来看。我见过太多排查流程是这样的登录数据库服务器敲set autotrace on结果发现要重新跑一遍 SQL生产库根本不敢动或者用explain plan for但那个计划是预估的跟实际跑出来的可能完全两回事再或者翻 AWRdisplay_awr出来的计划又缺了 A-ROWS、PEEKED_BINDS 这些关键信息。一圈下来半小时过去了问题还没定位。这篇要解决的就是这个链路问题。核心检索词是SQL_ID 查看执行计划我会把三种主流方式autotrace、explain plan、dbms_xplan的适用边界讲清楚然后重点演示dbms_xplan.display_cursor配合STATISTICS_LEVELALL拿到真实行数的完整流程。同时因为现在很多诊断工具、脚本、AI 辅助分析都需要一个统一的模型/API 通道我会用 TaoToken 的统一 Key 把本地脚本调用诊断能力这一段串起来让你在本地环境能完整复现一次从 SQL_ID 到执行计划异常的排查动作。适合谁看日常要处理 Oracle 慢查询的 DBA、后端工程师以及想把诊断脚本和外部分析工具打通的同学。不需要你是 Oracle 内核专家但至少要能连上库、能执行 SQL。先说结论看执行计划优先用dbms_xplan.display_cursor因为它读的是游标缓存里的真实计划带实际行数A-ROWS和绑定变量窥探信息。explain plan for只适合开发阶段预估autotrace适合测试环境快速看生产环境慎用。下面一步步来。2. TaoToken 前置准备统一 Key 打通诊断脚本的调用通道在讲具体 SQL 之前先把这个统一 Key的事情说清楚因为后面验证环节要用到。TaoToken 在这里扮演的角色是给你的诊断脚本、AI 辅助分析工具、coding agent 提供一个统一的 API 入口和 Key不用每个工具单独配一套凭证。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 这个不加 UTM。你需要先去控制台创建一个 API Key控制台地址 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 管理页面在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。拿到 Key 之后你的诊断脚本就可以通过统一的 Base URL 去调用模型能力比如让模型帮你解读一段执行计划文本、生成排查建议。这里的关键是三件套要配全Base URL、API Key、Model ID。少任何一个都会报错后面第 5 节会专门讲这个坑。如果你用的是 Claude Code 这类编码工具接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite Claude Code 的接入说明在 https://taotoken.net/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentClaudeCodeAnthropicutm_campaignrewrite 。模型对话入口在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 长期做编码和 Agent 任务的可以看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。为什么要在数据库诊断场景里提这个因为实际排查中你经常需要把执行计划文本、绑定变量、等待事件丢给一个分析工具或模型去辅助判断。如果每个工具都要单独配 Key切换成本很高。统一 Key 的价值就是一次配置脚本、CLI、IDE 插件、Agent 都能复用。下面第 3 节先给可复制的配置片段第 4 节再演示怎么用它验证一次执行计划查询。3. 可复制配置连接参数与 dbms_xplan 查询脚本这一节给两段可复制的东西一是 TaoToken 的配置片段JSON 格式路径按你实际工具放二是 Oracle 侧查看执行计划的完整 SQL 脚本。先看 TaoToken 的配置。如果你用的是支持 OpenAI 兼容格式的工具配置文件通常长这样把它放到你的工具配置目录里比如~/.config/下对应工具的 settings 文件{ base_url: https://taotoken.net/api, api_key: sk-你的TaoToken密钥, model: claude-sonnet-4-20250514, timeout: 60 }注意base_url是https://taotoken.net/api不要多加路径后缀api_key从控制台复制model填你实际要用的 Model ID。这三件套缺一不可第 5 节会讲 401 和 model not found 的排查。再看 Oracle 侧。假设你已经从 AWR 或v$sql拿到了 SQL_ID比如c1j018vt5ajdu。第一步是确保会话能采集到实际行数信息因为默认的STATISTICS_LEVEL是 TYPICAL拿不到 A-ROWS-- 开启 ALL 级别才能拿到 A-ROWS、PEEKED_BINDS 等信息 ALTER SESSION SET STATISTICS_LEVELALL; -- 运行目标 SQL如果它已经在游标缓存里可以跳过这步 SELECT sysdate FROM dual; -- 查看游标缓存中的真实执行计划ALLSTATS 带实际统计 SELECT * FROM TABLE( dbms_xplan.display_cursor(c1j018vt5ajdu, NULL, ADVANCED ALLSTATS LAST PEEKED_BINDS) ); -- 排查完记得改回 TYPICAL避免额外开销 ALTER SESSION SET STATISTICS_LEVELTYPICAL;如果 SQL 已经不在游标缓存里比如被刷出去了那就从 AWR 里取-- 从 AWR 历史快照里取执行计划 SELECT * FROM TABLE( dbms_xplan.display_awr(c1j018vt5ajdu) );想看绑定变量用下面这个查询能拿到VALUE_STRING和VALUE_ANYDATASELECT t.VALUE_STRING, t.VALUE_ANYDATA FROM v$sql_bind_capture t WHERE sql_id c1j018vt5ajdu;历史绑定变量在dba_hist_sqlbind里SELECT snap_id, name, position, value_string, last_captured, was_captured FROM dba_hist_sqlbind WHERE sql_id c1j018vt5ajdu;还有一个用dbms_sqltune.extract_bind从wrh$_sqlstat里解绑定的写法适合做批量分析SELECT dbms_sqltune.extract_bind(bind_data, 1).value_string AS a, dbms_sqltune.extract_bind(bind_data, 2).value_string AS b FROM wrh$_sqlstat WHERE sql_id c1j018vt5ajdu;这几段脚本覆盖了游标缓存 → AWR 历史 → 绑定变量三条路径。实际排查时先试display_cursor拿不到再退到display_awr。参数里的ADVANCED ALLSTATS LAST PEEKED_BINDS是组合格式ALLSTATS出实际行数PEEKED_BINDS出窥探的绑定值LAST表示最近一次执行。4. 验证请求跑一次完整的执行计划查看流程配置好了现在验证。我按真实操作顺序走一遍你可以跟着复现。第一步连上数据库确认当前STATISTICS_LEVELSHOW PARAMETER statistics_level;如果返回 TYPICAL就执行ALTER SESSION SET STATISTICS_LEVELALL;。这一步不做后面ALLSTATS出来的 A-ROWS 列会是空的你会误以为计划没问题。第二步确认 SQL_ID 在游标缓存里SELECT sql_id, child_number, executions, buffer_gets, disk_reads FROM v$sql WHERE sql_id c1j018vt5ajdu;如果查不到说明游标已经被刷出直接跳到display_awr。如果查到多个child_number说明有多个子游标display_cursor的第二个参数要指定 child_number否则默认取 0。第三步执行display_cursorSELECT * FROM TABLE( dbms_xplan.display_cursor(c1j018vt5ajdu, NULL, ADVANCED ALLSTATS LAST PEEKED_BINDS) );正常输出会包含几个关键列Id、Operation、Name、Rows预估行数、A-Rows实际行数、A-Time、Buffers。排查异常的核心就是对比Rows和A-Rows。如果预估 1 行、实际 100 万行那基本可以确定是统计信息过期或者绑定变量窥探导致的计划偏差。第四步把这段执行计划文本丢给 TaoToken 通道做辅助分析。如果你配好了第 3 节的 JSON可以用 curl 验证通道是否通curl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的TaoToken密钥 \ -H Content-Type: application/json \ -d { model: claude-sonnet-4-20250514, messages: [ {role: user, content: 帮我分析这段执行计划预估行数1实际行数1000000Operation是TABLE ACCESS FULL} ] }返回里如果有choices字段和正常的文本内容说明通道通了。这一步的意义是你的诊断脚本可以把执行计划文本自动送进模型做初步判断不用人工逐行读。第五步改回STATISTICS_LEVELTYPICAL收尾。整个流程走下来从拿到 SQL_ID 到看清真实执行计划熟练的话两三分钟。关键动作就三个开 ALL、跑 display_cursor、对比 Rows 和 A-Rows。5. 常见报错排查401、local proxy failed、reading choices、OAuth这一节对照真实会遇到的报错逐个说排查方向。401 Unauthorized最常见。原因通常是 API Key 没配、配错、或者复制时带了空格。检查你的配置文件里api_key字段确认是从 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 复制的完整 Key。另外确认base_url是https://taotoken.net/api如果写成了带/v1的完整路径有些工具会拼接出错导致鉴权失败。local proxy failed这个报错通常出现在工具尝试走本地代理但代理没起来的时候。检查你的工具配置里有没有残留的 proxy 设置把它清掉让请求直连https://taotoken.net/api。如果你在 CI 环境里跑确认环境变量HTTP_PROXY、HTTPS_PROXY没有被意外设置。reading choices 相关报错一般是响应体解析失败。可能是model字段填的 Model ID 不存在或者返回的不是标准 OpenAI 兼容格式。先确认 Model ID 拼写正确可以在模型对话页面 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 核对可用的模型名。如果 Model ID 错了有些服务会返回错误结构工具解析choices时就崩了。OAuth 相关报错如果你用的是 Claude Code 这类工具接入时可能涉及 OAuth 流程。参考 https://taotoken.net/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentClaudeCodeAnthropicutm_campaignrewrite 的说明确认是走 API Key 还是 OAuth。混用会导致鉴权失败。用 API Key 模式时确保三件套Base URL、Key、Model ID都填了。Oracle 侧常见问题display_cursor返回空通常是 SQL_ID 不在游标缓存或者STATISTICS_LEVEL没开 ALL。display_awr返回空检查 SQL_ID 是否在 AWR 保留期内以及是否有权限访问dba_hist_*视图。绑定变量查不到确认v$sql_bind_capture的采集是否开启受_cursor_bind_capture_interval影响。排查顺序建议先确认通道通curl 能返回 choices再确认 Oracle 侧 SQL_ID 有效最后看参数格式对不对。大部分问题出在配置三件套和STATISTICS_LEVEL这两处。6. 把诊断链路固定成脚本一次配置长期复用排查完这一次别让下次再从零开始。把第 3 节的 SQL 存成一个.sql文件参数化 SQL_ID比如plan_check.sql用DEFINE接收变量DEFINE sql_id 1 ALTER SESSION SET STATISTICS_LEVELALL; SELECT * FROM TABLE( dbms_xplan.display_cursor(sql_id, NULL, ADVANCED ALLSTATS LAST PEEKED_BINDS) ); ALTER SESSION SET STATISTICS_LEVELTYPICAL;调用时plan_check.sql c1j018vt5ajdu就行。TaoToken 的配置也固定下来脚本里读环境变量TAOTOKEN_API_KEY这样 Key 不进代码库。长期做这类诊断和 Agent 任务的Coding Plan 那条通道 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 可以了解一下适合把多个诊断脚本统一到一个调用入口。实测下来把开 ALL → display_cursor → 对比 A-Rows → 送模型分析这四步固化成脚本后单次排查时间能压到一分钟以内。真正花时间的从来不是敲命令而是判断计划哪里不对——而这部分交给统一通道的模型辅助你只需要看结论。
返回列表