坑爹的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,别来一样一个


发布了202 篇原创文章 · 获赞 456 · 访问量 138万+

猜你喜欢

转载自blog.csdn.net/robinson1988/article/details/46519983