当前位置: 首页 > 面试题库 >

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

曹建华
2023-03-14
问题内容

这是一个两部分的问题:

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

例如。

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

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

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


问题答案:

多亏您对 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


 类似资料:
  • 我假设我可以做这样的事情,但这样会处理乐观锁情况吗(我通过表上的版本列使用它)

  • 如前所述,我正在MySQL中进行并练习一个分区数据。由于我想清除所有的数据,数据仍然在那里,不能删除一次。 这是我创建的分区表。 我很好奇我的MySQL软件有问题吗?还是分区表导致了这种情况?因为我有一个没有分区的备份表,所以可以很好地使用Truncate,Delete和Select脚本。

  • 我很难看到一些潜在的大规模重构的全局。我正在寻找一种同时解决两个问题的解决方案(如果存在的话)。我已经很长时间没有用d3编码了,一开始也不太流利。 所有数据都存在于一个数组中,该数组的维数为n,或2 x。。。(链长度随着每次鼠标单击而增加)。 现在我想显示一个老化,每个链的长度都是一样的。对于左边的图,老化将以不同的颜色(例如橙色和红色)显示每个链的第一个点。实际上,已经存在的第一个点将被不同地着

  • 问题内容: 具有下表(): 另一个帮助表(): 我正在寻找一个SQL查询来输出以下内容: 所以,每一次是和是 在 响应表, 汇总 对话上下文到这一点,忽略不池中的响应结束谈话的一部分。 在上面的示例中,活动 响应文本 为1中的 3 。 我尝试了以下复杂的SQL,但有时会中断将文本汇总错误的情况: 我敢肯定有更好的方法。 问题答案: 这是我的看法: 这将扫描表一次,但是我不确定它的性能是否会比您的解

  • 问题内容: 请问我的英语水平。我有2个表,两个表都按日期间隔分区,但是在不同的字段上。两个表中都有大量记录(每个分区中约100kk)。第一个表在快速discks表空间中保留3个最后(按日期)分区,其他表在慢速discks表空间中保持。我也有一些系统来处理数据。它并行执行进程,每个进程都通过select语句从第一个表中获取数据,并将处理后的数据放入第二个表中。因此,我只需要从“快速”(!)分区的第一

  • 问题内容: 我有2个表分别命名为项目和任务 在项目表中,我有: 在任务表中,我有: 现在,我该如何从任务表中选择*并在表任务中通过“ project_id”从项目表中获得“名称”? 谢谢 问题答案: 即使项目表中没有记录,使用左联接也可以确保您有所收获。如果要确保连贯性,可以这样做