SAP 性能优化最佳实践

作者:郑德鼎 约 25 分钟阅读 更新日期:2026-07-18 新发布 标签:性能, ABAP, Basis, HANA, 优化
目录

SAP 系统性能优化是一个系统工程,涉及 ABAP 代码、数据库、系统配置和前端表现等多个层面。本文从实际项目经验出发,系统梳理了各层面的优化最佳实践,并提供了具体的工具使用指南和代码示例。

一、ABAP 层面优化

1.1 SELECT 语句优化

SELECT 语句是 ABAP 性能问题的首要来源,以下是最关键的优化要点:

(1)避免 SELECT *

" ❌ 不推荐:读取所有字段 SELECT * FROM bkpf INTO TABLE @DATA(lt_bkpf) WHERE bukrs = @p_bukrs. " ✅ 推荐:只读取需要的字段 SELECT belnr, gjahr, blart, budat FROM bkpf INTO TABLE @DATA(lt_bkpf) WHERE bukrs = @p_bukrs.

(2)合理使用 WHERE 条件

" ❌ 不推荐:在 ABAP 层过滤 SELECT * FROM bkpf INTO TABLE @DATA(lt_bkpf). DELETE lt_bkpf WHERE bukrs <> p_bukrs. " ✅ 推荐:在数据库层过滤 SELECT belnr, gjahr FROM bkpf INTO TABLE @DATA(lt_bkpf) WHERE bukrs = @p_bukrs AND budat IN @s_budat.

(3)使用 UP TO n ROWS 限制结果集

" 仅需检查是否存在记录时 SELECT SINGLE matnr FROM mara INTO @DATA(lv_matnr) WHERE matnr = @p_matnr. " 需要限制行数时 SELECT matnr, maktx FROM makt INTO TABLE @DATA(lt_makt) UP TO 100 ROWS WHERE spras = @sy-langu.

(4)使用 JOIN 替代嵌套 SELECT

" ❌ 不推荐:嵌套 SELECT(N+1 问题) SELECT vbeln, kunnr FROM vbak INTO TABLE @DATA(lt_vbak). LOOP AT lt_vbak INTO DATA(ls_vbak). SELECT name1 FROM kna1 INTO @DATA(lv_name1) WHERE kunnr = @ls_vbak-kunnr. ENDLOOP. " ✅ 推荐:使用 JOIN SELECT vbak~vbeln, vbak~kunnr, kna1~name1 FROM vbak INNER JOIN kna1 ON vbak~kunnr = kna1~kunnr INTO TABLE @DATA(lt_result) WHERE vbak~vbeln IN @s_vbeln.

(5)合理使用 FOR ALL ENTRIES

" 使用前务必检查内表是否为空 IF gt_vbak IS NOT INITIAL. SELECT vbeln, posnr, matnr FROM vbap INTO TABLE @DATA(lt_vbap) FOR ALL ENTRIES IN @gt_vbak WHERE vbeln = @gt_vbak-vbeln. ENDIF.

注意

在 HANA 数据库上,JOIN 通常比 FOR ALL ENTRIES 性能更好,因为 HANA 对 JOIN 有专门的优化引擎。优先使用 JOIN,仅在无法用 JOIN 表达时才使用 FOR ALL ENTRIES。

1.2 内表操作优化

优化点不推荐写法推荐写法性能提升
遍历修改LOOP AT itab INTO wa. MODIFY itab. ENDLOOP.LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>).避免数据复制
内表查找STANDARD 表 + 顺序查找SORTED/HASHED 表 + 二分/哈希查找O(n) → O(log n) 或 O(1)
嵌套循环两层 LOOP AT ... WHERE内层使用 SORTED 表的表表达式数量级提升
删除重复循环 + READ TABLE 判断SORT itab. DELETE ADJACENT DUPLICATES.显著提升
批量插入循环 APPENDitab = VALUE #( FOR ... )预分配内存

1.3 缓冲表使用

对访问频率高、数据量小、更新少的表启用 SAP 表缓冲:

最佳实践

开启缓冲后,使用 ST05 跟踪缓冲命中率。如果命中率低于 90%,说明该表不适合缓冲或缓冲类型配置不当。对于频繁更新的表(如 BKPF、BSEG),不建议开启缓冲。

1.4 并行处理

对于可拆分的计算密集型任务,可以使用 ABAP 异步并行处理:

" 使用异步函数模块实现并行处理 DATA: lt_task TYPE TABLE OF indx. DO 10 TIMES. CALL FUNCTION 'Z_PARALLEL_PROCESS' STARTING NEW TASK lv_taskname DESTINATION IN GROUP p_group PERFORMING task_result ON END OF TASK EXPORTING iv_index = sy-index EXCEPTIONS system_failure = 1 communication_failure = 2 resource_failure = 3 OTHERS = 4. ENDDO. " 等待所有任务完成 WAIT UNTIL lv_completed = lv_total.

注意:并行处理需要足够的对话工作进程(DIA WP),在 RZ12 中配置服务器组。

二、数据库层面优化

2.1 HANA 数据库优化

SAP HANA 是内存数据库,优化策略与传统磁盘数据库有所不同:

优化项说明相关事务码/工具
列存储 vs 行存储分析型查询优先使用列存储,事务型操作可用行存储DBACOCKPIT → Tables
内存管理监控 HANA 内存使用,确保无内存泄漏DBACOCKPIT → Performance → Memory
Delta 存储频繁更新的表会产生 Delta 存储,需定期合并(Merge)DBACOCKPIT → Delta Storage
SQL 计划缓存清理过时的 SQL 执行计划DBACOCKPIT → SQL Cache
分区策略大表按年份或公司代码分区,提升查询和维护效率DBACOCKPIT → Table Partitioning

