一次简单的SQL优化给我的经验–索引不可用的情况

有一天我遇到了一个同事的求助,他让我帮忙优化一个SQL,这个SQL执行时间很长。于是我查询了执行计划,发现这个SQL竟然要进行一次

有一天我遇到了一个同事的求助,他让我帮忙优化一个SQL,这个SQL执行时间很长。于是我查询了执行计划,发现这个SQL竟然要进行一次全表扫描。当时我查看了表的定义,,发现在where子句中的条件列上是建了索引的,那为什么执行计划会显示全表扫描呢。这个问题困扰了我很长时间,于是后来我又看了看表的定义,发现了问题的根本所在,作为条件的字段是varchar,而SQL语句中的条件是一串数字!这样的话就会造成索引不可用,处理方法也很简单,加上一对单引号就可以了。

下面是语句和执行计划(这里做了简单化处理,只需要注意全表扫描就可以):

Plan hash value: 1357081020 
————————————————————————– 
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     | 
————————————————————————– 
|   0 | SELECT STATEMENT  |      |     1 |     5 |     3   (0)| 00:00:01 | 
|*  1 |  TABLE ACCESS FULL| TEST |     1 |     5 |     3   (0)| 00:00:01 | 
————————————————————————– 
Predicate Information (identified by operation id): 
————————————————— 
   1 – filter(TO_NUMBER(“T”.”SPEC_PRPTY_ID”)=3303)

   这是添加过单引号的执行计划:

Plan hash value: 1128569081 
—————————————————————————– 
| Id  | Operation        | Name     | Rows  | Bytes | Cost (%CPU)| Time     | 
—————————————————————————– 
|   0 | SELECT STATEMENT |          |     1 |     5 |     1   (0)| 00:00:01 | 
|*  1 |  INDEX RANGE SCAN| IDX_TEST |     1 |     5 |     1   (0)| 00:00:01 | 
—————————————————————————– 
Predicate Information (identified by operation id): 
————————————————— 
   1 – access(“T”.”SPEC_PRPTY_ID”=’3303′)

     可以看出使用了索引,如果该表数据量大的话,那么这样的效率提升是非常可观的。

     其实从执行计划中的:1 – filter(TO_NUMBER(“T”.”SPEC_PRPTY_ID”)=3303)这一句就能看出原因,就是执行了一次隐式类型转换,这种情况是不会用到索引的,如果这张表足够大,那么这次查询可是要慢的要死了。

     这个例子很简单,很多高手也会嗤之以鼻,但是秉承着从细微处入手学习Oracle的信念的我,还是从这里得到了一个知识点:一下几种情况索引不会被使用:

     1 不等于操作不能用于索引

     2 经过普通或者函数运算的索引列不能使用索引

     3 含前向模糊

     4 索引列为空

     5 数值比较时左右类型不同,相当于做了隐式类型转换

     6 给索引查询的值是未知字段,而不是已知数

      一定要注意,慎之又慎的写SQL。

linux

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1940001.html

(0)
上一篇 2025年2月23日 00:11:50
下一篇 2025年2月23日 00:12:09

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 如何将 AWS Glue 爬网程序与 Amazon Athena 结合使用

    作为数据专业人员,您需要处理来自各种来源的大量数据。这可能会给数据管理和分析带来挑战。幸运的是,两项 AWS 服务可以提供帮助:AWS Glue 和 Amazon Athena。 当您集成这些服务时,您就释放了 AWS 生态系统中的数据发现…

    2025年2月23日
    100
  • Navicat实用功能:数据备份与结构同步

    摘要 当我们要对数据库做有风险的操作时需要对数据库备份,每次上线项目时,线上与线下数据库结构总会有不一致的情况,本文将讲解如何利用Navicat来方便的解决这两个问题。 Navicat Navicat是一套快速、可靠的数据库管理工具,专为简…

    2025年2月23日 数据库
    100
  • sql文件怎么导入navicat

    打开Navicat for MySQL后点击新建链接,会呈现很多未打开的数据库,在任意一个数据库上右键点击,选择“新建数据库”。 会出现一个弹窗,输入数据库的名字,随便写一个,字符集选择GBK,排序规则可以不用选。 相关推荐:《Navica…

    2025年2月23日 数据库
    100
  • navicat怎么执行sql

    首先,使用Navicat for MySQL连接数据库并创建一个数据库。 接着点击查询,这里有两个查询,随便点击一个都可以。 既然是要执行SQL语句,所以我们要先新建一个查询窗体才得。 相关推荐:《Navicat for mysql使用图文…

    2025年2月23日 数据库
    100
  • navicat for mysql怎么导入sql

    Navicat for Mysql 是应用比较多的mysql的视图管理工具。下面为大家记录下Navicat for mysql如何导入sql文件。 推荐教程:MySQL入门视频教程 1、首先创建一个数据库(因为我导入的sql文件只有建表和插…

    2025年2月23日 数据库
    100
  • navicat表怎么执行sql语句

      很多小可爱可能都会使用Navicat for MySQL来操作电脑的MySQL数据库,今天小编我就来分享一下Navicat for MySQL怎样执行SQL语句。 推荐教程:MySQL入门视频教程 1、首先,打开navicat,选择要操…

    2025年2月23日 数据库
    100
  • navicat怎么用SQL语句创建视图

    navicat是一款非常好用的数据库管理软件,其功能非常强大。下面我们就为大家介绍一下,怎样在navicat中使用sql语句创建视图。 推荐教程:navicat图文教程 首先我们需要打开navicat。选择需要操作的数据库。点击查询,新建查…

    2025年2月23日
    100
  • navicat怎么导入sql

    Navicat for Mysql 是应用比较多的mysql的视图管理工具。下面记录下Navicat for mysql如何导入sql文件。 首先创建一个数据库(因为我导入的sql文件只有建表和插入数据的语句)。 在连接名处点击右键,新建数…

    2025年2月23日 数据库
    100
  • navicat怎么写sql

      sql是操作数据库中数据的语句,在不同的数据库中会略有不同。Navicat for MySQL是一款很方便的MySQL客户端工具,能够很好的提供操作数据库可视界面,在同类型的软件中,占有极高的市场份额。为了方便大家学会在Navicat写…

    2025年2月23日 数据库
    100
  • navicat怎么运行sql语句

      很多小可爱可能都会使用Navicat for MySQL来操作电脑的MySQL数据库,今天小编我就来分享一下Navicat for MySQL怎样执行SQL语句。 推荐教程:navicat图文教程 1、首先,使用Navicat for …

    2025年2月23日 数据库
    100

发表回复

登录后才能评论