【问题标题】:How to select partition name on basics of data如何在数据基础上选择分区名称
【发布时间】:2026-02-15 02:30:02
【问题描述】:
我想在数据基础上选择分区名称。
下面是前辈
p1 包含 2 月 1 日的数据
p2 包含 2 月 2 日的数据
现在我想在数据基础上选择分区名称
喜欢
select partition_name from table
where table_name='ABC'
and date ='01-feb-2014'
【问题讨论】:
标签:
sql
database
oracle
plsql
database-administration
【解决方案1】:
您可以使用 USER/ALL_TAB_PARTITIONS 视图和 HIGH_VALUE 列,但这种方法几乎没有缺陷 - HIGH_VALUE 具有 LONG 类型,对于列表和范围分区,我们应该以不同的方式处理它,它不适用于哈希分区,我们应该认识到 maxvalue和默认的伪值。另一种方法是使用 CBO 建议:
SQL> create table t (x int) partition by range (x)
2 (
3 partition p0 values less than(1)
4 , partition p1 values less than(2)
5 , partition pd values less than (maxvalue))
6 /
SQL> explain plan
2 set statement_id = 'plan.t.0' for
3 select * from t where x = 0
4 /
SQL> select
2 column_value as PARTITIONS
3 from TABLE(
4 XmlSequence( extract(
5 DBMS_XPLAN.Build_Plan_Xml( 'PLAN_TABLE', 'plan.t.0' ),
6 '/plan/operation/partition'
7 )
8 )
9 );
PARTITIONS
----------------------------------------
<partition start="1" stop="1"/>
<partition start="1" stop="1"/>
SQL> select partition_name from user_tab_partitions where table_name = 'T' and partition_position = 1
2 /
PARTITION_NAME
------------------------------
P0
SQL> explain plan
2 set statement_id = 'plan.t.1' for
3 select * from t where x = 1
4 /
SQL> select
2 column_value as PARTITIONS
3 from TABLE(
4 XmlSequence( extract(
5 DBMS_XPLAN.Build_Plan_Xml( 'PLAN_TABLE', 'plan.t.1' ),
6 '/plan/operation/partition'
7 )
8 )
9 );
PARTITIONS
----------------------------------------
<partition start="2" stop="2"/>
<partition start="2" stop="2"/>
SQL> select partition_name from user_tab_partitions where table_name = 'T' and partition_position = 2;
PARTITION_NAME
------------------------------
P1
SQL> explain plan
2 set statement_id = 'plan.t.3' for
3 select * from t where x = 3
4 /
SQL> select
2 column_value as PARTITIONS
3 from TABLE(
4 XmlSequence( extract(
5 DBMS_XPLAN.Build_Plan_Xml( 'PLAN_TABLE', 'plan.t.3' ),
6 '/plan/operation/partition'
7 )
8 )
9 );
PARTITIONS
----------------------------------------
<partition start="3" stop="3"/>
<partition start="3" stop="3"/>
SQL> select partition_name from user_tab_partitions where table_name = 'T' and partition_position = 3;
PARTITION_NAME
------------------------------
PD
【解决方案2】:
使用合理的分区命名约定,这是微不足道的。
您也可以为该值找到一行,并使用 DBMS_RowID 获取文件并阻止它所在的文件,然后读取 DBA_Extents 以查看获取该行的物理对象——这将为您提供分区名称。
除此之外,还有一个未记录的函数 TBL$OR$IDX$PART$NUM 可以提供此信息。