内容简介:新上线的系统很多数字类型的字段都是使用varchar2类型存放,要转换成number类型时,和开发人员对number类型的字段在查询时加上单引号走不走索引的问题产生了分歧,大家都知道,如果使用char类型存放数字,在查询时如果不加单引号是不会走索引的,测试信息如下,数据库版本11.2.0.4.0。创建测试表如下。创建索引。
新上线的系统很多数字类型的字段都是使用varchar2类型存放,要转换成number类型时,和开发人员对number类型的字段在查询时加上单引号走不走索引的问题产生了分歧,大家都知道,如果使用char类型存放数字,在查询时如果不加单引号是不会走索引的,测试信息如下,数据库版本11.2.0.4.0。
创建测试表如下。
01
|
SQL> conn dbdream/dbdream
|
02
|
Connected.
|
03
|
SQL>
|
04
|
05
|
SQL> create table ind_text as select object_id,object_name from dba_objects;
|
06
|
07
|
Table created.
|
08
|
09
|
SQL> ALTER TABLE IND_TEXT ADD OBJECT_CHAR VARCHAR2(22);
|
10
|
11
|
Table altered.
|
12
|
13
|
SQL> UPDATE IND_TEXT SET OBJECT_CHAR=OBJECT_ID;
|
14
|
15
|
90743 rows updated.
|
16
|
17
|
SQL> COMMIT;
|
18
|
19
|
Commit complete.
|
20
|
21
|
SQL> ALTER TABLE IND_TEXT MOVE;
|
22
|
23
|
Table altered.
|
创建索引。
01
|
SQL> create index ind_OBJECT_ID on ind_text(OBJECT_ID);
|
02
|
03
|
Index created.
|
04
|
05
|
SQL> create index ind_OBJECT_NAME on ind_text(OBJECT_NAME);
|
06
|
07
|
Index created.
|
08
|
09
|
SQL> CREATE INDEX IND_OBJECT_CHAR ON IND_TEXT(OBJECT_CHAR);
|
10
|
11
|
Index created.
|
现在OBJECT_ID字段是用number类型存放数字,OBJECT_CHAR字段使用varchar2类型存放数字,通过下面的测试可以看到如果查询OBJECT_CHAR字段字段,不加单引号是不会走索引的。
01
|
SQL> SELECT OBJECT_CHAR,OBJECT_NAME FROM IND_TEXT WHERE OBJECT_CHAR='100832';
|
02
|
03
|
OBJECT_CHAR OBJECT_NAME
|
04
|
-------------------- ------------------
|
05
|
100832 ORD_ORD_DTL_D
|
06
|
07
|
Execution Plan
|
08
|
----------------------------------------------------------
|
09
|
Plan hash value: 1825303736
|
10
|
11
|
-----------------------------------------------------------------------------------------------
|
12
|
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
|
13
|
-----------------------------------------------------------------------------------------------
|
14
|
| 0 | SELECT STATEMENT | | 1 | 78 | 1 (0)| 00:00:01 |
|
15
|
| 1 | TABLE ACCESS BY INDEX ROWID| IND_TEXT | 1 | 78 | 1 (0)| 00:00:01 |
|
16
|
|* 2 | INDEX RANGE SCAN | IND_OBJECT_CHAR | 1 | | 1 (0)| 00:00:01 |
|
17
|
-----------------------------------------------------------------------------------------------
|
18
|
19
|
SQL> SELECT OBJECT_CHAR,OBJECT_NAME FROM IND_TEXT WHERE OBJECT_CHAR=100832;
|
20
|
21
|
OBJECT_CHAR OBJECT_NAME
|
22
|
-------------------- --------------------
|
23
|
100832 ORD_ORD_DTL_D
|
24
|
25
|
Execution Plan
|
26
|
----------------------------------------------------------
|
27
|
Plan hash value: 2154511419
|
28
|
29
|
------------------------------------------------------------------------------
|
30
|
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
|
31
|
------------------------------------------------------------------------------
|
32
|
| 0 | SELECT STATEMENT | | 6 | 468 | 143 (3)| 00:00:02 |
|
33
|
|* 1 | TABLE ACCESS FULL| IND_TEXT | 6 | 468 | 143 (3)| 00:00:02 |
|
34
|
------------------------------------------------------------------------------
|
那么到底查询用number类型存放的数字,查询时不加单引号肯定是走索引的,加上单引号会不会走索引呢,看下面的测试。
01
|
SQL> select OBJECT_NAME,OBJECT_ID from ind_text where OBJECT_ID=100832;
|
02
|
03
|
OBJECT_NAME OBJECT_ID
|
04
|
-------------- -----------
|
05
|
ORD_ORD_DTL_D 100832
|
06
|
07
|
Execution Plan
|
08
|
----------------------------------------------------------
|
09
|
Plan hash value: 417862871
|
10
|
11
|
---------------------------------------------------------------------------------------------
|
12
|
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
|
13
|
---------------------------------------------------------------------------------------------
|
14
|
| 0 | SELECT STATEMENT | | 1 | 79 | 2 (0)| 00:00:01 |
|
15
|
| 1 | TABLE ACCESS BY INDEX ROWID| IND_TEXT | 1 | 79 | 2 (0)| 00:00:01 |
|
16
|
|* 2 | INDEX RANGE SCAN | IND_OBJECT_ID | 1 | | 1 (0)| 00:00:01 |
|
17
|
---------------------------------------------------------------------------------------------
|
18
|
19
|
SQL> select OBJECT_NAME,OBJECT_ID from ind_text where OBJECT_ID='100832';
|
20
|
21
|
OBJECT_NAME OBJECT_ID
|
22
|
-------------- ----------
|
23
|
ORD_ORD_DTL_D 100832
|
24
|
25
|
Execution Plan
|
26
|
----------------------------------------------------------
|
27
|
Plan hash value: 417862871
|
28
|
29
|
---------------------------------------------------------------------------------------------
|
30
|
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
|
31
|
---------------------------------------------------------------------------------------------
|
32
|
| 0 | SELECT STATEMENT | | 1 | 79 | 2 (0)| 00:00:01 |
|
33
|
| 1 | TABLE ACCESS BY INDEX ROWID| IND_TEXT | 1 | 79 | 2 (0)| 00:00:01 |
|
34
|
|* 2 | INDEX RANGE SCAN | IND_OBJECT_ID | 1 | | 1 (0)| 00:00:01 |
|
35
|
---------------------------------------------------------------------------------------------
|
可见如果使用number类型存放数字,不论查询时加不加单元号都会走索引的。
总结:如果使用字符类型存放数字,只有在查询时使用单引号将数字引起来才会使用索引;如果是使用数字类型存放数字,查询时不管是否使用单引号,都会走索引。
觉得文章有用?立即:和朋友一起 共学习 共进步!
建议继续学习:
- 由浅入深探究 mysql 索引结构原理、性能分析与优化 (阅读:13711)
- 浅谈MySQL索引背后的数据结构及算法 (阅读:8473)
- 由浅入深理解索引的实现(2) (阅读:5661)
- HBase二级索引与Join (阅读:5166)
- 如何建立合适的索引? (阅读:4725)
- InnODB和MyISAM索引统计集合 (阅读:4625)
- Innodb 表和索引结构 (阅读:4025)
- MySQL索引背后的数据结构及算法原理 (阅读:3806)
- 多维度分类排行榜应用:用位图索引 (阅读:3526)
- mysql索引浅析 (阅读:3481)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Go中单引号和双引号和反引号(飘号)
- JS声明对象时属性名加引号与不加引号的问题及解决方法
- 如何设置 Visual Studio Code 格式化 React 时不要将单引号转为双引号?
- Linux 中引号的那些事
- MySQL中一个双引号错位引发的血案
- Javascript:在HTML中转义双引号
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
白帽子讲Web安全(纪念版)
吴翰清 / 电子工业出版社 / 2014-6 / 69.00元
互联网时代的数据安全与个人隐私受到前所未有的挑战,各种新奇的攻击技术层出不穷。如何才能更好地保护我们的数据?《白帽子讲Web 安全(纪念版)》将带你走进Web 安全的世界,让你了解Web 安全的方方面面。黑客不再神秘,攻击技术原来如此,小网站也能找到适合自己的安全道路。大公司如何做安全,为什么要选择这样的方案呢?在《白帽子讲Web 安全(纪念版)》中都能找到答案。详细的剖析,让你不仅能“知其然”,......一起来看看 《白帽子讲Web安全(纪念版)》 这本书的介绍吧!