)
1. ABAP 慢 SQL 排查从 ST05 抓取到 HANA 执行计划追踪的完整链路ABAP 系统里遇到性能问题很多时候第一反应是去看代码逻辑但真正吃掉时间的往往是数据库层那几条不起眼的 SQL。一个 Fiori 列表页转圈 8 秒一段批处理跑了一整夜表面看是 ABAP 程序卡住深挖下去大概率是某条语句在 HANA 上扫描了几百万行或者被循环调用了上万次。这篇内容就是围绕这个场景展开怎么用 ST05 和 SQLM 把慢 SQL 捞出来怎么在 HANA 侧读执行计划怎么判断是全表扫描还是缺索引最后怎么验证优化真的生效了。适合谁看如果你日常在 ABAP 环境里做开发或运维碰到过“程序逻辑没问题但就是慢”的情况或者想建立一套可复用的 SQL 性能分析流程那接下来的步骤可以直接跟着操作。我会从 ST05 的跟踪配置讲起到 SQLM 快照参数再到 HANA 执行计划的导出与解读每一步都给出可复制的命令和参数。TaoToken 在这个链路里只出现一次作为统一 Key/API 通道在需要调用外部模型辅助解读 trace 时使用官网见 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end。先明确一个判断框架慢 SQL 通常分三类。第一类是单次执行就慢比如一条 SELECT 扫了全表第二类是执行次数爆炸比如循环里发了上千次 SELECT SINGLE第三类是游标打开时间过长应用端在多次 fetch 之间做了大量处理。这三类的优化方向完全不同所以第一步不是改代码而是先用工具把类型判清楚。ST05 和 SQLM 就是干这个的。ST05 是 ABAP 环境里最直接的 SQL 跟踪工具。你可以在事务码 ST05 里创建跟踪选择要跟踪的用户或请求然后激活。跟踪跑一段时间后停掉进入分析界面就能看到这段时间内所有数据库交互的明细。每条记录会显示 SQL 语句、执行时间、返回行数、执行次数。这里的关键是排序按执行时间降序排先看最耗时的单条按执行次数降序排看有没有被反复调用的语句。SQLM 则更适合做聚合分析。它不像 ST05 那样记录每一条语句的完整文本而是按语句哈希聚合统计同一类语句的总执行次数、总耗时、平均耗时。SQLM 的快照功能可以定期采集适合观察一段时间内的趋势。比如你怀疑某个时段数据库压力大可以对比不同快照里同一语句哈希的指标变化。HANA 侧的执行计划追踪是最后一块拼图。当你从 ST05 或 SQLM 定位到某条具体语句后需要知道 HANA 是怎么执行它的。在 HANA Studio 或 ADT 里可以对指定语句哈希打开 plan trace捕获实际执行计划。执行计划会显示每个算子的代价、扫描行数、是否命中索引。如果看到 TABLE SCAN 而不是 INDEX SCAN基本就能确定是缺索引或者索引没被用上。整个链路串起来就是ST05 抓明细 → SQLM 做聚合 → 定位到具体语句哈希 → HANA 执行计划看算子 → 判断根因 → 改代码或加索引 → 复测对比。下面几个章节会把这个链路拆成可操作的步骤每个步骤都给出具体的配置和参数。2. TaoToken 前置准备统一 Key 与 API 通道在排查链路中的位置在进入具体的 ST05 配置之前先花一点时间把 TaoToken 的接入准备好。这个环节不是必须的但如果你打算在排查过程中调用外部模型来辅助解读 trace 文件或执行计划有一个统一的 Key 和 API 通道会省去很多切换成本。TaoToken 在这里的角色就是一个统一的入口把不同模型的调用收敛到一个 Base URL 和一套 API Key 上。先拿 Key。访问 https://taotoken.net/api-keys 注册或登录后在控制台里创建一个 API Key。这个 Key 后面会用在两个地方一是如果你用 Cline 或 Claude Code 这类工具做 trace 解读需要在工具的配置里填 Base URL 和 Key二是如果你直接写脚本调用模型对话接口Key 放在请求头里。创建完 Key 后复制保存后面配置会用到。Base URL 统一用 https://taotoken.net/api。这个地址是 API 调用的根路径不同的模型对话接口会在这个根路径下拼接具体的 endpoint。比如模型对话的完整地址是 https://taotoken.net/api 加上对应的路径。如果你用的是 Coding Plan 或者需要长期跑 Agent 任务可以在 https://taotoken.net/coding-plan 看具体的套餐说明。Model ID 这块TaoToken 支持多种模型具体用哪个取决于你的场景。如果只是做 trace 文本的归因分析选一个通用对话模型就够了如果需要处理较长的执行计划文本选上下文窗口大一些的。Model ID 的格式通常是厂商名加模型名比如 claude-sonnet-4-20250514 这种。在工具的配置里填 Model ID 时注意不要填错否则会报 model not found。三件套配齐后可以在终端里用 curl 快速验证一下 Key 是否可用。命令如下curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer YOUR_API_KEY \ -d { model: claude-sonnet-4-20250514, messages: [{role: user, content: test}], max_tokens: 10 }如果返回正常说明 Key 和 Base URL 都没问题。如果返回 401检查 Key 是否复制完整如果返回 model not found检查 Model ID 拼写。这一步做完后面在排查过程中如果需要调用模型辅助就可以直接用了。需要说明的是TaoToken 在这个排查链路里只承担一个辅助角色。核心的 ST05 跟踪、SQLM 快照、HANA 执行计划分析都不依赖它。它的价值在于当你需要把 trace 结果或执行计划文本交给模型做归因时有一个稳定的通道不用每次去折腾不同的 API 配置。3. 可复制配置ST05 跟踪参数、SQLM 快照设置与执行计划导出这一章给出具体的配置片段和操作步骤。先讲 ST05 的跟踪配置。进入事务码 ST05选择“Create Trace”或者直接点“Activate Trace”。在跟踪类型里选 SQL Trace因为我们要抓的是数据库层交互。跟踪范围可以按用户过滤比如只跟踪你的用户名避免抓到整个系统的噪音。如果问题跟特定请求相关可以在“Filter”里填事务码或程序名。跟踪激活后去复现那个慢的场景。比如打开那个转圈 8 秒的 Fiori 页面或者跑一次那个跑了一整夜的批处理。复现完成后回到 ST05停掉跟踪。在分析界面里你会看到一张表列包括 SQL Statement、Duration、Records、Executions。按 Duration 降序排最上面那条就是最耗时的单次执行按 Executions 降序排最上面那条就是被调用次数最多的。SQLM 的配置稍微不同。进入事务码 SQLM选择“Create Snapshot”。快照参数里可以设置采集的时间窗口和聚合粒度。建议把“Aggregation Level”设为“Statement Hash”这样同一类语句会被聚合到一起。快照创建后系统会在后台采集数据采集完成后可以在 SQLM 的“Display Snapshot”里查看结果。结果表里会显示每个语句哈希的总执行次数、总耗时、平均耗时、总返回行数。HANA 执行计划的导出需要到 HANA Studio 或 ADT 里操作。在 HANA Studio 里找到 SQL Plan Cache 相关的视图比如 M_SQL_PLAN_CACHE_OVERVIEW。根据语句哈希查询对应的计划缓存条目。如果要捕获实际执行计划可以对指定语句哈希打开 plan trace。在 ADT 里可以用 ABAP Cross Trace 来捕获 Fiori 应用发出的 SQL 的执行计划。下面是一个 SQLM 快照的配置示例用 TOML 格式表示参数[sqlm_snapshot] snapshot_name slow_sql_analysis_20250323 time_window_start 2025-03-23T09:00:00 time_window_end 2025-03-23T11:00:00 aggregation_level statement_hash filter_user YOUR_USER filter_transaction YOUR_TRANSACTION max_records 10000这个配置的意思是在 9 点到 11 点之间按语句哈希聚合只采集指定用户和事务码的数据最多保留 10000 条记录。你可以根据实际情况调整时间窗口和过滤条件。ST05 的跟踪配置也可以用类似的方式记录方便复用[st05_trace] trace_type SQL filter_user YOUR_USER filter_transaction YOUR_TRANSACTION max_duration_ms 5000 include_bind_variables true这里的 max_duration_ms 设为 5000意思是只记录执行时间超过 5 秒的语句避免抓太多无关数据。include_bind_variables 设为 true这样可以看到具体的绑定变量值对分析很有帮助。执行计划导出这块在 ADT 里选中某条 SQL 记录后可以请求 HANA PlanViz 可视化下载 *.plv 文件。把 *.plv 文件关联到本机的 eclipse.exeEclipse 会自动打开正确的视图在 Executed Plan 选项卡里图形化展示执行计划。这个文件里会显示每个算子的名称、代价、扫描行数、是否命中索引。如果你用 Claude Code 做 trace 解读可以在 settings.json 里配置 TaoToken 的 Base URL 和 Key{ apiBaseUrl: https://taotoken.net/api, apiKey: YOUR_API_KEY, model: claude-sonnet-4-20250514, maxTokens: 4096 }这个配置放在 Claude Code 的 settings.json 里后面调用模型解读 trace 时会用到。注意 apiKey 不要直接提交到代码仓库用环境变量或者本地配置文件管理。4. 验证请求与成功结果对比优化前后语句耗时与扫描行数配置好工具后下一步是跑一次完整的验证。验证的目标很明确确认优化动作真的让语句变快了而且快的原因是索引命中或者扫描行数减少而不是因为缓存或者偶然因素。先建立基线。在优化之前用 ST05 跑一次跟踪记录目标语句的 Duration、Records、Executions。同时用 SQLM 创建一个快照记录同一语句哈希的总耗时和总执行次数。如果能在 HANA 侧拿到执行计划把优化前的计划也保存下来重点看扫描行数和算子类型。然后做优化动作。可能是加了一个索引可能是改了 CDS View 让过滤条件下推也可能是把循环里的 SELECT SINGLE 改成了集合查询。改完之后用同样的方式再跑一次 ST05 跟踪和 SQLM 快照。对比两次的数据。一个典型的成功结果是这样的优化前某条 SELECT 的 Duration 是 4200msRecords 是 180 万行执行计划显示 TABLE SCAN。优化后同样的 SELECTDuration 降到 180msRecords 降到 320 行执行计划显示 INDEX SCAN。这个对比就很清楚说明索引生效了扫描行数从 180 万降到 320。如果优化的是执行次数对比的重点是 Executions。比如优化前某条语句在循环里被调用了 5000 次总耗时 12 秒优化后改成一次集合查询Executions 变成 1总耗时 200ms。这种对比也很直观。验证的时候要注意排除干扰因素。比如不要在系统负载差异很大的两个时段做对比尽量选负载相近的时间。另外如果语句有绑定变量确保两次执行的绑定变量值是一样的否则计划可能不同。下面是一个验证结果的记录模板可以用表格形式指标优化前优化后变化Duration4200ms180ms-95.7%Records1,800,000320-99.98%Executions110算子类型TABLE SCANINDEX SCAN命中索引这个表格可以直接贴到排查记录里作为优化生效的证据。如果优化后 Duration 没降或者降得不明显需要回到执行计划看是不是索引没被用上或者是不是有别的瓶颈。还有一个验证动作是看执行计划里的算子变化。在 *.plv 文件里优化前可能看到大量的 TABLE SCAN 和 FILTER 算子优化后这些算子被 INDEX SCAN 和 LIMIT 替代。算子的代价数值也会明显下降。这个变化比单纯的耗时数字更有说服力因为它解释了为什么变快。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth 报错对照这一章列出排查过程中常见的报错和解决方法。先说你可能会在 TaoToken 调用时遇到的 401。这个报错的意思是认证失败通常是 API Key 不对或者没传。检查一下请求头里的 Authorization 字段格式应该是 Bearer 加空格加 Key。如果 Key 是从控制台复制的注意不要多复制空格或者换行。另外确认一下 Key 有没有过期在控制台里可以重新生成。local proxy failed 这个报错通常出现在你用本地代理工具转发请求的时候。可能是代理没启动或者端口配错了。如果你在 Claude Code 或者 Cline 里配了本地代理检查一下代理进程是否在跑端口是否和配置里的一致。如果不需要代理直接把 Base URL 设成 https://taotoken.net/api 就行不要走本地转发。reading choices 这个报错一般是在解析模型返回的时候出现的。可能是返回的 JSON 格式不对或者 choices 字段为空。先检查请求体里的 model 参数是否正确如果 Model ID 填错了接口可能返回一个非预期的结构。另外检查一下 max_tokens 是否设得太小导致返回被截断。如果返回里没有 choices 字段把完整的响应打印出来看看。OAuth 相关的报错通常出现在你用 OAuth 方式认证的时候。比如 token 过期、scope 不对、回调地址不匹配。如果你在工具里配的是 OAuth 认证检查一下 token 是否还有效必要时重新授权。如果用的是 API Key 认证一般不会碰到 OAuth 报错。确认一下工具的认证方式设置不要混用。还有一个常见问题是模型返回超时。如果你处理的 trace 文件很大或者执行计划文本很长模型可能需要较长时间才能返回。可以在配置里把 timeout 设大一些比如 60 秒。如果还是超时考虑把输入拆成更小的片段分多次调用。CC Switch 或者 Cline MCP 的配置问题也值得提一下。如果你用 CC Switch 管理多个模型配置确保 Base URL、Key、Model ID 三件套在每个配置里都填对了。Cline MCP 的配置类似检查一下 MCP server 的地址和认证信息。Codex 的 auth.json 里也要填对这三项。任何一个填错都会导致调用失败。最后检查一下网络连通性。在终端里 ping 一下 taotoken.net看看能不能通。如果 ping 不通可能是 DNS 或者网络策略的问题。另外确认一下防火墙有没有拦 HTTPS 请求。这些基础检查做完大部分报错都能定位到。6. 语义一致 CTA从排障到接入的下一步排查做完之后如果你想把这套流程固化下来或者需要在团队里推广下一步可以看接入文档。文档里有完整的 API 说明和示例地址是 https://taotoken.net/doc。里面会讲怎么在不同的工具里配置 Base URL 和 Key怎么处理流式返回怎么管理多个模型。如果你主要是做长期编码或者 Agent 任务可以看 Coding Plan。地址是 https://taotoken.net/coding-plan。这个套餐适合需要频繁调用模型的场景比如每次提交代码前跑一次静态分析或者用 Agent 自动处理重复任务。验证模型是否可用可以直接在模型对话页面测试。地址是 https://taotoken.net/chat。输入一段文本看看返回是否正常。如果返回正常说明 Key 和 Base URL 都没问题可以回到你的工具里继续配置。API Keys 的管理页面在 https://taotoken.net/api-keys。如果 Key 泄露或者需要轮换在这里可以重新生成。建议定期轮换 Key尤其是在团队协作的场景里。Claude Code 的接入文档在 https://taotoken.net/ClaudeCodeAnthropic。如果你用 Claude Code 做 trace 解读可以参考这里的配置步骤。文档里会讲怎么把 Base URL 和 Key 填到 settings.json 里怎么选 Model ID。整个链路走下来核心还是 ST05 抓数据、SQLM 做聚合、HANA 执行计划看算子、复测验证。TaoToken 只是在需要模型辅助解读的时候提供一个稳定的通道。工具是辅助判断还是靠人对指标的理解。把每次排查的结论沉淀下来下次遇到类似问题就能更快定位。