【问题标题】:List partitioning in oracleoracle中的列表分区
【发布时间】:2014-04-08 07:49:46
【问题描述】:

我有一个具有以下架构的表:

我的表{ 用户身份, 任务 ID, 任务描述 } 其中 Task_ID 是主键。

我希望在 User_ID 上对其进行分区。此外,可能会添加新用户,我希望自动创建新的相应分区。 我浏览了this(参见第8 页),发现Oracle 11g 提供了间隔分区,它做类似的事情但有间隔。

我可以对 User_ID 做同样的事情吗?

【问题讨论】:

  • user_id 有多少个不同的值?什么数据类型?如果user_id 是数字键,您可以根据user_id 值的范围创建间隔分区表。如果它是一个字符键,基于user_id 似乎有许多可能值的事实,如果您想在user_id 上分区,您似乎真的想对表进行哈希分区。跨度>
  • user_id 是 varchar(128),预计值在不久的将来不会超过 1000。我希望每个分区只有 1 个 user_id,所以散列似乎没有必要。不过,如果为我提供了所需的功能,我已经准备好为它定义散列。是吗?

标签: oracle oracle11g partitioning database-partitioning


【解决方案1】:

您不能为每个不同的varchar(128) 值自动生成唯一分区。

您可以对表进行哈希分区。这不能保证每个分区都有一个唯一的 user_id 值。它将确保具有相同user_id 的所有行都在一个分区中,并且无需进行手动分区维护。

您可以列出分区表。但是,这需要您在添加新的 user_id 值时显式添加新分区。

如果user_id 的值是严格可预测的,您可能可以对虚拟列使用间隔分区方案。但这似乎不太可能实现。

您要解决的业务问题是什么?为什么每个分区中必须有一个 user_id 值?为什么首先要对表进行分区?

【讨论】:

  • 感谢贾斯汀的回复。我希望在user_ID 上进行分区的原因是我们不希望一个用户的性能因为另一个用户的大量数据而受到任何影响。我们曾一度考虑为每个用户创建单独的表,但后来认为分区将帮助我们实现相同的目标,因为我们为所有用户提供了相同的架构。
  • @Raghav - 无论分区方案如何,一个用户都会受到存储大量数据的其他用户的影响,因为这些用户的活动通常会将轻量级用户的块推出缓冲区缓存,从而迫使更多的物理这些用户的 I/O。你是说这个表上的所有访问都将涉及基于user_id 的完整分区扫描?什么都不会使用主键?大多数访问不会涉及另一个索引?这似乎不太可能。
  • 表上的每个查询都会有user_idtask_id 被保留为主键,但我可以很好地将 user_id, task_id 保留为表的主键。我可以在user_id 上有一个索引,但分区不是更好的方法吗?我同意你的观点,即使在分区之后,用户活动也可能是一个破坏者。在这种情况下,你有什么建议?
猜你喜欢
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多