代码之家  ›  专栏  ›  技术社区  ›  reto

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

  •  5
  • reto  · 技术社区  · 15 年前

    上下文:Oracle 10数据库。

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

    • 它通常只写一次,然后再也不会改变。
    • 在第一天左右的时间里,记录被从0.n分类(我们称之为列类)。在第一天记录可能会被重新分类好几次。
    • 新条目添加为0类,表示“尚未分类”
    • 每小时左右,一个过程会对新的REOCRD进行分类,并给它们一个从1到n的新类。
    • 所有的读者只对一班感兴趣
    • 所有超过一天的记录几乎不会改变他们的等级,>1几天后将被清理干净。

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

    我的问题是:我们现在正在考虑按类划分表。据我所知,这将加快索引/处理数据的速度,因为类=1已经与其他数据分离,因此对它的访问是隐式的更高效。这是正确的吗?

    如果你同意这是一个好主意,我将进一步阅读这个主题!

    谢谢 干杯

    更新2010.11.30

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

    3 回复  |  直到 15 年前
        1
  •  4
  •   Justin Cave    15 年前

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

    如果按类划分,将减慢更新行的类的过程。因为这将迫使一行从一个分区移动到另一个分区,所以您将把更新转换为从第一个分区删除并插入到第二个分区。如果您的每小时处理速度很慢,而且由于查找所有新记录需要时间,因此速度很慢,那么这里的性能权衡可能是相当合理的。如果您的每小时处理速度很慢,因为计算新类应该是什么以及更新所有行需要时间,另一方面,这种权衡可能是一个非常糟糕的主意。

    因为分区是企业版许可证之上的额外成本选项,所以我建议您不要使用一些基于函数的索引来获得大部分性能改进,而您的目标是成本相对较低。例如,如果有两个基于函数的索引

    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
    

    然后,针对筛选在主键上的新视图的任何查询都将使用基于函数的索引,而这些索引将只为基础表中的相应行编制索引。这可能允许您在不需要使用分区的情况下提高查找性能。

        2
  •  3
  •   erbsock    15 年前

    以MB为单位的桌子有多大?tghe的增长率是多少?您是清除数据还是计划清除数据?表上现在有哪些索引?你能给我们提供样本表的定义吗?分区是一个额外的许可证选项。你核实过有人会为此买单吗?

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

    您提供的信息不足以作为决策依据。

        3
  •  -1
  •   nulvinge    15 年前

    是的,听起来是个好主意。

    尽管有更好的选择,但一个简单的修复方法是分区。