`
core_qq
  • 浏览: 15131 次
  • 性别: Icon_minigender_1
  • 来自: 西安
最近访客 更多访客>>
社区版块
存档分类
最新评论

索引不可用的情况

阅读更多
     有一天我遇到了一个同事的求助,他让我帮忙优化一个SQL,这个SQL执行时间很长。于是我查询了执行计划,发现这个SQL竟然要进行一次全表扫描。当时我查看了表的定义,发现在where子句中的条件列上是建了索引的,那为什么执行计划会显示全表扫描呢。这个问题困扰了我很长时间,于是后来我又看了看表的定义,发现了问题的根本所在,作为条件的字段是varchar,而SQL语句中的条件是一串数字!这样的话就会造成索引不可用,处理方法也很简单,加上一对单引号就可以了。
     下面是语句和执行计划(这里做了简单化处理,只需要注意全表扫描就可以):
1
select * from TEST t where t.spec_prpty_id = 3303;
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')
   可以看出使用了索引,如果该表数据量大的话,那么这样的效率提升是非常可观的。
   这个例子很简单,很多高手也会嗤之以鼻,但是秉承着从细微处入手学习Oracle的信念的我,还是从这里得到了一个知识点:一下几种情况索引不会被使用:
1 不等于操作不能用于索引
2 经过普通或者函数运算的索引列不能使用索引
3 含前向模糊
4 索引列为空
5 数值比较时左右类型不同,相当于做了隐式类型转换
6 给索引查询的值是未知字段,而不是已知数
    一定要注意,慎之又慎的写SQL。
0
1
分享到:
评论

相关推荐

    什么情况下能利用上索引

    sybase 数据库在什么情况下能利用上索引

    Oracle 9i中如何监视索引的使用情况

    在许多的情况下, 索引比被索引的表消耗更多的存储空间。在插入和删除行的时候,索引还会引入额外的开销。在Oracle9i之前,要知道一个索引是否被使用是困难的,因此许多数据库都有许多没用的索引。本文的目的就是向...

    oracle索引被限制的一些情况

    详细介绍了一些oracle索引被限制的一些情况

    mysql 索引类型与运用情况

    对 myslq 基本索引类型的概述,以及在不同中情况下的运用。

    建立合理的索引提高SQL Server的性能

    SQL Server缺省情况下建立的索引是非聚簇索引,由于非聚簇索引不重新组织表中的数据,而是对每一行存储索引列值并用一个指针指向数据所在的页面。换句话 说非聚簇索引具有在索引结构和数据本身之间的一个额外级。

    MySQL索引不会被用到的情况汇总

    主键索引:一种特殊的唯一索引,不允许有空值 联合索引:索引列有多个字段,使用时需要满足最左前缀原则 普通索引 这是最基本的索引,它没有任何限制。它有以下几种创建方式: 1.创建索引 代码如下: CREATE ...

    SqlServer重建索引

    用于SqlServer的索引重建,全语句实现,可根据实际情况进行部分关键表的索引重建。

    Mysql中SQL语句不使用索引的情况

    众所周知,增加索引是提高查询速度的有效途径,但是很多时候,即使增加了索引,查询仍然不使用索引,这种情况严重影响性能,这里就简单总结几条MySQL不使用索引的情况 如果MySQL估计使用索引比全表扫描更慢,则不...

    SqlServer-查看所有表、行数、索引名称、索引的字段

    系统跑久了,对于所有的索引想做一个具体的确认,所以写了这么一段, 可以用来分析自己数据的表及索引详情 针对记录数比较大的表,尤其要注意索引的情况,非常影响性能

    DB2索引分析器使用简述

    DB2数据库中自带的db2advis索引分析器使用简述

    关于SQL Server中索引使用及维护简介

    SQL Server缺省情况下建立的索引是非聚簇索引,由于非聚簇索引不重新组织表中的数据,而是对每一行存储索引列值并用一个指针指向数据所在的页面。换句话 说非聚簇索引具有在索引结构和数据本身之间的一个额外级。一...

    pp7221343#Interview-preparation#2021-3-18mysql索引不生效情况1

    如果能使用索引,MySQL会使用索引,如果代价太高,仍然会走全表索引如果多个OR条件中有其中一个条件没有索引,则必须进行全表索引联合索引(a,b,c)联合索引使

    Mysql索引会失效的几种情况分析

    索引并不是时时都会生效的,比如以下几种情况,将导致索引失效:  1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)  注意:要想使用or,又想让索引生效,只能将or条件中的每个...

    Mysql5.7及8.0版本索引失效情况汇总

    没有特殊说明,测试环境均为MySQL8.0,早期版本可能会有更多情况导致索引失效。8.0失效的情况,早期版本也失效;8.0不失效的情况,早期版本可能失效。 所有测试默认不考虑表为空的情况,特殊情况文中会有说明。 本文...

    索引的数据结构.pdf

    ,如果有联合索引,⽐如hash(id,name),只传了id,那么就会索引久会失 效,还有不⽀持范围查找 红⿊树缺点:磁盘⼀页数据可以读16k,可能在查找了3次才能查到⾃⼰想要的数据,每⼀次查找都是读取磁盘,导致读取...

    mysql数据库索引自学笔记,基础+单表索引+多表索引的创建方法及原理

    索引优化时,问题一般集中在以下三种情况:1、没有足够多的索引;2、没有有效的索引;3、索引列的顺序不对。这三种情况也是此系列要讲述的重点。同是提一下一些“误区”,之所以称为误区是因为在没有特定背景的情况...

    中文社会科学引文索引与版情况对照.pdf

    中文社会科学引文索引与版情况对照.pdf

    MySQL索引失效的几种情况汇总

    更准确的说,单列索引不存储null值,复合索引不存储全为null的值。索引不能存储Null,所以对这列采用is null条件时,因为索引上根本 没Null值,不能利用到索引,只能全表扫描。 为什么索引列不能存Null值? 将索引列...

    oracle索引失效的总结

    oracle索引失效的总结

    mssql 查看索引碎片并重建索引.txt

    使用mssql代码查询某个数据库中所有索引的情况,包括碎片信息

Global site tag (gtag.js) - Google Analytics