群集表最有效的内存:“选择计数*”还是“选择.. endselect”?

问题描述

我想知道哪个语句(见下文)将更有效地确定Cluster Table的大小。或至少确定表大小是否达到某个阈值{n}。 效率意味着使用更少的PSAPTEMP表空间。

集群表的问题在于,为了获取表的一项,需要在集群的多个表中查找其中一个表项的字段。因此,不仅需要查看计数表。因此,对于每个条目,都需要查找几个条目。这使得读取效率低下。

SELECT COUNT(*) 
  ... 
  UP TO {n} rows.


SELECT *
  ...
  UP TO {n} ROWS.
ENDSELECT.             `and then determine the size of the result. `

在我看来,它们似乎是等效的,但使用阈值时可能不是。限制可能会有所不同,具体取决于读取数据的方式。编辑:当然,SELECT .. ENDSELECT是一个循环,因此原则上效率较低。

但是我想知道它实际上是如何工作的,并更好地了解它们之间的区别。到目前为止,看来我将不得不尝试一下。 我认为数据库会有所不同,但大多数情况下是Oracle。

解决方法

基本上选择Endselect将运行一个循环,并且将有多次到DB Server的行程。

从技术上选择SELECT COUNT(*)将一次执行一次DB服务器本身上的所有数据。

之后,您可以简单地将数据放入内部表中并在内部表中进行处理。

按照标准,即使正常的透明表放在簇表之外,也不建议这样做。

访问群集表非常昂贵。同样,更糟的是,您不能在群集表上使用任何索引。最好在where子句中提供尽可能多的数据。

始终优先使用以下命令从数据库服务器中获取数据:

从表中选择*到表中....

,然后在本地服务器上对其进行循环。

特别是在您的用例中,如果您要使用count(*)而不选择endselect,那将是最快的。

SAP ABAP认证顾问

,

我们无法真正创建所需的测试环境。所以没有最终答案。但是有一些教训:

  • 从集群表中读取数据应基于完整的主键序列(应通过主键访问-检索速度非常快,否则速度很慢)
  • 没有二级索引
  • 选择*是确定的,因为无论如何都会检索所有列。在多行上执行操作比单行操作更有效。 ->因此,您仍然要选择一个内部表。
  • 如果在内部表中选择了很多行,您可能仍想检索特定的列以减少所需的内存。
  • 有一种方法可以将群集转换为透明群集,但是会导致停机,而这对我们来说是没有办法的
  • 不支持综合SQL函数(SUM,AVG,MIN,MAX等)
,

使用带有 COUNT BIG 而不是 COUNT 的本机 SQL 可以使其内存效率不高,但可以防止由于计数器溢出而导致转储。