sql中索引不会被用到的几种情况

转载自  sql中索引不会被用到的几种情况

1、查询谓词没有使用索引的主要边界,换句话说就是select *,可能会导致不走索引。

比如,你查询的是SELECT * FROM T WHERE Y=XXX;假如你的T表上有一个包含Y值的组合索引,但是优化器会认为需要一行行的扫描会更有效,这个时候,优化器可能会选择TABLE ACCESS FULL,但是如果换成了SELECT Y FROM T WHERE Y = XXX,优化器会直接去索引中找到Y的值,因为从B树中就可以找到相应的值。

 

2、单键值的b树索引列上存在null值,导致COUNT(*)不能走索引。

如果在B树索引中有一个空值,那么查询诸如SELECT COUNT(*) FROM T 的时候,因为HASHSET中不能存储空值的,所以优化器不会走索引,有两种方式可以让索引有效,一种是SELECT COUNT(*) FROM T WHERE XXX IS NOT NULL或者把这个列的属性改为not null (不能为空)。

 

3、索引列上有函数运算,导致不走索引

如果在T表上有一个索引Y,但是你的查询语句是这样子SELECT * FROM T WHERE FUN(Y) = XXX。这个时候索引也不会被用到,因为你要查询的列中所有的行都需要被计算一遍,因此,如果要让这种sql语句的效率提高的话,在这个表上建立一个基于函数的索引,比如CREATE INDEX IDX FUNT ON T(FUN(Y));这种方式,等于Oracle会建立一个存储所有函数计算结果的值,再进行查询的时候就不需要进行计算了,因为很多函数存在不同返回值,因此必须标明这个函数是有固定返回值的。

 

4、隐式转换导致不走索引。

索引不适用于隐式转换的情况,比如你的SELECT * FROM T WHERE Y = 5 在Y上面有一个索引,但是Y列是VARCHAR2的,那么Oracle会将上面的5进行一个隐式的转换,SELECT * FROM T WHERE TO_NUMBER(Y) = 5,这个时候也是有可能用不到索引的。

 

5、表的数据库小或者需要选择大部分数据,不走索引

在Oracle的初始化参数中,有一个参数是一次读取的数据块的数目,比如你的表只有几个数据块大小,而且可以被Oracle一次性抓取,那么就没有使用索引的必要了,因为抓取索引还需要去根据rowid从数据块中获取相应的元素值,因此在表特别小的情况下,索引没有用到是情理当中的事情。

6、cbo优化器下统计信息不准确,导致不走索引

很长时间没有做表分析,或者重新收集表状态信息了,在数据字典中,表的统计信息是不准确的,这个情况下,可能会使用错误的索引,这个效率可能也是比较低的。

7、!=或者<>(不等于),可能导致不走索引,也可能走 INDEX FAST FULL SCAN

例如select id  from test where id<>100

8、表字段的属性导致不走索引,字符型的索引列会导致优化器认为需要扫描索引大部分数据且聚簇因子很大,最终导致弃用索引扫描而改用全表扫描方式,

由于字符型和数值型的在insert的时候排序不同,字符类型导致了聚簇因子很大,原因是插入顺序与排序顺序不同。详细点说,就是按照数字类型插入(1..3200000),按字符类型('1'...'32000000')t排序,在对字符类型使用大于运算符时,会导致优化器认为需要扫描索引大部分数据且聚簇因子很大,最终导致弃用索引扫描而改用全表扫描方式。

下面展示测试结果,

两个表的数据类型相似(只是ID字段类型不同),各插入了320万数据,ID字段范围为1~3200000。

模拟场景

相关代码如下:

对于普通的采用数值类型的字段,范围查询就是正常的索引范围扫描,执行效率很高。

对于文本类型字段的表,范围查询就是对应的全表扫描,效率较低是显而易见的。

解决方法

将SQL语句由开放区间扫描(>=),修改为封闭区间(between xxx and max_value)。使得数据在索引局部顺序是“对的”。如果采用这种方式仍然不走索引扫描,还可以进一步细化分段或者采用“逐条提取+批绑定”的方法。

 

9.建立组合索引,但查询谓词并未使用组合索引的第一列,此处有一个INDEX SKIP SCAN概念,

10、like '%liu' 百分号在前

11,not in ,not exist

可以尝试把not in 或者 not exsts改成左连接的方式(前提是有子查询,并且子查询有where条件)。

例如:

SELECT/*+ INDEX(I CIRCLEICONMAST_IX1)*/I.ICONNO,I.CIRCLEID,I.FILEPATH,I.REGDT,I.FILEPATH || '/' || I.FILENAME IMGNAME,I.FILEPATH || '/' || 'th_160_' || I.FILENAME SMALLIMGNAME,I.MEMBERID,I.ADMCHK STATUS,I.ADMCHK ORIGINALSTATUS,ROWNUM RNFROM CIRCLEICONMAST IWHERE I.REGDT BETWEEN TO_DATE('20120619', 'YYYYMMDD') - 10000 ANDTO_DATE('20120621', 'YYYYMMDD')AND NOT EXISTS (SELECT C.VALIDFLGFROM CIRCLEMAST CWHERE C.VALIDFLG IN ('N', 'F')AND I.CIRCLEID = C.CIRCLEID)      AND I.ADMCHK = 'N'

改成左连接:

SELECT/*+ INDEX(I CIRCLEICONMAST_IX1)*/I.ICONNO,I.CIRCLEID,I.FILEPATH,I.REGDT,I.FILEPATH || '/' || I.FILENAME IMGNAME,I.FILEPATH || '/' || 'th_160_' || I.FILENAME SMALLIMGNAME,I.MEMBERID,I.ADMCHK STATUS,I.ADMCHK ORIGINALSTATUS,ROWNUM RNFROM CIRCLEICONMAST I, CIRCLEMAST CWHERE I.REGDT BETWEEN TO_DATE('20110620', 'YYYYMMDD') ANDTO_DATE('20120621', 'YYYYMMDD') + 1AND C.VALIDFLG NOT IN ('N', 'F')AND I.CIRCLEID = C.CIRCLEIDAND I.ADMCHK = 'N'

总结:oracle中有很多情况会导致index失效,并且走全表扫描的代价是相当大的,所以在写sql的时候一定要注意这个会使索引失效的情况,养成良好的习惯。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

asp.net core合并压缩资源文件引发的学习之旅

0. 在asp.net core中使用BuildBundlerMinifier合并压缩资源文件 在asp.net mvc中可以使用Bundle来压缩合并css,js 不知道的见&#xff1a;http://www.cnblogs.com/morang/p/7207176.html 在asp.net core中则可以使用BuildBundlerMinifier来进行css&#xff0c;js的压缩合并 新建…

新服务器中如何安装jdk(一行命令)

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 今天我们看看如何在服务器中安装jdk&#xff0c;这里指的服务器是linux。 服务器版本&#xff1a;centos 7.8 jdk版本&#xff1a;jdk1.8 下面我们来介绍下命令是什么&#xff1a; yum -…

nssl1186-字串数量【前缀和】

正题 题目大意 长度为n的字符串&#xff0c;有q个询问&#xff0c;求[l∼r][l\sim r][l∼r]这个区间的最小子串出现次数。 解题思路 这个就是一道坑题 我们可以发现如果有一个长度为2的子串&#xff0c;那么这个子串前面那一部分一定是更小的。 所以最小子串一定是一个字母&a…

关于腾讯云域名解析

前言 在浏览qq空间的时候看到了腾讯云的广告&#xff0c;只要一块钱即可注册一个.club域名。想起前段时间看的博客&#xff0c;自己早晚要入手网站搭方面的内容&#xff0c;按捺不住心悸&#xff0c;遂买了个域名&#xff0c;起了个叫woyidiankuan的域名&#xff0c;本来想写k…

linux服务器中如何安装mysql数据库(一次性完成,包含远程连接)

大家好。我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 今天给大家介绍一下&#xff0c;如何在新服务器中安装mysql数据库&#xff0c;总是捣鼓服务器&#xff0c;每次都去网上查&#xff0c;次次都不一样&#xff0c;浪费好多时间&#xff0c;这次自己记录…

Postman高级应用——流程控制、调试、公共函数、外部数据文件

postman客户端下载地址&#xff1a;https://www.getpostman.com/apps 流程控制 流程控制简言之就是设置接口的执行顺序&#xff0c;流程控制只有在collection runner或Newman里才生效 如果需要实现多个接口的一次循环&#xff0c;只需在每个接口的Tests中编写脚本 postman.setN…

JavaFX鼠标拖拽移动图片

一、鼠标拖拽移动图片 package cn.util;import java.io.File; import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.geometry.Point2D; import javafx.geometry.Rectangle2D; impor…

nssl1187-排列【dp,随机卡常,树状数组】

