Oracle SQL:从表中选择数据和分区名称并截断分区

时间:2013-06-26 20:01:24

标签: sql database oracle partitioning

这是一个两部分问题:

1)是否可以根据ROWID或其他标识符使用select语句检索数据所在分区的名称?

例如

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

2)是否可以截断表的单个分区,而不删除存储在其他分区中的数据?

我有一个超过十亿行的表,按类别划分哈希。只有少数几个类别的数据存在问题,因此重新创建整个表没有意义,但删除表中的数据,即使所有约束都处于非活动状态,也需要太长时间。

3 个答案:

答案 0 :(得分:8)

感谢您对 rowid 的提示,我找到了解决方案。如果你有rowid,应该可以确定该行所属的对象。

包含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

答案 1 :(得分:3)

1)没有。你不能这样做,你将不得不查询all_tab_partitions找出一个ceratain值的分区。

2)alter table x truncate partition y

答案 2 :(得分:2)

不使用查找分区名称,而是使用PARTITION FOR语法中的值:

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

虽然此操作不会影响其他分区中的数据,但它可能会使索引不可用。重建相关索引或在DDL中使用UPDATE INDEXES