问题描述
在下面的代码中,表在带有列表分区的数字字段上进行分区。
其中一个表分区值意外设置为varchar值 ('1')
但是,当使用select查询时,我发现分区修剪已经发生。
(ie优化器发现设置了pstart和pstop)
你能解释一下这种行为吗?
其中一个表分区值意外设置为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:
这仅在字符串映射到数字的情况下起作用。如果您尝试使用实际上不是数字的东西创建分区,Oracle不会让您:
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




