暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 关于分区列表表

askTom 2016-08-09
231

问题描述

在下面的代码中,表在带有列表分区的数字字段上进行分区。

其中一个表分区值意外设置为varchar值 ('1')

但是,当使用select查询时,我发现分区修剪已经发生。
(ie优化器发现设置了pstart和pstop)

你能解释一下这种行为吗?


create table t_1(x int, y varchar2(10))
partition by list(x)
(
partition p1 values ('1'),
partition p2 values (2),
partition p3 values (3)
);

insert into t_1 values(1,'Testing');

insert into t_1 values(2,'Testing');

insert into t_1 values(3,'Testing');

commit;

explain plan for
select * from t_1 where x=1

Plan hash value: 3927810771
 
----------------------------------------------------------------------------------------------
| Id  | Operation             | Name | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |      |     1 |    20 |    22   (0)| 00:00:01 |       |       |
|   1 |  PARTITION LIST SINGLE|      |     1 |    20 |    22   (0)| 00:00:01 |     1 |     1 |
|   2 |   TABLE ACCESS FULL   | T_1  |     1 |    20 |    22   (0)| 00:00:01 |     1 |     1 |
----------------------------------------------------------------------------------------------
 
Note
-----
   - dynamic sampling used for this statement (level=2)


select * from t_1 partition(p1);
         X Y        
---------- ----------
         1 Testing   






专家解答

隐式转换再次罢工!

Oracle能够隐式地将字符串转换为数字。确实如此。它采用字符1并将其转换为数字1。就像你可以插入字符串 '1' 到一个int:

SQL> create table t_1(x int, y varchar2(10))
  2  partition by list(x)
  3  (
  4  partition p0 values ('1'),
  5  partition p2 values (2),
  6  partition p3 values (3)
  7  );

Table created.

SQL>
SQL> insert into t_1 values('1','Testing');

1 row created.

SQL> insert into t_1 values(1,'Testing');

1 row created.

SQL>
SQL> select * from t_1 where x = '1';

         X Y
---------- ----------
         1 Testing
         1 Testing


这仅在字符串映射到数字的情况下起作用。如果您尝试使用实际上不是数字的东西创建分区,Oracle不会让您:

SQL> drop table t_1 purge;

Table dropped.

SQL> create table t_1(x int, y varchar2(10))
  2  partition by list(x)
  3  (
  4  partition p0 values ('1a'),
  5  partition p2 values (2),
  6  partition p3 values (3)
  7  );
partition p0 values ('1a'),
                     *
ERROR at line 4:
ORA-01722: invalid number

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论