Oracle字符类型存数字及查询数字时使用单引号走不走索引的问题

栏目: 数据库 · 发布时间: 5年前

内容简介:新上线的系统很多数字类型的字段都是使用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类型存放数字,不论查询时加不加单元号都会走索引的。

总结:如果使用字符类型存放数字,只有在查询时使用单引号将数字引起来才会使用索引;如果是使用数字类型存放数字,查询时不管是否使用单引号,都会走索引。

觉得文章有用?立即:和朋友一起 共学习 共进步!

建议继续学习:

  1. 由浅入深探究 mysql 索引结构原理、性能分析与优化    (阅读:13711)
  2. 浅谈MySQL索引背后的数据结构及算法    (阅读:8473)
  3. 由浅入深理解索引的实现(2)    (阅读:5661)
  4. HBase二级索引与Join    (阅读:5166)
  5. 如何建立合适的索引?    (阅读:4725)
  6. InnODB和MyISAM索引统计集合    (阅读:4625)
  7. Innodb 表和索引结构    (阅读:4025)
  8. MySQL索引背后的数据结构及算法原理    (阅读:3806)
  9. 多维度分类排行榜应用:用位图索引    (阅读:3526)
  10. mysql索引浅析    (阅读:3481)

QQ技术交流群:445447336,欢迎加入!

扫一扫订阅我的微信号:IT技术博客大学习


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The  C Programming Language

The C Programming Language

Brian W. Kernighan、Dennis M. Ritchie / Prentice Hall / 1988-4-1 / USD 67.00

Presents a complete guide to ANSI standard C language programming. Written by the developers of C, this new version helps readers keep up with the finalized ANSI standard for C while showing how to ta......一起来看看 《The C Programming Language》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

html转js在线工具
html转js在线工具

html转js在线工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具