我们正在迁移到 HANA,一家外部公司正在为我们的代码修复。其中一些是自动化的。我看到进行此代码更改的位置:
*{ REPLACE DEVK9A1ZZH
* SELECT SINGLE maktx
* INTO tab-maktx
* FROM makt
* WHERE matnr EQ strmatnr
* AND spras EQ sy-langu.
SELECT maktx
UP TO 1 ROWS
INTO tab-maktx
FROM makt
WHERE matnr = strmatnr
AND spras = sy-langu ORDER BY maktx.
ENDSELECT.
我认为SELECT SINGLE
总是比SELECT...UP TO 1 ROWS...ENDSELECT.
更可取,当只获得一条记录时,ORDER BY
什么都不做。似乎它们正在替换我们代码中的每个SELECT SINGLE
。我的同事的原始代码中哪些内容不符合 HANA 标准?
有时是必要的,大多数情况下不是
大多数情况下,这是不必要的,就像您的示例一样。
SELECT SINGLE
可分为3组:
- 完整的主键搜索
- 存在检查
- 其他
完整的主键搜索
matnr
和spras
是表makt
的主键字段,因此已经返回了同一行,与任何排序无关。
我想第三方工具不够复杂,无法检查所选表的关键字段。
存在检查
相当多的 SELECT SINGLEs 仅用于检查数据库中是否存在值。
SELECT SINGLE posnr
FROM VBPA
WHERE vbeln = iv_vbeln
我们不关心返回哪个项目编号,只关心它是否大于 0。这里的转换也是不必要的,排序无关紧要。
什么时候有用?
只有在第三种情况下,当我们没有完整的主键,但我们仍然关心排序时。这是非常罕见的。
检查主键很困难,而且完全不可能从代码中找出原始程序员是否需要特定的顺序。
此工具将为您提供比有用发现更多的误报。
都市传说(和我的经验,但我无法证明这一点(说常见的 DBMS 使用主键提供行,只是因为这是它们存储数据的方式。HANA 按列而不是按行排序,因此,当你只请求一行时,它会返回第一行"她"可以设法根据你的条件构建。
由于您无法执行SELECT SINGLE...ORDER BY
,因此必须找到另一种方法:
- 建议:满足
WHERE
子句时有足够的条件来获取您真正需要的行 - 要求 HANA 通过询问"仅一行,按主键查找"来模拟旧的 DBMS 行为
如果您设法始终提供具有足够条件的WHERE
子句,则可以继续使用 SINGLE 语法,但我担心有些公司会要求您不要这样做,因为他们面临着依赖旧 DMBS 行为的懒惰编码人员的结果:(
无论哪种方式,您的代码都很好(但在第一个未修复的版本中编码效率要高得多(,因为您正在发出 MAKTX (MATNR + SPRAS( 的主键,因此只能返回一条记录,并且顺序无关紧要。
HANA 自动修正通常似乎会执行许多不必要的"修复",但那一个特别烦人。