带参数的CDS视图的奇怪行为

2020-08-30 01:59发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好。

我在ABAP CDS视图中发现了一件奇怪的事情。

我在QMEL表上映射了一个简单的CDS视图,没有联接和关联。

 @ AbapCatalog.sqlViewName:'ZTI_NOT_LCL_V'
 @ AbapCatalog.compiler.CompareFilter:是
 @ AbapCatalog.preserveKey:是
 @ AccessControl.authorizationCheck:#NOT_REQUIRED
 @ EndUserText.label:"通知数据的CDS视图"
 定义视图zti_not_lcl
 从qmel中选择
 {键qmel.qmnum,
     qmel.qmart,
     qmel.objnr,
     qmel.qmtxt,
     qmel.priok,
     qmel.qmdat,
     qmel.mzeit,
     qmel.ltrmn,
     qmel.ltrur,
     qmel.qmcod
 } 

这是我的查询:

 SELECT * FROM zti_not_lcl_v INTO TABLE @DATA(lt_table)
 哪里
   qmnum ='000200000046'。
 

上面编写的查询给出了此执行计划:

 ---------------------------------------------------  ---------------------------------------
 |  ID |操作| 姓名| 行| 字节数| 费用(%CPU)| 时间|
 --------------------------------------------------  ------------------------------------
 |  0 |  SELECTSTATE |  |  1 |  92 |  1(100)|  00:00:01 |
 |  1 | 按索引行访问表|  QMEL |  1 |  92 |  0(0)|  00:00:01 |
 | * 2 | 索引唯一扫描| QMEL〜0 |  1 |  |  0(0)|  00:00:01 |
 --------------------------------------------------  ------------------------------------
 

很好。

确定,然后在我的视图中添加一个参数P_LANGU:

 @ AbapCatalog.sqlViewName:'ZTI_NOT_LCL_V'
 @ AbapCatalog.compiler.CompareFilter:是
 @ AbapCatalog.preserveKey:是
 @ AccessControl.authorizationCheck:#NOT_REQUIRED
 @ EndUserText.label:"通知数据的CDS视图"
 定义视图zti_not_lcl
 带有参数p_langu:abap.lang
 从qmel中选择
 {键qmel.qmnum,
     qmel.qmart,
     qmel.objnr,
     qmel.qmtxt,
     qmel.priok,
     qmel.qmdat,
     qmel.mzeit,
     qmel.ltrmn,
     qmel.ltrur,
     qmel.qmcod
 } 

进行查询:

 SELECT * FROM zti_not_lcl_v(p_langu ='E')插入表@DATA(lt_table)
 哪里
   qmnum ='000200000046'。
 

抢先执行ST05中的执行计划。 我看到将查询分为两部分的奇怪现象,并且看到两个执行步骤:

Step1

 ---------------------------------------------------  --------------------------------------------------  -
 |  ID |操作|名称| 行| 字节数| 费用(%CPU)| 时间|
 --------------------------------------------------  -------------------------------------------------
 |  0 |  SELECTSTATE |  |  1 |  2 |  17(6)|  00:00:01 |
 | * 1 | 收集隔离剂腌制剂|  ZTI_NOT_LCL_V |  1 |  2 |  16(0)|  00:00:01 |
 --------------------------------------------------  -------------------------------------------------
 

点击"说明"后,我又有了一个计划

Step2

 ---------------------------------------------------  ---------------------------
 |  ID |操作| 姓名| 行| 字节数| 费用(%CPU)| 时间|
 --------------------------------------------------  ------------------------
 |  0 |  SELECTSTATE |  |  998 |  91816 |  8(13)|  00:00:01 |
 |  1 | 表访问已满|  QMEL |  998 |  91816 |  7(0)|  00:00:01 |
 --------------------------------------------------  ------------------------
 

让我感到困惑的是-表访问已满,即使我确实通过主键查询也是如此。

您对这种行为有任何想法吗?

数据库服务器ORACLE 12.1.0.2.0

SAP_BASIS 740 0012SAPKB74012 SAP基础组件

SAP_ABA 740 0012 SAPKA74012跨应用程序组件

SAP_GWFND 740 0013 SAPK-74013INSAPGWFND SAP Gateway Foundation 7.40

