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 |
|
|
|
|
|