【问题标题】: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 可以提供此信息。

      【讨论】: