回答

收藏

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

技术问答 技术问答 233 人阅读 | 0 人回复 | 2023-09-14

这是两个部分的问题:
/ V- s. v# m% t. x( I4 j7 Z  X1)能否使用select语句基于其ROWID或者其他标识符检索数据所在分区的名称?
7 G- [& @7 R0 I* g( P& ~例如。
$ S$ T2 Z+ H8 @4 X' a8 oSELECT DATA_ID,CATEGORY,VALUE,**PARTITION_NAME**FROM MYTABLEWHERE CATEGORY = 'ABC'2)能否在不删除其他分区存储数据的情况下截断单个分区?! ?2 ^5 S3 P9 ]3 f6 S. U$ \( g
我有一个超过10亿行的表,哈希按类别划分。只有少数类别的数据有问题,所以重建整个表是没有意义的,但即使所有的约束都处于非活动状态,从表中删除数据也需要太长时间。
/ _5 K9 a( f4 b- ~1 {                                                               
" n4 ?  Q# y7 T0 v    解决方案:                                                               
1 f! p" v  |$ M                                                                多亏您对 rowid    提示,我找到了解决方案。如果你有rowid,银行所属对象应能够确定。7 q* L: f' P( }9 ~. Q5 \
最小的例子是四个哈希分区:: g: R  w7 M% D2 V4 i$ C- `
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 现在,每一行都有一个ROWID。通过找到对象号,可以找到对象号DBMS_ROWID.ROWID_OBJECT。然后,字典表USER_OBJECTS具有object_name(=表的名称)和subobject_name(=分区名称):
- H0 Q2 A" i6 F" PSELECT 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_NAME6   AAALrYAAEAAAATRAAA  47832   PT111  AAALrYAAEAAAATRAAB  47832   PT113  AAALrYAAEAAAATRAAC  47832   PT19   AAALrZAAEAAAATZAAA  47833   PT210  AAALrZAAEAAAATZAAB  47833   PT212  AAALrZAAEAAAATZAAC  47833   PT217  AAALrZAAEAAAATZAAD  47833   PT219  AAALrZAAEAAAATZAAE  47833   PT22   AAALraAAEAAAAThAAA  47834   PT35   AAALraAAEAAAAThAAB  47834   PT318  AAALraAAEAAAAThAAD  47834   PT38   AAALraAAEAAAAThAAC  47834   PT31   AAALrbAAEAAAATpAAA  47835   PT43   AAALrbAAEAAAATpAAB  47835   PT44   AAALrbAAEAAAATpAAC  47835   PT47   AAALrbAAEAAAATpAAD  47835   PT4
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则