2

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

在 Oracle 文档中,我读到如果像“月”这样的逻辑分区不可用(例如,您在称为客户 ID 的列上进行分区),则使用哈希分区。那么这将如何运作呢?oracle会随机划分数据并分配到不同的分区,并为每个分区分配一个哈希码?

但是在这种情况下,当有新数据进来时,oracle 是如何知道将新数据放在哪个分区的呢?当我查询数据时,似乎没有办法避免碰到多个分区?

4

2 回答 2

4

“oracle怎么知道把新数据放在哪个分区?”

文档

Oracle 数据库使用线性散列算法,为了防止数据在特定分区内聚集,您应该将分区数定义为 2 的幂(例如,2、4、8)。

至于你的另一个问题...

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

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

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

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

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

哈希分区不太可能提供性能优势,正是因为它在整个表中打乱了键。它将提供分区的可用性和可管理性优势(但显然不是特别适合分区交换)。

于 2013-08-26T09:38:36.600 回答
3

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

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

于 2013-08-26T06:36:57.697 回答