坑爹的NVARCHAR2

今天帮一个学生优化SQL,遇到NVARCHAR2问题。具体SQL因为涉及保密就不贴了。但是可以模拟一下。


create table t1(id number,name nvarchar2(200));
create table t2(id number,name varchar2(200));

insert into t1 select rownum,table_name from dba_tables;
insert into t2 select rownum,object_name from dba_objects;
commit;

select * from t1,t2 where t1.name=t2.name and rownum<=10;

SQL> select * from t1,t2 where t1.name=t2.name and rownum<=10;

已选择10行。


执行计划
----------------------------------------------------------
Plan hash value: 808789222

----------------------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |    10 |  4450 |    10  (10)| 00:00:01 |
|*  1 |  COUNT STOPKEY      |      |       |       |            |          |
|*  2 |   HASH JOIN         |      | 72191 |    30M|    10  (10)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| T1   |  2780 |   583K|     7   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL| T2   | 72009 |  8086K|     2   (0)| 00:00:01 |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(ROWNUM<=10)
   2 - access("T1"."NAME"=SYS_OP_C2C("T2"."NAME"))


表关联的时候,会自动的加上 SYS_OP_C2C 函数,想要T2 join列走索引还得搞个 函数索引 create index idx_t2 on t2(sys_op_c2c(name));

注意:表设计的时候,如果有2个表关联,关联列 要么全都是NVARCHAR2,要么全都是VARCHAR2,别来一样一个


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值