我理解范围分区的概念。如果我有一个日期列,并根据月份在该列上进行分区,那么如果我的查询有一个where子句只过滤一个月,那么我可以点击一个特定的分区并获取我的数据,而无需点击整个表。
在Oracle文档中,我读到如果像'month'这样的逻辑分区不可用(例如,您在名为customer id的列上进行分区),则使用散列分区。那么这将如何运作? Oracle将随机划分数据并将其分配给不同的分区并为每个分区分配哈希码?
但在这种情况下,当新数据进入时,oracle如何知道在哪个分区中放入新数据?当我查询数据时,似乎没有办法避免命中多个分区?
答案 0 :(得分:4)
“oracle如何知道在哪个分区中放置新数据?”
Oracle数据库使用线性哈希算法并阻止数据 从特定分区内的群集中,您应该定义 分区数乘以2的幂(例如,2,4,8)。
至于你的其他问题......
“当我查询数据时,似乎没有办法避免碰到多个 分区?“
如果您要搜索单个客户ID,请选择否。 Oracle的哈希算法是一致的,因此具有相同分区键的记录最终会出现在同一个分区中(显然)。但是,如果您正在搜索上个月的所有新客户,那么是。 Oracle的哈希算法将努力均匀地分配记录,以便最新的记录将分布在整个表中。
所以真正的问题是,为什么我们选择分区表?性能通常是最不引人注目的原因进行分区。更好的理由包括
至于性能,记录的物理共址可以加速某些查询 - 那些通过定义的键范围搜索记录的查询。但是,任何与查询粒度不匹配的查询都不会比非分区表执行得更快(甚至可能执行得更慢)。
散列分区不太可能提供性能优势,正是因为它将整个表中的密钥混洗。它将提供分区的可用性和可管理性优势(但显然不太适合分区交换)。
答案 1 :(得分:3)
散列不是随机的,它以可重复(但可能难以预测)的方式划分数据,以便相同的ID始终映射到同一分区。
Oracle使用哈希算法,应该通常在分区之间均匀地分布数据。