Oracle SQL:从表中选择数据和分区名称并截断分区
这是一个由两部分组成的问题: 1) 是否可以使用select语句根据其Oracle SQL:从表中选择数据和分区名称并截断分区,sql,database,oracle,partitioning,Sql,Database,Oracle,Partitioning,这是一个由两部分组成的问题: 1) 是否可以使用select语句根据其ROWID或其他标识符检索数据所在分区的名称 例如 2) 是否可以截断表的单个分区,而不删除存储在其他分区中的数据 我有一个超过十亿行的表,散列按类别划分。只有少数类别的数据存在问题,因此重新创建整个表是没有意义的,但是从表中删除数据,即使所有约束都处于非活动状态,也需要花费太长的时间。1)不。您不能这样做,您必须查询所有选项卡分区,才能找到ceratan值的分区 2) alter table x truncate parti
ROWID
或其他标识符检索数据所在分区的名称
例如
2) 是否可以截断表的单个分区,而不删除存储在其他分区中的数据
我有一个超过十亿行的表,散列按类别划分。只有少数类别的数据存在问题,因此重新创建整个表是没有意义的,但是从表中删除数据,即使所有约束都处于非活动状态,也需要花费太长的时间。1)不。您不能这样做,您必须查询所有选项卡分区
,才能找到ceratan值的分区
2)
alter table x truncate partition y
使用以下语法中的值,而不是查找分区名称:
虽然此操作不会影响其他分区中的数据,但可能会使索引不可用。重建相关索引或在DDL中使用
更新索引。多亏了您关于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;
您能否澄清我将如何使用all_tab_partitions
表来找出特定数据行属于哪个分区?这取决于您使用的分区类型(我猜测的范围)。每个分区的高值在列high\u value
中,因此如果是范围分区,则需要最后一个分区,该分区的值小于high\u value
。请阅读下面的内容:所讨论的表是按类别进行哈希分区的,因此high\u value
列为空。如果是哈希分区,据我所知,您无法知道oracle将把它放在哪个分区中。否。它是DDL,因此是隐式提交的。如果你改变主意,你将需要使用闪回查询。你所说的“他们的数据有问题”是什么意思?@APC:我的意思是有些数据不正确/过时,需要替换。也许你可以将一个受影响的分区交换到表中,修复或重新创建数据,然后再交换回来?你能在这里解释一下语法吗?我假设'ABC'
是CATEGORY
的一个值,就像在我的例子中一样,但是这个语句怎么知道'ABC'
指的是CATEGORY
列呢?它是分区键,换句话说,就是用来分区表的列。+1回答得好!这绝对符合我问题第一部分的要求!谢谢我只是用它来四处探索。要截断或更改分区,我将使用@jonearls answer中的分区的语法。。。
ALTER TABLE MYTABLE TRUNCATE PARTITION FOR ('ABC');
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;
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