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


nvarchar2和varchar2 都是Oracle数据库中常见的字符数据类型,它们都可以用来存储可变长度的字符串。其中,varchar2 是最基本和最常见的字符数据类型,在Oracle中,当我们需要存储可变长度的字符串,我们通常会选择varchar2数据类型。 而nvarchar2则是一种更加通用的字符数据类型,它针对的是国际化的情况。在nvarchar2中,所有的字符使用Unicode编码来表示,这使得nvarchar2可以轻松地支持包括日文、中文、韩文、阿拉伯文等众多语言的字符集。相比于varchar2,nvarchar2具有很大的优势,尤其是在国际化方面。 但是需要注意的是,由于nvarchar2中的字符使用Unicode编码来表示,因此,在存储相同的数据时,nvarchar2所占用的存储空间会比varchar2更大,这也是nvarcar2的一个缺点。此外,由于nvarchar2的存储方式比较特殊,因此在Oracle数据库中,nvarchar2类型的数据在进行排序和搜索等操作时,需要比varchar2更复杂的算法来实现,这也会导致相应的查询操作变得更加缓慢。 综上所述,nvarchar2和varchar2都是Oracle数据库中常见的字符数据类型,它们一般用于存储可变长度的字符串。其中,nvarchar2针对的是国际化的情况,在处理一些包含多种语言字符集的数据时具有很大的优势,但相应的存储空间和查询操作都有一定的影响。因此,我们在使用过程中需要根据实际情况选择合适的数据类型。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值