【问题标题】:Most efficient way to select data set conditional upon each other from multiple tables从多个表中选择相互有条件的数据集的最有效方法
【发布时间】:2013-07-04 14:48:30
【问题描述】:

我有一个像这样的内部表:

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 条件?感谢任何指针!

【问题讨论】:

  • 您能否创建一个包含所有三个表的数据库视图并将其用于选择?您可以使用 SE16(n) 尝试一下...

标签: inner-join abap opensql


【解决方案1】:

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

另一个可以用来衡量绩效的交易是ST05

按照 VWEGERT 的建议,创建视图可能是您的最佳选择。在视图中处理您从同一个表 (HRP1001) 中选择两次这一事实可能会更容易。

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

前 2 个 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).

现在添加您的第三和第四选择:

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.

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

【讨论】:

  • 感谢 esti - 在阅读并尝试加入但非常有用的信息后,我决定让它变得更简单。
猜你喜欢
  • 2020-04-22
  • 2019-02-02
  • 1970-01-01
  • 2016-08-08
  • 2010-12-31
  • 1970-01-01
  • 2017-09-23
  • 1970-01-01
  • 2015-09-17
相关资源
最近更新 更多