简体   繁体   English

带有内连接的 Select 语句需要永远

[英]Select statement with inner join is taking forever

(....)
DATA: BEGIN OF g00 OCCURS 100,
            werks LIKE lqua-werks,
            lgort LIKE lqua-lgort,
            matnr LIKE lqua-matnr,
            charg LIKE lqua-charg,
            maktx LIKE makt-maktx,
            verme LIKE lqua-verme,
            meins LIKE lqua-meins,
            dispo LIKE marc-dispo,
      END OF g00.
(.....)
 CLEAR : g00.
  REFRESH : g00.
  SELECT lqua~bestq lqua~charg lqua~lgort lqua~lgnum lqua~lgpla
lqua~lgtyp lqua~matnr lqua~meins lqua~verme lqua~werks makt~maktx
         makt~matnr makt~spras mara~bismt mara~matnr marc~dispo
         marc~matnr marc~werks
  INTO (lqua-bestq , lqua-charg , lqua-lgort , lqua-lgnum , lqua-lgpla ,
 lqua-lgtyp , lqua-matnr , lqua-meins , lqua-verme , lqua-werks ,
makt-maktx , makt-matnr , makt-spras , mara-bismt , mara-matnr ,
marc-dispo , marc-matnr , marc-werks )
  FROM ( lqua
         INNER JOIN makt
         ON makt~matnr = lqua~matnr
         INNER JOIN mara
         ON mara~matnr = makt~matnr
         INNER JOIN marc
         ON marc~werks = lqua~werks
         AND marc~matnr = lqua~matnr )
         WHERE lqua~bestq IN sbestq
           AND lqua~lgnum IN slgnum
           AND lqua~lgpla IN slgpla
           AND lqua~lgtyp IN slgtyp
           AND lqua~matnr IN smatnr
           AND lqua~werks IN swerks
           AND makt~maktx IN smaktx
           AND makt~spras IN sspras
*           AND MARA~BISMT IN Sbismt
           AND marc~dispo IN sdispo.
    MOVE-CORRESPONDING mara TO g00.
    MOVE-CORRESPONDING makt TO g00.
    MOVE-CORRESPONDING marc TO g00.
    MOVE-CORRESPONDING lqua TO g00.
    COLLECT g00.
  ENDSELECT.

Can anyone help to improve the performance of code above.任何人都可以帮助提高上述代码的性能。

Your starting table for the join (LQUA) is not selecting on key or indexed fields, which will always run slower than if you are able to use them.您的连接起始表 (LQUA) 没有选择键或索引字段,它们的运行速度总是比您能够使用它们时慢。

While there doesn't appear to be a way to join everything on key fields, you might have better luck if you tweak the query to initially pull from MARA (where MATNR is a key field):虽然似乎没有办法连接关键字段上的所有内容,但如果您调整查询以最初从 MARA(其中 MATNR 是关键字段)中提取,您可能会更幸运:

FROM ( mara
         INNER JOIN makt
         ON makt~matnr = mara~matnr
         INNER JOIN lqua
         ON lqua~matnr = mara~matnr
         INNER JOIN marc
         ON marc~werks = mara~werks
         AND marc~matnr = mara~matnr )...

DO NOT use SELECT END SELECT in the scenario you have described below.不要在下面描述的场景中使用 SELECT END SELECT。 Try doing the following :尝试执行以下操作:

-> Create a local type with the fields you are picking up select ( lt_yourtype) -> 使用您选择的字段创建本地类型 select ( lt_yourtype)

( lqua~bestq lqua~charg lqua~lgort lqua~lgnum lqua~lgpla lqua~lgtyp lqua~matnr lqua~meins lqua~verme lqua~werks makt~maktx makt~matnr makt~spras mara~bismt mara~matnr marc~dispo marc~matnr marc~werks ) ( lqua~bestq lqua~charg lqua~lgort lqua~lgnum lqua~lgpla lqua~lgtyp lqua~matnr lqua~meins lqua~verme lqua~werks makt~maktx makt~matnr makt~spras mara~bismt mara~matnr marc~dispo marc ~matnr marc~werks )

-> Create work area ( prefer field symbol ) and internal table of the above local type ( lt_yourtype ) -> 创建工作区(首选字段符号)和上述本地类型( lt_yourtype )的内部表

-> Replace the given select with : -> 将给定的选择替换为:

select lqua~bestq lqua~charg lqua~lgort lqua~lgnum lqua~lgpla lqua~lgtyp lqua~matnr lqua~meins lqua~verme lqua~werks makt~maktx makt~matnr makt~spras mara~bismt mara~matnr marc~dispo marc~matnr marc~werks into table lt_yourtype FROM ( lqua INNER JOIN makt ON makt~matnr = lqua~matnr INNER JOIN mara ON mara~matnr = makt~matnr INNER JOIN marc ON marc~werks = lqua~werks AND marc~matnr = lqua~matnr ) WHERE lqua~bestq IN sbestq AND lqua~lgnum IN slgnum AND lqua~lgpla IN slgpla AND lqua~lgtyp IN slgtyp AND lqua~matnr IN smatnr AND lqua~werks IN swerks AND makt~maktx IN smaktx AND makt~spras IN sspras * AND MARA~BISMT IN Sbismt AND marc~dispo IN sdispo. select lqua~bestq lqua~charg lqua~lgort lqua~lgnum lqua~lgpla lqua~lgtyp lqua~matnr lqua~meins lqua~verme lqua~werks makt~maktx makt~matnr makt~spras mara~bismt mara~matnr marc~dispo marc ~matnr marc~werks 进入表 lt_yourtype FROM ( lqua INNER JOIN makt ON makt~matnr = lqua~matnr INNER JOIN mara ON mara~matnr = makt~matnr INNER JOIN marc ON marc~werks = lqua~werks AND marc~matnr = lqua ~matnr ) WHERE lqua~bestq IN sbestq AND lqua~lgnum IN slgpla AND lqua~lgpla IN slgpla AND lqua~lgtyp IN slgtyp AND lqua~matnr IN smatnr AND lqua~werks IN swerks AND makt~maktx IN smaktx AND m sspras * AND MARA~BIST IN Sbismt AND marc~dispo IN sdispo。

loop into lt_yourtype assigning .循环到 lt_yourtype 赋值。

*move data to the correct structure and fields here *将数据移动到此处的正确结构和字段

endloop.结束循环。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM