ret*_*eto 5 oracle performance database-design oracle10g
上下文:Oracle 10数据库.
在一个相当大的表(几百万条记录)中,我们最近开始看到一些性能问题.该表有一些特殊的行为/条件.
现在,由于大多数访问是对类1进行的,因此该列通常与其他条件一起涉及查询(class = 1).我们在类列上有一个索引,然后在某些其他列上有索引.
对于我的问题:我们现在正在考虑按类对该表进行分区.据我所知,这将使索引/处理数据更快,因为class = 1已经与其余数据分开,因此对它的访问隐含更高效.它是否正确?
如果您同意这是一个好主意,我会进一步阅读该主题!
谢谢干杯
更新2010.11.30
非常感谢您的投入.我不知道它是一个额外的选项:)感谢指出(在我投入太多时间之前).但除了许可证问题之外,在我看来,分区在这种情况下不一定是一个好的解决方案.
哪些操作速度缓慢?您是否能够确定这些操作速度缓慢的原因?
如果按类分区,则会减慢更新行类的过程。由于这会强制一行从一个分区移动到另一个分区,因此您会将更新转换为从第一个分区删除并插入到第二个分区。如果您的每小时进程很慢并且很慢是因为需要时间来查找所有新记录,那么这里的性能权衡可能是相当合理的。另一方面,如果您的每小时进程很慢,因为需要时间来计算新类应该是什么并更新所有行,那么这种权衡可能是一个非常糟糕的主意。
由于分区是企业版许可证之上的额外成本选项,因此我建议确保您不能使用某些基于函数的索引以相对较低的成本获得您目标的大部分性能改进。例如,如果您有两个基于函数的索引
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 上过滤的新视图的任何查询都将使用基于函数的索引,而该索引又只会对基础表中的相应行进行索引。这可以让您提高查找性能,而无需诉诸分区。