Improving Performance of FOR ALL ENTRIES QUERY

本文介绍如何通过排序和删除重复记录来优化ABAP中FOR ALLENTRIES语句的性能,展示了具体实现方法及前后性能对比。

如何提高FOR  ALL ENTRIES的查询性能主要从两个方面入手
1 对FOR ALL ENTRIES的驱动表按比较关键字排序;

2  删除FOR ALL ENTRIES的驱动表中比较关键字排序;


REPORT ZEXIT_HELP no standard page heading.
DATA: it_mara TYPE STANDARD TABLE OF mara,
wa_mara TYPE mara,
it_makt TYPE STANDARD TABLE OF makt,
wa_makt TYPE makt,
it_temp_mara TYPE STANDARD TABLE OF mara,
wa_temp_mara TYPE mara.
* Get all the records from MARA
SELECT * FROM mara
INTO TABLE it_temp_mara.
IF sy-subrc = 0.
  IF it_temp_mara[] IS NOT INITIAL.
* Duplicate the driver table with the data
    do 2 times.
      append lines of it_Temp_mara to it_mara.
    enddo.
    IF it_mara[] IS NOT INITIAL.
* Select MAKT
      perform select_makt.
*After Sorting
      sort it_mara by matnr.
      perform select_makt.
* After deleting duoplicateentries
      DELETE ADJACENT DUPLICATES FROM it_mara COMPARING matnr.
      perform select_makt.
    ENDIF.
  ENDIF.
ENDIF.
*&---------------------------------------------------------------------*
*& Form select_makt
*&---------------------------------------------------------------------*
* Select data friom MAKT
*----------------------------------------------------------------------*
form select_makt .
  DATA: t1 TYPE i,
  t2 TYPE i,
  tmin TYPE i.
  refresh it_makt[].
  GET RUN TIME FIELD t1.
  SELECT *
  FROM makt
  INTO TABLE it_makt
  FOR ALL ENTRIES IN it_mara
  WHERE matnr = it_mara-matnr.
  GET RUN TIME FIELD t2.
  tmin = t2 - t1.
  tmin = tmin .
  WRITE:/ ' Time(ms) = ', tmin.
Endform.                    "select_makt

测试结果

No of run Records in MARA Records in MAKT Time required ( mili-seconds)
Before sort After Sort After sort and delete adjacent duplicates 
112053719074040.263373.7382017.051
212053719074784.9533387.2412007.644
Average Time    

几个注意点:
1、有FOR ALL ENTRIES IN itab的不能使用order by;
2、如果 itab无数据,where语句就当没有条件处理;
3、系统自动删除重复纪录;

关于ranges和FOR ALL ENTRIES IN的使用大家可以参阅SAP的标准代码的使用方法,代码参见函数MRM_INVHEAD_MANY_READ,摘抄如下:

  SORT t_lifnr.
  DELETE ADJACENT DUPLICATES FROM t_lifnr.
  DESCRIBE TABLE t_lifnr LINES count.
  if count < 5000.
      SELECT * FROM rbkp INTO TABLE t_rbkp
                     WHERE belnr  IN t_belnr
                     AND   gjahr  IN t_gjahr
                     AND   bukrs  IN t_bukrs
                     AND   bldat  IN t_bldat
                     AND   budat  IN t_budat
                     AND   lifnr  IN t_lifnr
                     AND   ivtyp  IN rg_ivtyp.
    else.
      SELECT * FROM rbkp INTO TABLE t_rbkp
                     FOR ALL ENTRIES IN t_lifnr
                     WHERE lifnr  = t_lifnr-low
                     AND   belnr  IN t_belnr
                     AND   gjahr  IN t_gjahr
                     AND   bukrs  IN t_bukrs
                     AND   bldat  IN t_bldat
                     AND   budat  IN t_budat
                     AND   ivtyp  IN rg_ivtyp.
endif.


