首页 文章

ABAP从多个表中选择彼此条件的数据集的最有效方法

提问于
浏览
1

我有一个内部表,如:

TYPES: BEGIN OF gty_min_jobs,
            orgeh TYPE zgerpt_rnk_min-orgeh1,
            mnsty TYPE zgerpt_rnk_min-mnsty,
            mshort TYPE zgerpt_rnk_min-mshort,

            position TYPE hrp1001-sobid,
            job TYPE hrp1001-sobid,

            job_grade TYPE hrp9003-jobgr,
            scheme TYPE hrp9003-pg,
    END OF gty_min_jobs.

DATA: gt_min_jobs TYPE TABLE OF gty_min_jobs,
      gwa_min_jobs TYPE gty_min_jobs.

我需要从3个不同的数据库表中填充此表:zgerpt_rnk_min,hrp1001和hrp9003 .

我需要:

SELECT orgeh msty mshort FROM zgerpt_rnk_min INTO gt_table1.

SELECT position FROM hrp1001 INTO gt_table2 
  FOR ALL ENTRIES IN gt_table1 
    WHERE objid = gt_table1-orgeh AND
               otype = 'O' AND
               sclas = 'S' AND
               begda LE p_keydt AND
               endda GE p_keydt AND
               plvar ='01' AND
               istat = '1' AND
       objid IN (pnpobjid).

SELECT job FROM hrp1001 INTO gt_table3 
  FOR ALL ENTRIES IN gt_table2 
    WHERE objid = gt_table2-position AND
             otype = 'S' AND
             sclas = 'C' AND
             begda LE p_keydt AND
             endda GE p_keydt.

SELECT job_grade scheme FROM hrp9003 INTO gt_table4 
  FOR ALL ENTRIES IN gt_table3
     WHERE objid =  gt_table3-job AND
        begda LE p_keydt AND
        endda GE p_keydt.

使用各种循环将我的数据组合到我的内部表中 . 最有效的方法是什么?是否可以使用内部联接一次性选择所有必需的数据?如果是这样,我将如何纳入所有WHERE条件?感谢任何指针!

1 回答

  • 4

    最有效的做事方式是,并不总是完全明显的 . 事务 SAT (或旧系统中的 SE30 )是一个非常宝贵的工具 . 在这里,您可以测试程序的运行时间,查看哪些语句更有效,以及查看程序中的瓶颈 . 关于性能还有一些非常好的提示和技巧:

    enter image description here

    您可以用来衡量绩效的另一项交易是 ST05 .

    正如VWEGERT建议的那样,创建视图可能是您最好的选择 . 处理您从同一个表(HRP1001)中选择两次的事实在视图中可能会更容易 .

    为了论证,让我们尝试将您的select语句组合成一个选择:

    前两个select语句将组合如下:

    SELECT t1~orgeh t1~msty t1~mshort t2~position
      INTO gt_my_combined_table
      FROM zgerpt_rnk_min as t1
      JOIN hrp1001 as t2
      ON   t1~orgeh = t2~objid
      WHERE t2~otype = 'O' AND
            t2~sclas = 'S' AND
            t2~begda LE p_keydt AND
            t2~endda GE p_keydt AND
            t2~plvar ='01' AND
            t2~istat = '1' AND
            t2~objid IN (pnpobjid).
    

    现在添加您的第3和第4选择:

    SELECT t1~orgeh t1~msty t1~mshort t2~position t3~job t4~job_grade t4~scheme
      INTO gt_my_combined_table
      FROM zgerpt_rnk_min as t1
      JOIN hrp1001 as t2
      ON   t1~orgeh = t2~objid
      JOIN hrp1001 as t3
      ON   t2~position = t3~objid
      JOIN hrp9003
      ON   t3~job = t4~objid
      WHERE t2~otype = 'O' AND
            t2~sclas = 'S' AND
            t2~begda LE p_keydt AND
            t2~endda GE p_keydt AND
            t2~plvar ='01' AND
            t2~istat = '1' AND
            t2~objid IN (pnpobjid) AND
            t3~otype = 'S' AND
            t3~sclas = 'C' AND
            t3~begda LE p_keydt AND
            t3~endda GE p_keydt AND
            t4~begda LE p_keydt AND
            t4~endda GE p_keydt.
    

    我对这个怪诞的select语句的问题是数据库实际上可能会混淆使用哪个键或索引,从而导致顺序扫描效率非常低 . 我两次加入同一张 table 时也有点不舒服(尽管编译器似乎很满意) .

相关问题