sql - 甲骨文 SQL : Selecting data and partition name from table and truncating partitions

标签 sql database oracle partitioning

这是一个两部分的问题:

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

例如。

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

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

我有一个包含超过 10 亿行的表,按类别进行散列分区。只有少数类别的数据存在问题,因此重新创建整个表没有意义,但从表中删除数据,即使所有约束都处于非事件状态,也会花费太长时间。

最佳答案

感谢您对 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

关于sql - 甲骨文 SQL : Selecting data and partition name from table and truncating partitions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17329384/

相关文章:

sql - 这个查询有什么问题?

sql - 将表中列的数据类型从 TEXT 更改为 LVARCHAR(10000)

java - 准备语句: Missing expression on single quote (ORA-00936)

c# - 读取 Oracle BLOB 字段

mysql - 使用 join in select 进行更新不起作用

mysql - 基于列值的条件 JOIN

mysql - MySQL大表如何做性能调优?

mysql - 数据库设计 : how to store XML/JSON in database?

database - Laravel 5.x 数据库触发器和可能的最佳实践

c# - 使用 Oracle 时如何使用 Fluent NHibernate 实现批量抓取?