内容简介:新上线的系统很多数字类型的字段都是使用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中转义双引号
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java Servlet & JSP Cookbook
Bruce W. Perry / O'Reilly Media / 2003-12-1 / USD 49.99
With literally hundreds of examples and thousands of lines of code, the Java Servlet and JSP Cookbook yields tips and techniques that any Java web developer who uses JavaServer Pages or servlets will ......一起来看看 《Java Servlet & JSP Cookbook》 这本书的介绍吧!
Markdown 在线编辑器
Markdown 在线编辑器
html转js在线工具
html转js在线工具