这是一个两部分问题:
1)是否可以根据ROWID
或其他标识符使用select语句检索数据所在分区的名称?
例如
SELECT DATA_ID, CATEGORY, VALUE, **PARTITION_NAME**
FROM MYTABLE
WHERE CATEGORY = 'ABC'
2)是否可以截断表的单个分区,而不删除存储在其他分区中的数据?
我有一个超过十亿行的表,按类别划分哈希。只有少数几个类别的数据存在问题,因此重新创建整个表没有意义,但删除表中的数据,即使所有约束都处于非活动状态,也需要太长时间。
答案 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
。