我了解范围分区的概念。如果我有一个日期列并且我根据月份对该列进行分区,那么如果我的查询有一个仅过滤一个月的 where 子句,那么我可以访问特定分区并获取我的数据,而无需访问整个表。
在 Oracle 文档中,我读到如果像“月份”这样的逻辑分区不可用(例如,您在名为客户 ID 的列上进行分区),则使用散列分区。那么这将如何运作? Oracle会把数据随机划分,分配到不同的分区,并且给每个分区分配一个哈希码?
但是在这种情况下,当有新数据进来的时候,oracle怎么知道把新数据放到哪个分区呢?而且当我查询数据时,似乎无法避免命中多个分区?
请您参考如下方法:
"how does oracle know in which partition to put the new data?"
Oracle Database uses a linear hashing algorithm and to prevent data from clustering within specific partitions, you should define the number of partitions by a power of two (for example, 2, 4, 8).
至于你的另一个问题……
"when i query data, it seems there is no way to avoid hitting multiple partitions?"
如果您要搜索单个客户 ID,则不需要。 Oracle 的散列算法是一致的,因此具有相同分区键的记录最终会出现在同一分区中(很明显)。但是,如果您正在搜索,比如说,上个月的所有新客户,那么是的。 Oracle 的散列算法将努力使记录均匀分布,因此最新的记录将分布在整个表中。
那么真正的问题是,为什么我们选择对表进行分区?性能通常是最没有说服力的分区理由。更好的理由包括
- 可用性每个分区都可以驻留在不同的表空间上。因此,表空间的问题将取出表数据的一部分而不是整个数据。
- 管理 分区提供了一种将整个表作业拆分为清晰批处理的机制。分区交换可以更容易地批量加载数据。
至于性能,记录的物理协同定位可以加快某些查询的速度 - 那些通过定义的键范围搜索记录的查询。但是,任何与查询粒度不匹配的查询都不会比非分区表执行得更快(甚至可能执行得更慢)。
散列分区不太可能提供性能优势,正是因为它在整个表中打乱了键。它将提供分区的可用性和可管理性优势(但显然不是特别适合分区交换)。