2014-02-10 22 views
0

我想选择数据基础知识上的分区名称。下面 是高级如何在数据基础知识上选择分区名称

P1包含数据的2月1日 P2包含的数据为2月2日

现在我想对数据 的基本选择分区名状

select partition_name from table 
where table_name='ABC' 
and date ='01-feb-2014' 

回答

0

您可以使用用户/ 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    
0

有了一个合理的分区命名惯例,这是微不足道的。

您也可能会找到该值的一行,并使用DBMS_RowID获取它所在的文件和块,然后读取DBA_Extents以查看获取该行的物理对象 - 这会为您提供分区名称。

除此之外,还有一个未公开的函数TBL $ OR $ IDX $ PART $ NUM给出了这些信息。