性能与技巧练习
性能与技巧练习 (10题)
#practice #performance #best-practices #analysis-tools
相关概念
📌核心模式(点击查看)
| 关键词 | 答案 |
|---|---|
| 循环中的 SELECT | 反模式 – 使用 JOIN 或预缓冲 |
| 标准表线性搜索 | 改用排序/哈希表 |
| LOOP 中的 ASSIGNING | 避免数据复制 |
| 代码检查器事务 | SCI |
| SQL 跟踪事务 | ST05 |
| 运行时分析提示 | 使用 Aggregation = None 变体 |
第1题 - 反模式:循环中的 SELECT [记忆]
为什么
LOOP中的SELECT被视为性能反模式?
📌点击查看答案
- 高网络开销(n 行需要 n 次往返)
- 数据库因重复语句准备和执行而承受负载
- 绕过潜在的缓冲优化
应改用 JOIN、FOR ALL ENTRIES 或在循环前将数据预缓冲到内表。
第2题 - 内表类型性能 [应用]
有一个包含 100,000 条记录的标准表,需要按键读取 50,000 次。做什么改变能带来最大的性能提升?
📌点击查看答案
1 | " 之前:每次读取 O(n) = 100,000 * 50,000 次操作 |
或者如果还需要索引访问,使用排序表。两者都比标准表线性搜索快得多。
第3题 - ASSIGNING 性能 [记忆]
LOOP AT itab ASSIGNING <fs>相比LOOP AT itab INTO wa有什么性能优势?
📌点击查看答案
ASSIGNING 提供指向表行的直接引用 – 无数据复制。INTO wa 每次迭代都将整行复制到工作区,而 MODIFY itab FROM wa 又复制回去。对于大型行结构或大量迭代,ASSIGNING 消除了所有复制开销。通过字段符号的更改直接修改表行。
第4题 - SELECT 优化 [应用]
程序读取
SELECT * FROM sbook WHERE customid = lv_id,但只使用 BOOKID、FLDATE 和 PRICE 字段。应如何优化?
📌点击查看答案
1 | SELECT bookid fldate price FROM sbook |
好处:减少数据库数据传输、减少应用服务器内存、可能使用覆盖索引。
第5题 - 表缓冲策略 [应用]
何时应使用 SAP 表缓冲,何时应避免?
📌点击查看答案
- 表频繁读取但很少更改
- 表相对较小(完全缓冲)或按泛型键访问
- 与数据库的数据一致性不是关键(可接受轻微延迟)
避免缓冲的条件:
- 表频繁更改(失效开销)
- 表非常大(内存压力)
- 需要实时数据(缓冲可能过期)
- 访问始终通过 JOIN(缓冲会被绕过)
第6题 - 代码检查器使用 [记忆]
代码检查器使用什么事务?主要检查类别有哪些?
📌点击查看答案
- 通用检查:数据格式
- 性能检查:WHERE 分析、缓冲绕过、低效表访问
- 安全检查:跨客户端访问、不充分的权限检查
- 语法检查/生成:扩展程序检查
- 编程规范:命名规范
- 搜索功能:令牌和语句搜索
第7题 - SQL 跟踪分析 [记忆]
SELECT 语句的 SQL 跟踪操作有哪些?各自做什么?
📌点击查看答案
- PREPARE:解析 SQL 文本,确定访问策略(优化器),创建执行计划
- OPEN/REOPEN:用实际值替换绑定变量,打开游标
- FETCH:将记录从数据库服务器传输到应用服务器
对于写操作,EXEC/REEXEC 替代 OPEN/REOPEN 和 FETCH。
SAP 游标缓存可以跳过相同 SQL 结构的 PREPARE。
第8题 - 运行时分析 [应用]
需要找出程序中最耗时的 ABAP 语句。描述使用运行时分析的步骤。
📌点击查看答案
- 调用运行时分析(事务 SAT 或 SE30)
- 创建 Aggregation = None 的变体以获取详细结果
- 输入程序名并执行
- 执行后点击分析
- 使用分组命中列表查看按调用类型(子程序、FM、方法、表操作)的时间分布
- 按总时间降序排列找到最耗时的操作
- 双击单个项目并按显示源代码查看精确的语句
第9题 - 性能比较 [分析]
一位同事建议在 1000 条记录的循环中使用
SELECT SINGLE,对比单次FOR ALL ENTRIES。比较两种方案。
📌点击查看答案
| 方案 | 数据库调用 | 性能 |
|---|---|---|
| 循环中的 SELECT SINGLE | 1000 次调用 | 非常差(1000 次往返) |
| FOR ALL ENTRIES | 1 次调用(或少量) | 好得多 |
FOR ALL ENTRIES 远优于循环方式,因为它将所有查找合并到单个 SQL 语句中。但需确保驱动表非空且不太大。
更好的方案:如果两个数据库表之间有关系,使用 JOIN,因为它完全避免了中间步骤。
第10题 - 新旧调试器对比 [分析]
何时需要使用新调试器而非传统调试器?
📌点击查看答案
- 调试转换出口或字段出口(旧调试器不支持)
- 在调试会话之间保持调试器设置
- 使用可配置 UI和多个桌面
- 避免干扰应用程序的滚动区
新调试器在独立的外部会话中运行,消除了干扰。但它需要一个可用的外部会话(每用户最多 6 个 – 如果已打开 6 个,则无法启动新调试器)。
📌模式总结(点击查看)
| 关键词 | 答案 |
|---|---|
| 循环中的 SELECT | 反模式;使用 JOIN/预缓冲 |
| 哈希表查找 | O(1) vs 标准表的 O(n) |
| ASSIGNING | 无复制,直接修改 |
| SELECT * | 反模式;指定列 |
| 何时缓冲 | 读多改少,小表 |
| SCI | 代码检查器事务 |
| ST05 | SQL 跟踪事务 |
| PREPARE/OPEN/FETCH | SELECT 的 SQL 跟踪操作 |