我有很多包含大量数据的表。 PK是列(TAB_ID
),其数据类型为RAW(16)
。我使用具有TAB_ID
列的分区键创建了哈希分区。
我的问题是:SQL语句(select * from my_table where tab_id = 'aas1df'
)不使用分区修剪。如果我将列数据类型更改为varchar2(32)
,则分区修剪可以正常工作。
为什么分区修剪不能使用数据类型为RAW(16)
的分区键?
答案 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 | | |
--------------------------------------------------------------------------