选择单行与选择最多 1 行结束在 HANA 中选择正确性?



我们正在迁移到 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组:

  • 完整的主键搜索
  • 存在检查
  • 其他

完整的主键搜索

matnrspras是表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 自动修正通常似乎会执行许多不必要的"修复",但那一个特别烦人。

相关内容

  • 没有找到相关文章

最新更新