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

Oracle SQL:从表中选择数据和分区名称并截断分区,sql,database,oracle,partitioning,Sql,Database,Oracle,Partitioning,这是一个由两部分组成的问题: 1) 是否可以使用select语句根据其ROWID或其他标识符检索数据所在分区的名称 例如 2) 是否可以截断表的单个分区,而不删除存储在其他分区中的数据 我有一个超过十亿行的表,散列按类别划分。只有少数类别的数据存在问题,因此重新创建整个表是没有意义的,但是从表中删除数据,即使所有约束都处于非活动状态,也需要花费太长的时间。1)不。您不能这样做,您必须查询所有选项卡分区,才能找到ceratan值的分区 2) alter table x truncate parti

这是一个由两部分组成的问题:

1) 是否可以使用select语句根据其
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