正题 题目大意 一个由1∼n1\sim n1∼n组成的序列 求长度为k的上升序列的个数。 数据保证随机 解题思路 用fi,jf_{i,j}fi,j​表示长度为i&#xff0c;以j结尾的上升序列个数。 然后 fi,j∑fi−1,k(aj>ak,j>k)f_{i,j}\sum f_{i-1,k}(a_j>a_k,j>k)fi,j​∑fi−1,k​…

ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: N O)

今天早上起来原想着学习python的&#xff0c;想看看mysql&#xff0c;于是陷进去了。 明明没碰啊&#xff0c;怎么突然就启动不了了呢 输入mysql net start mysql 一直显示正在启动&#xff0c;最后蹦出个服务无法启动 网上查了下输入 mysqld --initialize 早上的时候输入的…

如何将base64图像数据以图片的形式上传到云存储obs中

大家好&#xff0c;我是雄雄。欢迎关注微信公众号&#xff1a;雄雄的小课堂。 今天分享个方法&#xff0c;如标题所示&#xff1a; 在日常开发中&#xff0c;我们经常会有这样的需求&#xff0c;将前台拿到的base64图像格式的数据&#xff0c;上传到云存储服务器上&#xff0c…

JavaFX鼠标滚动放大缩小图片

一、鼠标滚动放大缩小图片 package cn.util;import java.io.File; import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.geometry.Point2D; import javafx.geometry.Rectangle2D; i…

linux上还原自主nuget包需要注意的问题

问题的产生的背景 由于我们使用了jenkins进行部署&#xff08;jenkins~集群分发功能和职责处理&#xff09;&#xff0c;而对于.net core项目来说又是跨平台的&#xff0c;所以对它的项目拉取&#xff0c;包的还原&#xff0c;项目的编译和项目的发布都是在一台linux的jenkins节…

ssl提高组国庆模拟赛【2018.10.7】

前言 出现了&#xff01;毒瘤抠题人BPM。 WHF大佬强势串场 成绩 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC1112017myself2017myself2017myself2702702701001001001001001007070702222015hjw2015hjw2015hjw1601601603030301001001003030303332016whf2016whf2016…

python爬虫进阶(初始)

该内容主要是爬虫爬取图片以及html&#xff0c;属于库的基本内容&#xff0c;以后再在此基础上进阶更智能更全面的python代码 整体框架大致 目标&#xff1a; 下载图片 创建文件夹并在文件夹里加入东西 批量下载图片到文件夹里 筛选数据 批量筛选指定数据到文件夹里 将数据导入…

Spring整合mybatis中的sqlSession是如何做到线程隔离的?

转载自 Spring整合mybatis中的sqlSession是如何做到线程隔离的&#xff1f; 项目中常常使用mybatis配合spring进行数据库操作&#xff0c;但是我们知道&#xff0c;数据的操作是要求做到线程安全的&#xff0c;而且按照原来的jdbc的使用方式&#xff0c;每次操作完成之后都要…

Net知识图谱

对于Web系统开发来说&#xff0c;Net其实也是有好多知识点需要学的&#xff0c;虽然目前JAVA是主流&#xff0c;就业市场比较大&#xff0c;但Net也在积极的拥抱开源&#xff0c;大Net Core 2 出来了&#xff0c;这无疑给Net开发者带来更大的希望&#xff0c;好了&#xff0c;以…

域名配置https时,请求无响应的解决方法

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 前言 在项目需要上线时&#xff0c;我们经常会遇到这样的需求&#xff0c;将http的域名换成https&#xff0c;或者当我们使用小程序开发时&#xff0c;只支持https的请求方式&#xff0c…

三步搭建网站

这两天无意中想了解更广泛的编程知识&#xff0c;便去看了些php的视频。我想把本机当成服务器来用&#xff0c;因为事先已经注册了域名&#xff0c;但当我又重新登录腾讯云的时候&#xff0c;上面显示我可以免费领取一个15天的服务器&#xff0c;抱着试一试的心态&#xff0c;领…

USACO2.3【dfs,dp,背包】

正题 T1:最长前缀 LongestPrefixLongest PrefixLongestPrefix 评测记录: https://www.luogu.org/recordnew/lists?uid52918&pidP1470 题目大意 求有字符串集合VVV中的字符可以组成的字符串s的最长前缀。 解题思路 用fif_ifi​表示能否组成长度为i的最长前缀&#xff0c…

jenkins~集群分发功能的具体实现

前一讲主要说了jenkins分发的好处《jenkins~集群分发功能和职责处理》&#xff0c;它可以让具体的节点干自己具体的事&#xff0c;比如windows环境下的节点&#xff0c;它只负责编译&#xff0c;发布windows的生态环境的项目&#xff1b;而linux节点主要负责和它相关的项目&…