Performance cobk和coep表上的内部联接占用大量时间

Performance cobk和coep表上的内部联接占用大量时间,performance,abap,opensql,Performance,Abap,Opensql,我试图连接两个表并将数据放入covp_itab内部表,但这需要很长时间。 此外,我试图从为两个表定义的数据库视图COVP中获取数据,这也花费了很长时间 SELECT bk~kokrs bk~belnr bk~budat bk~cpudt bk~bltxt ep~buzei ep~wkgbtr ep~objnr ep~gjahr ep~kstar ep~vrg

我试图连接两个表并将数据放入
covp_itab
内部表,但这需要很长时间。 此外,我试图从为两个表定义的数据库视图
COVP
中获取数据,这也花费了很长时间

SELECT bk~kokrs
       bk~belnr
       bk~budat
       bk~cpudt
       bk~bltxt
       ep~buzei
       ep~wkgbtr
       ep~objnr
       ep~gjahr
       ep~kstar
       ep~vrgng
       ep~parob1
       ep~beknz
       ep~sgtxt
       ep~objnr_n1
       ep~bukrs
INTO TABLE covp_itab
FROM cobk AS bk
INNER JOIN coep AS ep ON (bk~kokrs = ep~kokrs AND bk~belnr = ep~belnr)
WHERE bk~kokrs     = co_kokrs
AND   ep~wrttp     = '04'
AND   ep~kstar     IN s_kstar
AND   ep~vrgng     IN s_vrgng 
AND   ep~bukrs     IN r_bukrs
AND   bk~timestamp IN r_stamp.

这里可能有什么问题?

正如Jagger所提到的,您没有使用任何标准来利用这些表上的任何标准索引。我会做一系列的事情:

  • 使用SE11调查哪些索引可用于COEP,并查看您是否可能制定一个将使用其中一个索引的选择(使用附加标准)。必须为字段提供数据,以便索引COEP~2。字段为MANDT/OBJNR/KSTAR/GJAHR/PERIO/PAROB1。如果您无法提供OBJNR,但有KSTAR、GJAHR等,它将不会使用索引,因为您没有OBJNR。然而,如果您只有MANDT和OBJNR,它就可能使用这个索引
  • 将bk~kokrs更改为ep~kokrs,并将您的选择更改为从COEP读取,然后加入COBK
  • 对于一个您有(现在)5个标准的COEP记录,转到SE16,输入这些选择并运行它以查看需要多长时间。请注意,查询可能会被缓存,后续运行可能会更快,因此如果可能,请尝试使用不同的值
  • 如有必要,在COEP上创建一个附加索引。这些都是以插入和更新为代价的,所以请注意,只要有一个慢速select语句,就创建一个索引不是一个好主意
  • 如果您创建了索引,但没有改善这种情况,那么可以通过使用事务ST05运行SQL跟踪来找出正在使用哪些索引(如果有的话)

这些表可能需要更多索引,但很难说什么时候没有提供太多信息。看看你的解释计划。只有主键的一部分,即在你的查询中使用的KOKRS。选择条件中的所有其他字段都是非索引字段。这可能是可能的原因。另一个可能很简单,您在COEP表中有很多位置。这个表有多少条记录?在我的系统中,还有相当多的COEP表索引。尝试创建一个由字段(wrttp、kstar、vrgng、bukrs)组成的文件。记住,使用索引并不是没有任何成本的。如果此表的内容经常更改,则创建一个表可能不是一个好主意。请尝试在搜索条件中包含所有主键字段。这将大大加快select的执行速度。此外,正如贾格尔正确指出的那样,为了提出具体的建议,我们需要了解选择执行计划以及COBK和COEP行数。