如何在数据基础上选择分区名称

Posted

技术标签:

【中文标题】如何在数据基础上选择分区名称【英文标题】:How to select partition name on basics of data 【发布时间】:2014-02-10 07:38:33 【问题描述】:

我想在数据基础上选择分区名称。 下面是前辈

p1 包含 2 月 1 日的数据 p2 包含 2 月 2 日的数据

现在我想在数据基础上选择分区名称 喜欢

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

【问题讨论】:

【参考方案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 可以提供此信息。

【讨论】:

以上是关于如何在数据基础上选择分区名称的主要内容,如果未能解决你的问题,请参考以下文章

在 Greenplum DB [大数据] 上选择分区策略的更好实践

SwiftUI List 如何识别在 macOS 上选择了哪些项目

如何在 Access 2016 中的另一列上选择具有最大值的不同行

如何使用javascript触摸事件在触摸屏上选择文本

在 UIPickerView 上选择行时如何使用信息填充第二个视图控制器

我如何(或我可以)在多列上选择 DISTINCT?