我们目前连接多个范围分区表,并对从设备收集的度量执行聚合。下面的表是范围分区的,其中date
列是分区键。
Table A
| device | date | kpi_a |
|--------|------------|-------|
| a | 2020-08-11 | 5 |
| b | 2020-08-10 | 3 |
Table B
| device | date | kpi_b |
|--------|------------|-------|
| a | 2020-08-11 | 1 |
| b | 2020-08-10 | 9 |
假设我们希望运行(伪)查询,以便:
select device, date, kpi_a + kpi_b as kpi_x
from table_a join table_b on date and device
group by date, device
当 Oracle 中的表按日期(每天)进行范围分区时,在同一日期(分区键)列中具有全局非唯一索引是否有帮助?
作为一个更广泛的问题,索引这两个(日期)范围分区表的好方法是什么?
这两种索引都不可能帮助没有谓词的查询。即使是分区也不太可能对选择和连接两个表中几乎所有行的查询有所帮助。
索引对于从表中选择一小部分数据非常有用——无论表的大小如何,遍历b树以检索一行都是非常快速的操作。但是如果您必须遍历每一行的索引,那么这比简单地读取整个表要多得多。
分区对于从表中选择大部分数据很有用——如果表被分成多个物理段,那么只需要读取相关的段。但是如果查询必须读取每一行,那么将表分成几部分只会增加工作量,因为额外的部分会有更多的开销。(尽管如果您在表之间有相同的分区,并且使用并行性,那么您可能会看到分区连接的优势。)
索引和分区不一定有助于快速组合数据——它们更适合快速消除不必要的数据。但是如果使用表中的所有数据,那么这些额外的数据结构就没有意义了。
通常,全局索引或本地索引之间的选择取决于查询涉及的谓词。如果查询几乎总是能够对修剪进行分区,那么使用较小的本地索引会更好。如果查询无法对修剪进行分区,则最好从一个大型全局索引而不是许多小型本地索引中读取。