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

2020-08-30 01:59发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)大家好。 我在ABAP CDS...

         点击此处--->   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条回答
粗暴的香蕉
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的全扫描。

一周热门 更多>