首页 > 解决方案 > 集群表的内存效率最高:“select count(*)”或“select .. endselect”?

问题描述

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

集群表的问题在于,为了获得表的条目,需要在集群的多个表中查找一个条目的字段,这些表分散在这些表中。因此,需要查看的不仅仅是计数表。因此,对于每个条目,需要查找多个条目。这使得读取效率低下,并且由于 COUNT 使用可能溢出的 INT 数据类型,因此可能会使其转储。

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


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

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

但我想知道它实际上是如何工作的,并更好地理解其中的区别。到目前为止,我似乎必须尝试一下。我假设数据库会有所不同,但通常是 Oracle。

标签: abapopensql

解决方案


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

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

推荐阅读