在这种情况下使用分区是个好主意吗?

时间:2010-11-29 17:32:12

标签: oracle database-design oracle10g performance

上下文:Oracle 10数据库。

在一张相当大的表格(数百万条记录)中,我们最近开始看到一些性能问题。该表有一些特殊的行为/条件。

  • 它主要是写一次然后再也不会改变
  • 在第一天左右,记录从0..N分类(让我们称之为列类)。记录可能会在第一天重新分类几次
  • 新条目添加了0级,意思是“尚未归类”
  • 每隔一个小时左右,一个进程会对新的reocrds进行分类,并为他们提供一个新的类来自1..N
  • 所有读者只对1级感兴趣
  • 所有超过一天的记录几乎不会改变他们的班级,>几天后,1会被清理干净

现在,由于大多数访问都是针对第1类进行的,因此该列通常涉及查询(class = 1)以及其他条件。我们在类列上有一个索引,然后在某些其他列上有一个索引。

我的问题:我们现在正在考虑按类对该表进行分区。据我所知,这将使索引/处理数据更快,因为class = 1已经与其余数据分开,因此对它的访问隐含更高效。这是对的吗?

如果您同意这是一个好主意,我会进一步阅读该主题!

由于 干杯

更新2010.11.30

非常感谢你的投入。我不知道它是一个额外的选项:)感谢指出(在我投入太多时间之前)。但除了许可证问题之外,在我看来,分区在这种情况下不一定是一个好的解决方案。

3 个答案:

答案 0 :(得分:4)

哪些操作正在经历缓慢,您是否能够确定这些操作缓慢的原因?

如果按类进行分区,则会减慢更新行的类的过程。由于这会强制一行从一个分区移动到另一个分区,因此您将把更新转换为第一个分区的删除和第二个分区的插入。如果你的每小时进程很慢而且速度慢,因为找到所有新记录需要时间,这里的性能权衡可能是非常合理的。如果你的每小时进程很慢,因为计算新类应该是什么需要时间并更新所有行,另一方面,这种权衡可能是一个非常糟糕的想法。

由于分区是企业版许可证之上的额外成本选项,因此我建议您确保不能使用某些基于功能的索引以相对较低的成本获得您所针对的大部分性能改进。例如,如果您有两个基于函数的索引

CREATE INDEX idx_new_entries
    ON your_table( (CASE WHEN class = 0 THEN primary_key ELSE null END) );

CREATE INDEX idx_class1_entries
    ON your_table( (CASE WHEN class = 1 THEN primary_key ELSE null END) );

以及一些观点

CREATE VIEW vw_new_entries
AS
SELECT (CASE WHEN class = 0 THEN primary_key ELSE null END) primary_key,
       <<list of columns>>
  FROM your_table
 WHERE class = 0

CREATE VIEW vw_class1_entries
AS
SELECT (CASE WHEN class = 1 THEN primary_key ELSE null END) primary_key,
       <<list of columns>>
  FROM your_table
 WHERE class = 1

然后对在PRIMARY_KEY上过滤的新视图的任何查询都将使用基于函数的索引,而这些索引又只会索引基础表中的相应行。这可以让您提高查找性能,而无需求助于分区。

答案 1 :(得分:3)

MB中的表有多大?什么是增长率?您是在清除数据还是计划清除数据?现在桌面上有哪些索引?你能给我们样本表定义吗?分区是一个额外的许可选项。你有没有确认有人会为此付出代价?

最重要的是,请提供示例查询

您所提供的信息不足以作出决定。

答案 2 :(得分:-1)

Yepp,听起来不错。

虽然有更好的替代品,但一个简单的解决方案是分区。