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

ret*_*eto 5 oracle performance database-design oracle10g

上下文:Oracle 10数据库.

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

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

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

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

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

谢谢干杯

更新2010.11.30

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

Jus*_*ave 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) );
Run Code Online (Sandbox Code Playgroud)

以及一些观点

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
Run Code Online (Sandbox Code Playgroud)

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