【问题标题】:Dynamic table partitioning in OracleOracle 中的动态表分区
【发布时间】:2010-02-03 12:22:49
【问题描述】:

我正在为我的应用程序构建一个数据库存储,该存储由一个具有巨大数据量(数亿条记录)的表组成。我计划在日期字段上建立索引,因为我会不时地在给定时间段内对所有记录进行批量恢复(例如,在午夜检索第二天的所有记录)。

由于记录的数量很大并且性能是该系统中的一个重要问题,我想知道是否有一种方法可以动态分区我的表,以便我可以更快地检索记录,创建和截断分区为他们不再需要。例如,在处理完今天的记录后,我将如何为第二天创建一个分区并用其余数据填充它?

【问题讨论】:

    标签: oracle dynamic database-partitioning


    【解决方案1】:

    在 11g 中,我们可以定义 INTERVAL 分区,当 Oracle 获得键不适合任何现有范围的新记录时,它将自动创建新分区。这是一个非常酷的功能。 Find out more。

    要记住的一件事是,分区是企业版许可的额外收费。所以使用起来并不便宜。

    【讨论】:

    • +1 INTERVAL 分区的引入消除了对自动管理分区添加的自主解决方案的大部分需求。我希望 Oracle 提供的唯一增强功能是为生成的分区名称定义格式掩码 - 它们现在是使用通用系统生成的名称生成的,我总是不得不查看 x_tab_partitions 中的 LONG 列 HIGH_VALUE 以获得有意义的信息关于间隔。
    • @dpbradley - 我没有幸在 11g 中真正使用分区,但我可以看到这会很烦人。
    • 只是一个警告,您不能将参照分区与间隔分区混合使用。我们选择使用参考分区,然后手动滚动作业以使用我们首选的命名约定创建每月分区。
    • @dpbradley,你的链接坏了
    • 虽然间隔分区是朝着正确方向迈出的一大步,但根据您所做的工作,它有一些重大缺陷。对我来说主要的问题是删除旧分区的难度以及您可以拥有的潜在分区数量的限制。
    【解决方案2】:

    您可以通过使用dynamic SQL 自动执行创建或截断分区的过程。您可以使用EXECUTE IMMEDIATE 或DBMS_SQL 编写程序,并使用DBMS_JOB 或DBMS_SCHEDULER 安排它们(DBMS_SCHEDULER 是10g 功能,比DBMS_JOB 更通用)。

    当您对 DDL 有信心时,您可能希望先手动构建分区语句,然后再自动执行该过程。你会在documentation for the ALTER TABLE statement找到所有的合成器。

    【讨论】:

      【解决方案3】:

      这是我想出的使用SYSDATE 和偏移量创建分区的示例。我必须使用连接到SYSDATE 的字符串来创建替换参数:

      COLUMN temp_var new_value partition_name_01;
      SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE - 3, 'YYYYMMDD') AS temp_var FROM dual;
      COLUMN temp_var new_value partition_date_01;
      SELECT TO_CHAR(SYSDATE - 3, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual;
      COLUMN temp_var new_value partition_name_02;
      SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE - 2, 'YYYYMMDD') AS temp_var FROM dual;
      COLUMN temp_var new_value partition_date_02;
      SELECT TO_CHAR(SYSDATE - 2, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual;
      COLUMN temp_var new_value partition_name_03;
      SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE - 1, 'YYYYMMDD') AS temp_var FROM dual;
      COLUMN temp_var new_value partition_date_03;
      SELECT TO_CHAR(SYSDATE - 1, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual;
      COLUMN temp_var new_value partition_name_04;
      SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE, 'YYYYMMDD') AS temp_var FROM dual;
      COLUMN temp_var new_value partition_date_04;
      SELECT TO_CHAR(SYSDATE, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual;
      CREATE TABLE TABLE_NAME
      (
         SEQ_NO                 NUMBER NOT NULL,
         INSERT_DATE            DATE NOT NULL,
         FIRST_NAME             VARCHAR2 (256 BYTE),
         LAST_NAME              VARCHAR2 (256 BYTE),
         ID_NUM                 NUMBER,
         ID_STATUS              NUMBER
      )
      
      PARTITION BY RANGE
         (INSERT_DATE)
         SUBPARTITION BY LIST
            (ID_STATUS)
            SUBPARTITION TEMPLATE (
               SUBPARTITION SP1 VALUES (0) TABLESPACE &tblspce,
               SUBPARTITION SP2 VALUES (1) TABLESPACE &tblspce,
               SUBPARTITION SP3 VALUES (2) TABLESPACE &tblspce)
      
         (
         PARTITION &partition_name_01
            VALUES LESS THAN
            (TO_DATE ('&partition_date_01',
                         'SYYYY-MM-DD HH24:MI:SS',
                         'NLS_CALENDAR=GREGORIAN')),
      
         PARTITION &partition_name_02
            VALUES LESS THAN
            (TO_DATE ('&partition_date_02',
                         'SYYYY-MM-DD HH24:MI:SS',
                         'NLS_CALENDAR=GREGORIAN')),
      
         PARTITION &partition_name_03
            VALUES LESS THAN
            (TO_DATE ('&partition_date_03',
                         'SYYYY-MM-DD HH24:MI:SS',
                         'NLS_CALENDAR=GREGORIAN')),
      sysdate
      
         PARTITION &partition_name_04
            VALUES LESS THAN
            (TO_DATE ('&partition_date_04',
                         'SYYYY-MM-DD HH24:MI:SS',
                         'NLS_CALENDAR=GREGORIAN')))
      
      ENABLE ROW MOVEMENT;
      

      【讨论】:

        【解决方案4】:

        有一种产品可以自动处理它。 PartitionManager for Oracle 提供基于组织保留的自动分区管理,包括清除和归档旧数据、统计副本等。您可以在http://www.xyrosoft.com 试用它

        【讨论】:

        • 这在哪些方面比 Oracle 已经提供的改进?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-12
        • 1970-01-01
        • 2020-07-11
        • 2019-03-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多