六自由度机械臂ANN人工神经网络设计:正向逆向运动学求解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)内容概要:本文档围绕六自由度机械臂的ANN人工神经网络设计展开,详细介绍了正向与逆向运动学求解、正向动力学控制以及基于拉格朗日-欧拉法推导逆向动力学方程的理论与Matlab代码实现过程。文档还涵盖了PINN物理信息神经网络在微分方程求解、主动噪声控制、天线分析、电动汽车调度、储能优化等多个工程与科研领域的应用案例,并提供了丰富的Matlab/Simulink仿真资源和技术支持方向,体现了其在多学科交叉仿真与优化中的综合性价值。; 适合人群:具备一定Matlab编程基础,从事机器人控制、自动化、智能制造、电力系统或相关工程领域研究的科研人员、研究生及工程师。; 使用场景及目标:①掌握六自由度机械臂的运动学与动力学建模方法;②学习人工神经网络在复杂非线性系统控制中的应用;③借助Matlab实现动力学方程推导与仿真验证;④拓展至路径规划、优化调度、信号处理等相关课题的研究与复现。; 阅读建议:建议按目录顺序系统学习,重点关注机械臂建模与神经网络控制部分的代码实现,结合提供的网盘资源进行实践操作,并参考文中列举的优化算法与仿真方法拓展自身研究思路。
<think>好的,我需要回答用户关于如何通过遵循I/O大小和对齐的最佳实践来提升性能的问题。首先,我得理解I/O大小和对齐的基本概念,然后找出它们如何影响性能。接下来,我需要整理出具体的最佳实践方法,比如使用合适的块大小、对齐数据、直接I/O等。同时,要结合实际例子和应用场景,让回答更具操作性。可能还需要考虑不同文件系统或存储设备的差异,以及工具推荐,比如fdisk或parted。最后,生成相关问题,确保覆盖用户可能感兴趣的扩展话题。要注意使用正确的中文术语,并按照用户要求的结构化格式来组织内容,同时确保所有数学表达式和代码块符合格式规范。</think>### 通过遵循I/O大小和对齐方式提升性能的方法 #### 1. **理解I/O大小和对齐的基本原理** - **I/O块大小**:存储设备(如HDD、SSD)对数据的读写以固定大小的块(如4KB、8KB)为单位。若应用程序的I/O请求大小与设备块大小匹配,可减少读写次数,避免“部分块写入”问题[^1]。 - **对齐(Alignment)**:数据在存储介质上的起始位置需是块大小的整数倍。例如,若块大小为4KB,则数据应从偏移量0、4KB、8KB等位置开始。未对齐的I/O会导致单个操作跨越多个块,增加延迟[^2]。 #### 2. **具体优化方法** - **选择合适的I/O请求大小** 使用与存储设备块大小匹配的I/O请求。例如,对4KB块大小的SSD,应尽量以4KB的倍数(如4KB、8KB、16KB)发起读写请求。 **代码示例(Linux系统调用)**: ```c #define BLOCK_SIZE 4096 // 4KB对齐 char *buffer = memalign(BLOCK_SIZE, BUFFER_SIZE); // 分配对齐的内存 ``` - **对齐内存和文件偏移** 内存缓冲区的地址和文件偏移量需同时对齐。例如,在Linux中通过`posix_memalign`分配对齐内存: ```c posix_memalign(&buffer, BLOCK_SIZE, BUFFER_SIZE); ``` - **启用直接I/O(Direct I/O)** 绕过操作系统缓存,直接与设备交互,避免缓存对齐问题。例如,在Linux中使用`O_DIRECT`标志: ```c int fd = open("file.dat", O_RDWR | O_DIRECT); ``` - **分区对齐(针对RAID或SSD)** 使用工具如`fdisk`或`parted`时,设置分区的起始偏移为1MB(如2048扇区),避免跨物理块边界: ```bash parted -a optimal /dev/sdb mkpart primary 1MiB 100% ``` #### 3. **验证工具与实践** - **检查对齐状态** 使用`fdisk -l`查看分区起始扇区(需为8的倍数,如2048)。 **数学验证公式**: 若设备物理块大小为$4\text{KB}$(即8个512B扇区),分区的起始扇区$S$需满足: $$S \mod 8 = 0$$ - **性能测试工具** 通过`fio`或`dd`测试不同对齐配置的性能差异: ```bash fio --name=test --ioengine=libaio --rw=randwrite --bs=4k --direct=1 --size=1G ``` #### 4. **应用场景** - **数据库系统**:如MySQL的`innodb_page_size`需与存储块大小匹配[^2]。 - **高性能计算**:大规模数据读写时,对齐可减少I/O碎片。 - **虚拟化**:虚拟机磁盘镜像(如qcow2)的分块需对齐宿主机存储。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值