问题描述
我有Microsoft sql Server的背景,经常使用诸如CROSS APPLY
和CTE
(公用表表达式)之类的功能来编写查询。我目前正在尝试使用CROSS APPLY
在SAP HANA中编写查询,但似乎不受支持。
我确实发现LEFT OUTER JOIN LAteraL
可能等同于Microsoft sql Server CROSS APPLY
,但是在我正在使用的SAP HANA版本中(SAP HANA版本2.00.037.02.1562323855 [系统->状态])。看来它已经在HANA 2.0 SPS04版中发布了,但这不是我公司所使用的。
这是我过去成功使用的CROSS APPLY
替代品的示例。但是性能似乎变差了,我摆脱了内存错误。我怀疑数据集正在增长并且变得很大,并且查询效率越来越低。
FROM SAPECC.AUFK AS AUFK
LEFT OUTER JOIN
(
SELECT *,ROW_NUMBER() OVER (PARTITION BY MANDT,OBJNR ORDER BY UDATE DESC) AS RowNumber
FROM SAPECC.JCDS
WHERE STAT = 'I0045' AND INACT = ''
) JCDS ON JCDS.OBJNR = AUFK.OBJNR AND JCDS.MANDT = AUFK.MANDT AND JCDS.RowNumber = 1
有其他建议吗?
解决方法
您可能想尝试使用相关子查询而不是ROW_NUMBER()
:
select ...
from sapecc.aufk as a
left join sapecc.jcds as j
on j.objnr = a.objnr
and j.mandt = a.mandt
and j.stat = 'I0045'
and j.inact = ''
and j.udate = (
select max(j1.udate)
from sapecc.jcds as j1
where
j1.objnr = a.objnr
and j1.mandt = a.mandt
and j1.stat = 'I0045'
and j1.inact = ''
)
此查询应利用(objnr,mandt,stat,inact,udate desc)
上的索引。
您可以将MSSQL与HANA所用的CTE方法相同:
WITH most_recent_JCDS as (
SELECT * FROM (
SELECT *,ROW_NUMBER()
OVER (PARTITION BY MANDT,OBJNR
ORDER BY UDATE DESC) AS RowNumber
FROM SAPECC.JCDS
WHERE STAT = 'I0045'
AND INACT = '')
WHERE
RowNumber = 1)
SELECT
AUFK. ...,JCDS. ...
FROM
SAPECC.AUFK AUFK
LEFT OUTER JOIN most_recent_JCDS JCDS
ON
(JCDS.OBJNR,JCDS.MANDT)
= (AUFK.OBJNR,AUFK.MANDT);
关于性能或查询效率的担忧只能通过检查实际执行来解决。 PlanViz和EXPLAIN PLAN是实现此目的的工具。
假设某些索引“应该”帮助提供了50/50的机会来使其正确(最好)。