SELECT SINGLE vs SELECT UP TO 1 ROWS ENDSELECT 在 HANA 中的正确性?

SELECT SINGLE vs SELECT UP TO 1 ROWS ENDSELECT correctness in 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 标准的?

都市传说(和我的经验,但我无法证明)说普通的 DBMS 使用主键提供行,只是因为这是它们保存数据的方式。 HANA 按列排序而不是按行排序,因此当您只要求一行时,它 returns 给您第一行 "she" 可以根据您的条件进行构建。

由于您无法做到 SELECT SINGLE...ORDER BY,您必须找到替代方法:

  • 建议:用足够的条件满足 WHERE 子句以获得您真正需要的行
  • 要求 HANA 通过询问 "just a single row, seeking by primary key"
  • 来模拟旧的 DBMS 行为

如果你设法总是提供一个有足够条件的 WHERE 子句,你可以继续使用 SINGLE 语法,但我担心有些公司会要求你不要这样做,因为他们面临懒惰的结果依赖旧 DMBS 行为的编码人员:(

有时需要,大部分不需要

大多数情况下没有必要,就像您的示例一样。

SELECT SINGLEs 可以分为 3 组:

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

完整的主键搜索

matnrspras 是 table makt 的主键字段,因此已返回同一行,与任何排序无关。
我猜第三方工具不够复杂,无法检查所选 table 的关键字段。

存在检查

相当多的 SELECT SINGLE 仅用于检查数据库中是否存在值。

SELECT SINGLE posnr
    FROM VBPA 
    WHERE vbeln = iv_vbeln

我们不关心返回的是哪个item number,只要它大于0即可。这里的转换也是不必要的,排序无所谓。

什么时候有用?

只有第三种情况,当我们没有完整的主键,但我们仍然关心排序。这是非常罕见的。

检查主键很困难,而且根本不可能找出原始程序员是否需要代码中的特定顺序。

此工具给您带来的误报多于有用的发现。

无论哪种方式,您的代码都很好(但在第一个未修正的版本中编码效率更高),因为您发布的是 MAKTX (MATNR + SPRAS) 的主键,因此只能返回一条记录,并且顺序无关紧要。

HANA 自动修复通常似乎做了很多不必要的事情"fixes",但那个特别烦人。