【问题标题】:Global and local indexing approach on a range partitioned table范围分区表上的全局和本地索引方法
【发布时间】:2020-12-01 13:24:09
【问题描述】:

我们目前加入多个范围分区表并对从设备收集的指标执行聚合。下面的表格是范围分区的,其中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 中的表按日期(每天)进行范围分区时,在同一日期(分区键)列中具有全局非唯一索引是否有帮助?

作为一个更广泛的问题,索引这两个(日期)范围分区表的好方法是什么?

【问题讨论】:

    标签: database oracle indexing


    【解决方案1】:

    这两种索引都不可能帮助没有谓词的查询。即使是分区也不太可能对从两个表中选择和连接几乎所有行的查询有所帮助。

    索引对于从表中选择一小部分数据很有用 - 无论表的大小如何,遍历 b-tree 以检索一行都是一种非常快速的操作。但是,如果您必须遍历每一行的索引,这比简单地读取整个表要多得多。

    分区对于从表中选择大部分数据很有用 - 如果表被分成多个物理段,则只需要读取相关段。但是,如果查询必须读取每一行,那么将表分成几部分只会增加工作量,因为额外的段会有更多的开销。 (尽管如果您在表之间有相同的分区,并且使用并行性,那么您可能会看到分区连接的优势。)

    索引和分区不一定有助于快速组合数据 - 它们更适合快速消除不必要的数据。但是,如果使用表中的所有数据,那么这些额外的数据结构就没有意义了。

    通常,选择全局索引还是本地索引取决于您的查询涉及哪些谓词。如果查询几乎总是能够分区修剪,那么使用较小的本地索引会更好。如果查询不能分区修剪,那么最好从一个大的全局索引而不是许多小的本地索引中读取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-18
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 2013-11-06
      • 2020-11-24
      • 2012-02-27
      • 1970-01-01
      相关资源
      最近更新 更多