Oracle中分区表的本地索引与全局索引
我划分了一个表,该表几乎以每天700-800万行的速度增长。分区是使用时间戳列完成的,因为数据可以在几周后存档或丢弃。我还在表上创建了一个索引,该索引位于主键或另一个唯一值上。我的索引也是分区的,但是索引的分区是使用哈希函数完成的,不包括表的分区键(它是时间戳)。所以我有几个问题 该表是一个写密集型表。它目前主要是插入,每行更新一次,并在创建索引id后的几秒钟内进行2-3次查找,然后再也不会为任何操作访问该记录Oracle中分区表的本地索引与全局索引,oracle,database-partitioning,Oracle,Database Partitioning,我划分了一个表,该表几乎以每天700-800万行的速度增长。分区是使用时间戳列完成的,因为数据可以在几周后存档或丢弃。我还在表上创建了一个索引,该索引位于主键或另一个唯一值上。我的索引也是分区的,但是索引的分区是使用哈希函数完成的,不包括表的分区键(它是时间戳)。所以我有几个问题 该表是一个写密集型表。它目前主要是插入,每行更新一次,并在创建索引id后的几秒钟内进行2-3次查找,然后再也不会为任何操作访问该记录 在唯一id上定义本地索引是最佳选择,还是像我已经做的那样定义全局索引并对它们进行分
- 在唯一id上定义本地索引是最佳选择,还是像我已经做的那样定义全局索引并对它们进行分区更好?如果我定义了全局索引,其中没有表分区键(timestamp,在查找中不使用),那么如果分区数量很大,访问会更昂贵吗李>
- 对于不断增长的数据,使用全局分区索引的缺点是什么李>
- 一旦我决定稍后删除分区,由于索引不是按时间戳而是按唯一id进行分区,该操作会对功能索引产生直接影响吗李>
任何其他建议都会有所帮助 实际上,我不知道有什么理由使索引分区不同于表分区(这就是您所拥有的) 创建全局索引或局部索引,即分区索引,其中索引的分区与基础表的分区相同 当您有全局索引并且删除或截断分区时,全局索引将变得“不可用”,必须重新生成。通过在drop/truncate语句中添加子句
updateindex
,可以自动实现这一点。然而,这样的操作可能需要一些时间,这是全局索引的主要缺点
一般来说,本地索引更好,更易于维护,而且通常更快,因为它们更小。但是,如果您有许多分区,并且您的主要查询不包括分区键(在您的例子中是时间戳),那么本地索引可能会对性能产生负面影响。如果您有100个分区,那么Oracle必须扫描100个索引分区,这基本上意味着:扫描100个索引!在这种情况下,全局索引要快得多。实际上,我不知道有什么理由使索引分区不同于表分区(这就是您所拥有的) 创建全局索引或局部索引,即分区索引,其中索引的分区与基础表的分区相同 当您有全局索引并且删除或截断分区时,全局索引将变得“不可用”,必须重新生成。通过在drop/truncate语句中添加子句
updateindex
,可以自动实现这一点。然而,这样的操作可能需要一些时间,这是全局索引的主要缺点
一般来说,本地索引更好,更易于维护,而且通常更快,因为它们更小。但是,如果您有许多分区,并且您的主要查询不包括分区键(在您的例子中是时间戳),那么本地索引可能会对性能产生负面影响。如果您有100个分区,那么Oracle必须扫描100个索引分区,这基本上意味着:扫描100个索引!在这种情况下,全局索引要快得多。我认为在一个没有缺点的通用解决方案中,您会有更好的、专门的注意,将日期位嵌入id字段,并单独用于分区和查询。我认为在一个没有缺点的通用解决方案中,您会有更好的、专门的注意,即嵌入将日期位输入id字段,并仅用于分区和查询。谢谢。这符合我的理解,也是我创建不同于表分区的全局索引分区的原因。我们按id查询记录。我最初的想法是,如果我按id查询,并且记录大量增长,那么拆分索引比拆分表更为有利。后续插入和更新的性能增益是可见的,但不是很大。所以我尝试了分区表,假设表大小的增长也会使后续的插入和更新变慢。由于存档需要,我需要按日期分割数据。但对于id更新查询,谢谢。这符合我的理解,也是我创建不同于表分区的全局索引分区的原因。我们按id查询记录。我最初的想法是,如果我按id查询,并且记录大量增长,那么拆分索引比拆分表更为有利。后续插入和更新的性能增益是可见的,但不是很大。所以我尝试了分区表,假设表大小的增长也会使后续的插入和更新变慢。由于存档需要,我需要按日期分割数据。但对于按id更新查询。