4

これは 2 つの部分からなる質問です。

ROWID1) select ステートメントを使用して、データが存在するパーティションの名前を、その識別子またはその他の識別子に基づいて取得することは可能ですか?

例えば。

SELECT DATA_ID, CATEGORY, VALUE, **PARTITION_NAME**
FROM MYTABLE
WHERE CATEGORY = 'ABC'

2) 他のパーティションに保存されているデータを削除せずに、テーブルの単一のパーティションを切り捨てることは可能ですか?

カテゴリごとにハッシュ分割された、10 億行を超えるテーブルがあります。データに問題があるのはごく一部のカテゴリのみであるため、テーブル全体を再作成する意味はありませんが、すべての制約がアクティブでない場合でも、テーブルからデータを削除するには時間がかかりすぎます。

4

3 に答える 3

8

rowidに関するヒントのおかげで、解決策が見つかりました。行 ID があれば、行が属するオブジェクトを判別できるはずです。

4 つのハッシュ パーティションを使用した最小限の例:

CREATE TABLE pt (i NUMBER)
 PARTITION BY HASH (i) (PARTITION pt1, PARTITION pt2, PARTITION pt3, PARTITION pt4);

INSERT INTO pt SELECT ROWNUM FROM all_objects WHERE ROWNUM < 20;

これで、各行にはROWID. オブジェクト番号は で確認できますDBMS_ROWID.ROWID_OBJECT。ディクショナリ テーブルUSER_OBJECTSには、object_name (= テーブルの名前) と subobject_name (= パーティションの名前) があります。

SELECT i, 
       ROWID AS row_id, 
       dbms_rowid.rowid_object(ROWID) AS object_no,
       (SELECT subobject_name 
          FROM user_objects 
         WHERE object_id = dbms_rowid.rowid_object(pt.ROWID)) AS partition_name
  FROM pt
 ORDER BY 3;

I   ROW_ID              OBJECT_NO PARTITION_NAME
6   AAALrYAAEAAAATRAAA  47832   PT1
11  AAALrYAAEAAAATRAAB  47832   PT1
13  AAALrYAAEAAAATRAAC  47832   PT1
9   AAALrZAAEAAAATZAAA  47833   PT2
10  AAALrZAAEAAAATZAAB  47833   PT2
12  AAALrZAAEAAAATZAAC  47833   PT2
17  AAALrZAAEAAAATZAAD  47833   PT2
19  AAALrZAAEAAAATZAAE  47833   PT2
2   AAALraAAEAAAAThAAA  47834   PT3
5   AAALraAAEAAAAThAAB  47834   PT3
18  AAALraAAEAAAAThAAD  47834   PT3
8   AAALraAAEAAAAThAAC  47834   PT3
1   AAALrbAAEAAAATpAAA  47835   PT4
3   AAALrbAAEAAAATpAAB  47835   PT4
4   AAALrbAAEAAAATpAAC  47835   PT4
7   AAALrbAAEAAAATpAAD  47835   PT4
于 2013-06-27T14:48:13.027 に答える
3

1) いいえ。それを行うことはできませんall_tab_partitions。特定の値のパーティションを見つけるためにクエリを実行する必要があります。

2)alter table x truncate partition y

于 2013-06-26T20:05:21.350 に答える
2

パーティション名を見つける代わりに、PARTITION FOR構文で値を使用します。

ALTER TABLE MYTABLE TRUNCATE PARTITION FOR ('ABC');

この操作は他のパーティションのデータには影響しませんが、インデックスが使用不能になる可能性があります。関連するインデックスを再構築するかUPDATE INDEXES、DDL で使用してください。

于 2013-06-27T06:20:25.863 に答える