工作问题总结一:由数据查询慢来浅谈下oracle中的like和instr函数的模糊查询效率问题

  今天上午10点左右,boss告诉我们生产环境一客户在某功能下录入信息时,出现加载数据很慢的情况,因为严重影响了客户使用,就让我们赶紧查实原因,组长和我就根据领导提供的用户登录系统,找到出问题的那个功能,选择买方和银行信息后加载限额信息时组长的电脑出现的反应是浏览器卡死,我的电脑上是去趟厕所回来坐下来之后才加载出来,我靠3分钟左右的时间,崩溃!!!  赶紧查代码  经查询代码发现,加载的数据是从千万量级(有2321w余条)的表中查询,查询语句中使用了like操作符,经研究发现确实是因为查询的sql中使用like操作符造成。查询sql如下:

  select sum(t.a*t.b) from table t where t.c = ‘A‘ and t.d like ‘AM%‘ and t.e = ‘B‘....

  其中表t的d字段值的开头2个字母表达某种类型的数据 有AM、BM、CM等几类数据,且d字段的其他位均为0-9的数字

下边是分析问题的步骤:
      1.经查询该表的索引策略,该表的为 d > c > e  (备注:d、c、e为table表的字段)
      2.将d的索引失效,之后用上述语句查询,速度很快,但是对于select * from table t where t.d = ‘AM1245‘的使用无疑会是灾难,因为变成全表检索了
      3.然后使d的索引生效,查询该表的默认的索引策略依旧为  d > c > e
      4.使用instr(t.d,‘AM‘)>0 替换sql语句中的t.d like ‘AM%‘,发现效率很快。 -- 在生产环境验证的结果是使用like查询三分钟 是用instr后瞬间查询出来
      由此问题,引出了本文的重点,即instr与like的模糊查询效率问题

经问度娘得知:

     使用Oracle的instr函数与索引配合提高模糊查询的效率。  

一般来说,在Oracle数据库中,我们对tb表的name字段进行模糊查询会采用下面两种方式:
               1.select * from tb where name like ‘%XX%‘;
               2.select * from tb where instr(name,‘XX‘)>0;
          若是在name字段上没有加索引,两者效率差不多,基本没有区别。
         为提高效率,我们在name字段上可以加上非唯一性索引:
              create index idx_tb_name on tb(name);
         这样,再使用 select  * from tb where instr(name,‘XX‘)>0;这样的语句查询,效率可以提高不少,表数据量越大时两者差别越大(我们遇到的问题就是属于这种问题)。但也要顾及到name字段加上索引后DML语句会使索引数据重新排序的影响。

  本文参看文章:http://wenku.baidu.com/link?url=7C70-3mTzeKx2IdVjEdhgHKK8m5elJE5CYyPNivfzj4w8eU9snrbNMNMrfOH6kPZ-G150BXJVIJaHciHsTw-i9erGMtMwRIGRzKXp-rAlmK

解决该问题涉猎到的知识点:

  1.oracle直方图

    相关介绍:参看 http://czmmiao.iteye.com/blog/1484298

                       http://blog.csdn.net/javacoffe/article/details/5578206

2.索引策略

相关的介绍请问度娘。

3.oracle 优化器

    相关介绍:参看 http://www.cnblogs.com/dongzhiquan/archive/2012/01/20/2328365.html

4.oracle中的cluster  -- oracle中的聚集

    相关介绍:参看 http://blog.csdn.net/thunder09/article/details/5003675

   

时间: 2024-12-23 07:20:39

工作问题总结一:由数据查询慢来浅谈下oracle中的like和instr函数的模糊查询效率问题的相关文章

oracle中约束(constraints)是如何影响查询计划的

原文:http://www.oracle.com/technetwork/issue-archive/2009/09-may/o39asktom-096149.html oracle中约束(constraints)是如何影响查询计划的 通常人们认为约束只是和数据完整性有关,没问题.但是约束也被优化器使用来优化执行计划. 优化器会拿以下资源最为输入inputs: 1)待优化的查询 2)所有数据库对象统计 3)系统统计,如果可以获取的话(CPU速度.单块I/O速度等等作为物理硬件的衡量尺度) 4)初

浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色

浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色 本篇文章是系列文章中的第二篇,以防你还没有看过第一篇.上一篇的文章地址如下: 浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架 简介 每一个SQL Server的数据库都会按照其修改数据(insert,update,delete)的顺序将对应的日志记录到日志文件.SQL Server使用了Write-Ahead logging技术来保证了事务日志的原子性和持久性.而这项技术不仅仅保证了ACID

浅谈Entity Framework中的数据加载方式

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 如果你还没有接触过或者根本不了解什么是Entity Framework,那么请看这里http://www.entityframeworktutorial.net/EntityFramework-Architecture.aspx,其中的一系列文

SQL Server数据库--》top关键字,order by排序,distinct去除重复记录,sql聚合函数,模糊查询,通配符,空值处理。。。。

top关键字:写在select后面 字段的前面 比如你要显示查询的前5条记录,如下所示: select top 5 * from Student 一般情况下,top是和order by连用的 order by用在表名的后面 order by后面就填你要按它排序的字段,是升序排序(从小到大排序) percent:百分比 %=percent 比如要显示5%的数据处理,不能写top 5%,而是top 5 percent 提示:如果top 5 percent出来的数是3.1条数据的话,是取四条数据,而不

浅谈多变量线性回归中的数据规范化

简单来说,它主要用来把所有特征值范围映射至同样的范围里面如(0,1).(-1,1).(-0.5,0.5)等. Feature scaling (数据规范化) 是数据挖掘或机器学习常用到的步骤,这个步骤有时对算法的效率和准确率都会产生巨大的影响. 对精度的影响:很明显,这个步骤的必要性要依赖于数据特征的特性,如果有>=2特征,并且不同特征间的值变化范围差异大,那就很有必要使用Feature scaling.比如说,在信用卡欺诈检测中,如果我们只使用用户的收入作为学习特征,那就没有必要做这个步骤.但

mysql concat函数进行模糊查询

concat() 函数,是用来连接字符串. 精确查询: select * from user where name="zhangsan" 模糊查询: select * from user where name like "%zhang%" 在实际的使用中,条件是作为参数传递进来的. 所以我们使用 concat() 函数 mybatis: select * from user where name like concat("%", #{name},

关于Oracle中的nvl()函数的使用,中医科查询出院病人信息报错

中医科查询出院病人信息报下面的错误 然后看到该界面的sql为 然后在plsql里面运行该代码, 报错 处理方法: 1.确定报错的位置 现在确定出错的位置就是注销掉的那两行代码, 然后 然后这就是报错的原因, 是因为他的入院诊断有两条 我想判断一下,如果是中医病区就取中医的诊断否则取西医的 但是宁哥给了一个更好的解决问题的方法 用NVL函数 在介绍这个之前你必须明白什么是oracle中的空值null 1.NVL函数 NVL函数的格式如下:NVL(expr1,expr2) 含义是:如果oracle第

浅谈数据仓库建设中的数据建模方法

所谓水无定势,兵无常法.不同的行业,有不同行业的特点,因此,从业务角度看,其相应的数据模型是千差万别的.目前业界较为主流的是数据仓库厂商主要是 IBM 和 NCR,这两家公司的除了能够提供较为强大的数据仓库平台之外,也有各自的针对某个行业的数据模型.       例如,在银行业,IBM 有自己的 BDWM(Banking data warehouse model),而 NCR 有自己的 FS-LDM 模型.在电信业,IBM 有 TDWM(Telecom Data warehouse model)

浅谈软件行业中的重复性工作

我本人是软件专业出身,对于软件行业中的重复性工作也是见怪不怪了.然而对于这种重复对于软件行业的发展是一种极大的阻碍,以网上关于软件开发的技术性帖子为例,重复,雷同,抄袭,到处都是.在网上搜索一个关于“android....”的问题,就会出现一大批关于此问题的条目,看似很好解答很多,但点开一看就蒙了,各个论坛,各个用户写的有关“android...”的帖子都相似,甚至完全相同.这是为什么,我想不用明说. 上面所说的就是软件行业中的重复问题,网络资源看似满满的都是宝,打开就发现全都一样,满盆宝剩下一