2.2 索引策略

正确的索引策略是数据库性能的关键:

索引使用检查

使用 ST05 SQL Trace 可以查看某条 SQL 语句是否使用了索引。如果出现全表扫描,考虑创建或调整索引。在 HANA 上,还可以使用 EXPLAIN PLAN 查看执行计划。

2.3 SQL 监控

持续监控 SQL 性能是优化的重要环节:

三、系统层面优化

3.1 内存参数调优

SAP 系统的内存参数直接影响性能,关键参数包括:

参数说明推荐值/调整方法
ztta/roll_areaROLL 区大小(每个工作进程)默认通常足够,不建议大幅调整
ztta/roll_extension扩展内存大小根据用户数和程序复杂度调整
em/initial_size_MB扩展内存初始大小建议物理内存的 50-70%
abap/heap_area_dia对话工作进程堆内存上限防止单个会话占用过多内存
abap/heap_area_nondia非对话工作进程堆内存上限后台作业通常需要更大堆内存
rsdb/uni/buffer_sizeUNI 缓冲区大小影响表缓冲效率

调整方法:通过 RZ11(动态参数,立即生效)或 RZ10(静态参数,需重启)修改。

3.2 工作进程配置

工作进程数量和类型配置是系统性能的基础:

工作进程类型功能配置建议
DIA(对话)处理用户交互按用户数配置,通常最多
UPD(更新)处理 V1 更新(关键业务数据)至少 2 个
UP2(更新2)处理 V2 更新(统计数据等)至少 1 个
BGD(后台)执行后台作业根据作业量配置
SPO(假脱机)打印请求处理至少 1 个
ENQ(入队)锁管理通常 1 个即可

通过 RZ04 配置工作进程数量,SM50 监控工作进程状态。

3.3 ST03N 性能分析

ST03N 是 SAP 系统级性能分析的核心工具:

四、前端层面优化

4.1 SAP GUI vs Fiori 性能对比

对比维度SAP GUISAP Fiori
协议DIAG/SAPGUI 协议(二进制压缩)HTTPS + OData(REST API)
数据传输量较小(仅传输增量数据)取决于 OData 调用设计
首次加载需要安装 SAP GUI 客户端浏览器直接访问,但首次加载需下载资源
交互延迟极低(本地渲染)依赖网络延迟(建议 < 100ms)
批量操作支持批量输入(BDC)支持批量操作(取决于 App 设计)
适用场景内部网高速环境、大量数据录入移动办公、决策支持、自助服务

4.2 网络优化

网络延迟是影响 Fiori 性能的关键因素:

4.3 ALV 报表性能

ALV 是 SAP 中最常用的报表展示方式,性能优化要点:

五、监控工具详解

5.1 工具速查表

事务码工具名称主要用途使用场景
ST05SQL Trace跟踪 SQL 语句执行分析慢查询、检查索引使用、缓冲命中率
ST03NWorkload Monitor系统负载分析查看响应时间趋势、识别热点事务码
SATABAP Runtime AnalysisABAP 程序运行时分析定位程序中耗时最长的方法/语句
SE30Runtime Analysis(旧版)ABAP 运行时分析(旧版)兼容性用途,建议使用 SAT
SM50/SM66Process Overview查看工作进程状态检查阻塞、长运行进程、系统负载
DBACOCKPITDBA Cockpit数据库管理监控HANA 内存、SQL 监控、备份、分区管理
SM21System Log系统日志查看系统错误、警告信息
ST22ABAP Dump AnalysisABAP 运行时错误分析程序中断原因

5.2 ST05 SQL Trace 使用详解

  1. 启动跟踪:ST05 → 勾选 SQL Trace → Activate Trace
  2. 执行业务操作:在目标会话中执行需要分析的操作
  3. 停止跟踪:Deactivate Trace
  4. 查看结果:Display Trace → 按需排序

分析重点

5.3 SAT 运行时分析使用详解

  1. 创建测量:SAT → 创建测量请求,指定事务码或程序名
  2. 执行测量:SAT 自动跟踪指定程序的执行
  3. 分析结果
    • Hierarchical(层次视图):查看调用链中各方法的耗时
    • Hit List(命中列表):按耗时排列所有执行单元
    • Timeline(时间线):查看执行过程中各阶段的时间分布

优化方向:如果大部分时间花在数据库访问上,优化 SQL;如果大部分时间花在 ABAP 处理上,优化内表操作和算法。

5.4 性能优化检查清单

层面检查项目标值工具
ABAP是否存在 SELECT *全部改为字段列表ST05, ATC
ABAP内表类型是否合理查找频繁的表使用 SORTED/HASHEDSAT, Code Review
ABAP是否存在嵌套循环替换为 JOIN 或 SORTED 表查找SAT
ABAP缓冲命中率> 90%ST05
数据库慢 SQL 数量响应时间 < 1 秒ST05, DBACOCKPIT
数据库索引使用情况无全表扫描ST05, EXPLAIN PLAN
数据库HANA 内存使用率< 80%DBACOCKPIT
系统平均响应时间< 1 秒ST03N
系统对话等待时间< 10% 总响应时间ST03N
系统工作进程利用率峰值 < 90%SM50, ST03N
前端Fiori 页面加载时间< 3 秒浏览器 DevTools
前端网络延迟< 100msPing, Traceroute
郑德鼎

关于作者:郑德鼎

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由作者基于多年 SAP 性能优化项目经验整理,仅用于内部技术分享与学习交流。