Performance 针对各种数据库表验证数据的性能

Performance 针对各种数据库表验证数据的性能,performance,abap,opensql,Performance,Abap,Opensql,我的问题是: 我将表“循环”到名为ls_eban的本地结构中 有了这些信息,我必须遵循以下说明: ls_eban-matnr必须在表zmd_scmi_st01(1.控制表(全局))中 ls_eban-werks必须在表zmd_scmi_st05中(2.控制表(全局)) ls_eban-knttp必须在表zmd_scmi_st06中(3.控制表(全局)) 我需要一个选择是明确和性能。我确实有一个,但它一点性能都没有 我的解决方案: SELECT st01~matnr st05~werks st06

我的问题是:

我将表“循环”到名为ls_eban的本地结构中

有了这些信息,我必须遵循以下说明:

  • ls_eban-matnr必须在表zmd_scmi_st01(1.控制表(全局))中
  • ls_eban-werks必须在表zmd_scmi_st05中(2.控制表(全局))
  • ls_eban-knttp必须在表zmd_scmi_st06中(3.控制表(全局))
  • 我需要一个选择是明确和性能。我确实有一个,但它一点性能都没有

    我的解决方案:

    SELECT st01~matnr st05~werks st06~knttp
      FROM       zmd_scmi_st01 AS st01
      INNER JOIN zmd_scmi_st05 AS st05
      ON         st05~werks = ls_eban-werks
      INNER JOIN zmd_scmi_st06 AS st06
      ON         knttp = ls_eban-knttp
    INTO TABLE   lt_control
    WHERE        st01~matnr = ls_eban-matnr AND st01~bedarf = 'X'
      AND        st05~bedarf = 'X'.
    

    我还必须说,控制表之间没有任何关系(没有主键也没有辅助键)。

    首先不应该在循环中使用select。而不是

    loop at lt_eban into ls_eban.
          Select ....
    endloop.
    
    你应该做一个选择

    if lt_eban[] is not initial.
       select ...
         into table ...
         from ...
          for all entries in lt_eban
        where ...
    endif.
    

    如果我们有更多的信息(如vwegert在评论中提到的,例如,控制表上真的没有键?),可能会有更多的低效率需要纠正,但循环中的选择是我首先想到的。能否请您向我们展示完整的代码示例以及所有相关表的结构?我只能猜测你的问题可能是什么,你不想得到一个纯粹是猜测的“答案”…如果3个控制表彼此没有关系,你就不应该加入它们。对每个规则进行单独的选择。此外,由于控制表的性质,它们通常是相对较小的表,因此您可以将每个表中的所有条目选择到一个单独的内部表中,然后在循环内部执行读取。感谢您的回复。实际上,循环中的选择是有效的:)但我会按你的方式尝试。。下周一,因为现在我回家了:D再次感谢:)非常友好!