Oracle分区键

时间:2014-07-09 11:19:43

标签: oracle database-partitioning

我有很多包含大量数据的表。 PK是列(TAB_ID),其数据类型为RAW(16)。我使用具有TAB_ID列的分区键创建了哈希分区。

我的问题是:SQL语句(select * from my_table where tab_id = 'aas1df')不使用分区修剪。如果我将列数据类型更改为varchar2(32),则分区修剪可以正常工作。

为什么分区修剪不能使用数据类型为RAW(16)的分区键?

2 个答案:

答案 0 :(得分:0)

我只是在猜测:试试select * from my_table where 'aas1df' = tab_id。 可能数据类型转换以预期的其他方式工作。无论如何,你应该使用函数UTL_RAW.CAST_TO_RAW。

编辑: 您的表格是否由TAB_ID分区?如果是,那么您的设计有问题,您通常按一些有用的业务价值划分表,而不是通过代理键。 如果您知道PK值,则根本不需要进行分区修剪。当Oracle遍历PK索引时,它获得ROWID值。此ROWID包含文件编号,块ID以及块内的行号。因此Oracle可以直接访问该行。

答案 1 :(得分:0)

HEXTORAW启用分区修剪。

在下面的示例中,Pstart和Pstop是字面数字,表示发生了分区修剪。

create table my_table
(
    TAB_ID raw(16),
    a number,
    constraint my_table_pk primary key (tab_id)
)
partition by hash(tab_id) partitions 16;

explain plan for
select *
from my_table
where tab_id = hextoraw('1BCDB0E06E7C498CBE42B72A1758B432');

select * from table(dbms_xplan.display(format => 'basic +partition'));

Plan hash value: 1204448714

--------------------------------------------------------------------------
| Id  | Operation                          | Name        | Pstart| Pstop |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |             |       |       |
|   1 |  TABLE ACCESS BY GLOBAL INDEX ROWID| MY_TABLE    |     2 |     2 |
|   2 |   INDEX UNIQUE SCAN                | MY_TABLE_PK |       |       |
--------------------------------------------------------------------------