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 SINGLE
s 可以分为 3 组:
- 完整的主键搜索
- 存在检查
- 其他
完整的主键搜索
matnr
和 spras
是 table makt
的主键字段,因此已返回同一行,与任何排序无关。
我猜第三方工具不够复杂,无法检查所选 table 的关键字段。
存在检查
相当多的 SELECT SINGLE 仅用于检查数据库中是否存在值。
SELECT SINGLE posnr
FROM VBPA
WHERE vbeln = iv_vbeln
我们不关心返回的是哪个item number,只要它大于0即可。这里的转换也是不必要的,排序无所谓。
什么时候有用?
只有第三种情况,当我们没有完整的主键,但我们仍然关心排序。这是非常罕见的。
检查主键很困难,而且根本不可能找出原始程序员是否需要代码中的特定顺序。
此工具给您带来的误报多于有用的发现。
无论哪种方式,您的代码都很好(但在第一个未修正的版本中编码效率更高),因为您发布的是 MAKTX (MATNR + SPRAS) 的主键,因此只能返回一条记录,并且顺序无关紧要。
HANA 自动修复通常似乎做了很多不必要的事情"fixes",但那个特别烦人。
我们正在迁移到 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 SINGLE
s 可以分为 3 组:
- 完整的主键搜索
- 存在检查
- 其他
完整的主键搜索
matnr
和 spras
是 table makt
的主键字段,因此已返回同一行,与任何排序无关。
我猜第三方工具不够复杂,无法检查所选 table 的关键字段。
存在检查
相当多的 SELECT SINGLE 仅用于检查数据库中是否存在值。
SELECT SINGLE posnr
FROM VBPA
WHERE vbeln = iv_vbeln
我们不关心返回的是哪个item number,只要它大于0即可。这里的转换也是不必要的,排序无所谓。
什么时候有用?
只有第三种情况,当我们没有完整的主键,但我们仍然关心排序。这是非常罕见的。
检查主键很困难,而且根本不可能找出原始程序员是否需要代码中的特定顺序。
此工具给您带来的误报多于有用的发现。
无论哪种方式,您的代码都很好(但在第一个未修正的版本中编码效率更高),因为您发布的是 MAKTX (MATNR + SPRAS) 的主键,因此只能返回一条记录,并且顺序无关紧要。
HANA 自动修复通常似乎做了很多不必要的事情"fixes",但那个特别烦人。