2013-08-26 32 views
2

我理解范围分区的概念。如果我有一个日期列,并根据月份对该列进行分区,那么如果我的查询有一个where子句只过滤了一个月,那么我可以打一个特定的分区并获取我的数据,而不会打满整个表。oracle如何管理散列分区

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

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

回答

3

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

the documentation

Oracle数据库使用线性散列算法,并防止数据 从特定分区中的群集,则应该由二的幂定义 数目的分区(例如,2 ,4,8)。

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

“当我查询的数据,似乎是没有办法避免撞到多个 分区?”

如果您正在搜索单个客户ID,则没有。 Oracle的哈希算法是一致的,所以具有相同分区密钥的记录最终会在同一个分区中(显然)。但是,如果您正在寻找上个月的所有新客户那么是的。 Oracle的散列算法将努力平均分配记录,以便最新记录遍布整个表格。

所以真正的问题是,为什么我们选择分区表?性能往往是至少令人信服的原因来分区。更好的理由包括

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

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

哈希分区不太可能提供性能优势,恰恰是因为它将整个表中的密钥洗牌。它将提供分区的可用性和可管理性好处(但显然不适用于分区交换)。

+0

谢谢。“可用性每个分区可以驻留在不同的表空间上” - 因此每个表空间可以驻留在不同的机器上?这是否像分片? – Victor

3

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

Oracle使用散列算法,应该通常在分区之间均匀分布数据。 “