9

膨大なデータ ボリューム (数億のレコード) を持つ単一のテーブルで構成されるアプリ用のデータベース ストレージを構築中です。日付フィールドにインデックスを作成する予定です。これは、特定の期間のすべてのレコードのバッチ リカバリを時々行うためです (たとえば、翌日の午前 0 時にすべてのレコードを取得するなど)。 )。

レコードの数が膨大であり、このシステムではパフォーマンスが重要な問題であるため、テーブルを動的にパーティション分割してレコードをより高速に取得し、パーティションを作成して切り捨てる方法があるかどうかを知りたいです。もはや必要。たとえば、翌日のパーティションを作成し、今日のレコードの処理が完了した後に残りのデータを入力するにはどうすればよいでしょうか?

4

4 に答える 4

11

11g では、INTERVAL パーティションを定義できます。Oracle は、キーが既存の範囲のいずれにも収まらない新しいレコードを取得すると、新しいパーティションを自動的に作成します。これは非常に優れた機能です。 詳細をご覧ください

覚えておくべきことの 1 つは、パーティショニングは Enterprise Edition ライセンスに加えて有料の追加料金であるということです。そのため、安く利用することはできません。

于 2010-02-03T14:01:08.733 に答える
3

動的 SQLを使用して、パーティションの作成または切り捨てのプロセスを自動化できます。EXECUTE IMMEDIATEまたはのいずれかを使用してプロシージャを記述し、 orを使用DBMS_SQLしてそれらをスケジュールします(は 10g の機能であり、 よりも汎用性があります)。DBMS_JOBDBMS_SCHEDULERDBMS_SCHEDULERDBMS_JOB

最初にパーティション ステートメントを手動で作成し、後で DDL に自信があるときにプロセスを自動化することをお勧めします。すべてのシンタックスは、ALTER TABLE ステートメントのドキュメントに記載されています。

于 2010-02-03T13:29:46.093 に答える
1

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;
于 2011-01-05T21:07:07.793 に答える
1

自動で処理してくれる商品があります。PartitionManager for Oracle は、古いデータのパージとアーカイブ、統計のコピーなどを含む、組織の保持に基づいた自動パーティション管理を提供します。http://www.xyrosoft.comで試すことができます。

于 2013-09-08T08:45:44.733 に答える