sql.jpg (56.8 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好。

我在ABAP CDS视图中发现了一件奇怪的事情。

我在QMEL表上映射了一个简单的CDS视图,没有联接和关联。

 @ AbapCatalog.sqlViewName:'ZTI_NOT_LCL_V'
 @ AbapCatalog.compiler.CompareFilter:是
 @ AbapCatalog.preserveKey:是
 @ AccessControl.authorizationCheck:#NOT_REQUIRED
 @ EndUserText.label:"通知数据的CDS视图"
 定义视图zti_not_lcl
 从qmel中选择
 {键qmel.qmnum,
     qmel.qmart,
     qmel.objnr,
     qmel.qmtxt,
     qmel.priok,
     qmel.qmdat,
     qmel.mzeit,
     qmel.ltrmn,
     qmel.ltrur,
     qmel.qmcod
 } 

这是我的查询:

 SELECT * FROM zti_not_lcl_v INTO TABLE @DATA(lt_table)
 哪里
   qmnum ='000200000046'。
 

上面编写的查询给出了此执行计划:

 ---------------------------------------------------  ---------------------------------------
 |  ID |操作| 姓名| 行| 字节数| 费用(%CPU)| 时间|
 --------------------------------------------------  ------------------------------------
 |  0 |  SELECTSTATE |  |  1 |  92 |  1(100)|  00:00:01 |
 |  1 | 按索引行访问表|  QMEL |  1 |  92 |  0(0)|  00:00:01 |
 | * 2 | 索引唯一扫描| QMEL〜0 |  1 |  |  0(0)|  00:00:01 |
 --------------------------------------------------  ------------------------------------
 

很好。

确定,然后在我的视图中添加一个参数P_LANGU:

 @ AbapCatalog.sqlViewName:'ZTI_NOT_LCL_V'
 @ AbapCatalog.compiler.CompareFilter:是
 @ AbapCatalog.preserveKey:是
 @ AccessControl.authorizationCheck:#NOT_REQUIRED
 @ EndUserText.label:"通知数据的CDS视图"
 定义视图zti_not_lcl
 带有参数p_langu:abap.lang
 从qmel中选择
 {键qmel.qmnum,
     qmel.qmart,
     qmel.objnr,
     qmel.qmtxt,
     qmel.priok,
     qmel.qmdat,
     qmel.mzeit,
     qmel.ltrmn,
     qmel.ltrur,
     qmel.qmcod
 } 

进行查询:

 SELECT * FROM zti_not_lcl_v(p_langu ='E')插入表@DATA(lt_table)
 哪里
   qmnum ='000200000046'。
 

抢先执行ST05中的执行计划。 我看到将查询分为两部分的奇怪现象,并且看到两个执行步骤:

Step1

 ---------------------------------------------------  --------------------------------------------------  -
 |  ID |操作|名称| 行| 字节数| 费用(%CPU)| 时间|
 --------------------------------------------------  -------------------------------------------------
 |  0 |  SELECTSTATE |  |  1 |  2 |  17(6)|  00:00:01 |
 | * 1 | 收集隔离剂腌制剂|  ZTI_NOT_LCL_V |  1 |  2 |  16(0)|  00:00:01 |
 --------------------------------------------------  -------------------------------------------------
 

点击"说明"后,我又有了一个计划

Step2

 ---------------------------------------------------  ---------------------------
 |  ID |操作| 姓名| 行| 字节数| 费用(%CPU)| 时间|
 --------------------------------------------------  ------------------------
 |  0 |  SELECTSTATE |  |  998 |  91816 |  8(13)|  00:00:01 |
 |  1 | 表访问已满|  QMEL |  998 |  91816 |  7(0)|  00:00:01 |
 --------------------------------------------------  ------------------------
 

让我感到困惑的是-表访问已满,即使我确实通过主键查询也是如此。

您对这种行为有任何想法吗?

数据库服务器ORACLE 12.1.0.2.0

SAP_BASIS 740 0012SAPKB74012 SAP基础组件

SAP_ABA 740 0012 SAPKA74012跨应用程序组件

SAP_GWFND 740 0013 SAPK-74013INSAPGWFND SAP Gateway Foundation 7.40

sql.jpg (56.8 kB)
付费偷看设置
发送
2条回答
粗暴的香蕉
1楼-- · 2020-08-30 02:43

你好Nalluri。

我想建立这样的视图:

定义视图zti_not_lcl
 带有参数p_langu:abap.lang
 从qmel左外部联接t356_t中选择
 在t356_t.artpr = qmel.artpr上
 和t356_t.priok = qmel.priok
 和t356_t.spras = $ parameters.p_langu

 {键qmel.qmnum,
     qmel.qmart,
     qmel.objnr,
     qmel.qmtxt,
     qmel.priok,
     t356_t.priokx,
     qmel.qmdat,
     qmel.mzeit,
     qmel.ltrmn,
     qmel.ltrur,
     qmel.qmcod
 }
 

但是当我在视图中添加任何参数时,始终会执行QMEL的全扫描。

Climb_Ma
2楼-- · 2020-08-30 02:51

参数p_LANGU只是在CDS视图中没有条件的情况下挂出,可以尝试使用 下面的代码,看看(对不起,我没有系统进行尝试)

定义视图zti_not_lcl
 带有参数notification_no:qmnum
 从qmel中选择
 {键qmel.qmnum,
     qmel.qmart,
     qmel.objnr,
     qmel.qmtxt,
     qmel.priok,
     qmel.qmdat,
     qmel.mzeit,
     qmel.ltrmn,
     qmel.ltrur,
     qmel.qmcod
 },其中qmnum = notification_no; 

一周热门 更多>