oracle如何管理散列分区

时间:2013-08-26 02:18:36

标签: oracle hash partitioning

我理解范围分区的概念。如果我有一个日期列,并根据月份在该列上进行分区,那么如果我的查询有一个where子句只过滤一个月,那么我可以点击一个特定的分区并获取我的数据,而无需点击整个表。

在Oracle文档中,我读到如果像'month'这样的逻辑分区不可用(例如,您在名为customer id的列上进行分区),则使用散列分区。那么这将如何运作? Oracle将随机划分数据并将其分配给不同的分区并为每个分区分配哈希码?

但在这种情况下,当新数据进入时,oracle如何知道在哪个分区中放入新数据?当我查询数据时,似乎没有办法避免命中多个分区?

2 个答案:

答案 0 :(得分:4)

  

“oracle如何知道在哪个分区中放置新数据?”

来自the documentation

  

Oracle数据库使用线性哈希算法并阻止数据   从特定分区内的群集中,您应该定义   分区数乘以2的幂(例如,2,4,8)。

至于你的其他问题......

  

“当我查询数据时,似乎没有办法避免碰到多个   分区?“

如果您要搜索单个客户ID,请选择否。 Oracle的哈希算法是一致的,因此具有相同分区键的记录最终会出现在同一个分区中(显然)。但是,如果您正在搜索上个月的所有新客户,那么是。 Oracle的哈希算法将努力均匀地分配记录,以便最新的记录将分布在整个表中。

所以真正的问题是,为什么我们选择分区表?性能通常是最不引人注目的原因进行分区。更好的理由包括

  • 可用性每个分区可以驻留在不同的表空间中。因此,表空间的问题将取出表的数据而不是整个数据。
  • 管理分区提供了将整个表作业拆分为明确批处理的机制。分区交换可以更容易批量加载数据。

至于性能,记录的物理共址可以加速某些查询 - 那些通过定义的键范围搜索记录的查询。但是,任何与查询粒度不匹配的查询都不会比非分区表执行得更快(甚至可能执行得更慢)。

散列分区不太可能提供性能优势,正是因为它将整个表中的密钥混洗。它将提供分区的可用性和可管理性优势(但显然不太适合分区交换)。

答案 1 :(得分:3)

散列不是随机的,它以可重复(但可能难以预测)的方式划分数据,以便相同的ID始终映射到同一分区。

Oracle使用哈希算法,应该通常在分区之间均匀地分布数据。