当前位置: 首页 > java >正文

@dbsnake-用合适的函数索引来避免看似无法避免的全表扫描

昨天听了@dbsnake的SQL方法论,感觉比第一次要更有感觉,希望对实际工作能有帮助。


昨天讲到一处利用reverse函数建立索引,避免全表扫描的case,颇有感触,拿出来试一下。

SQL> create table rev (id number, name varchar2(5));
Table created.


SQL> select * from rev;
        ID NAME
---------- -----
         1 abc
         2 bc
         3 c


SQL> create index rev_idx0 on rev(name);
Index created.


SQL> set autot on
SQL> select id, name from rev where name like '%bc';
        ID NAME
---------- -----
         1 abc
         2 bc

Execution Plan
----------------------------------------------------------
Plan hash value: 3205185662


--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     2 |    34 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| REV  |     2 |    34 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("NAME" LIKE '%bc')

Note
-----
   - dynamic sampling used for this statement

Statistics
----------------------------------------------------------
          5  recursive calls
          0  db block gets
         16  consistent gets
          0  physical reads
          0  redo size
        633  bytes sent via SQL*Net to client
        492  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          2  rows processed

这里建立了name的B树索引,但由于使用了%bc为条件,所以不会用索引,这里用了全表扫描。


如何能让%bc条件使用索引呢?这里讲到%bc不能用索引的原因是因为索引键值按照索引二进制的顺序排序,%在前就无法精确定位,因此无法使用索引。既然%在后面可以使用索引,那就想办法将%的条件放在后面组织。


SQL> create index rev_idx on rev(reverse(name));
Index created.


SQL> select id, name from rev where reverse(name) like reverse('%bc');
        ID NAME
---------- -----
         2 bc
         1 abc

Execution Plan
----------------------------------------------------------
Plan hash value: 2418054352

---------------------------------------------------------------------------------------
| Id  | Operation                   | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |         |     2 |    34 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| REV     |     2 |    34 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | REV_IDX |     1 |       |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access(REVERSE("NAME") LIKE 'cb%')
       filter(REVERSE("NAME") LIKE 'cb%')

Note
-----
   - dynamic sampling used for this statement

Statistics
----------------------------------------------------------
         28  recursive calls
          0  db block gets
         14  consistent gets
          0  physical reads
          0  redo size
        633  bytes sent via SQL*Net to client
        492  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          2  rows processed

这里用了reverse函数,相当于方向匹配字符串bc,这样就将前面的%放到了后面。从执行计划看cost从3变为2。


注:

这里可以看到无论哪次执行,物理读都是0,原因我觉得就是第一次执行过一个select * from rev;,因为数据量比较小,第一次select之后,记录就从data file缓存到buffer cache,即使根据LRU算法,负载不是太大的DB,很快的时间内这些数据还可能在其中,没被age out,所以再次执行SQL时,就可能物理读是0。


总结:

以上的示例就是@dbsnake讲的“用合适的函数索引来避免看似无法避免的全表扫描“。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7192724/viewspace-773276/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7192724/viewspace-773276/

http://www.xdnf.cn/news/11753.html

相关文章:

  • 世界上最贵的跑车大全
  • 一文读懂 NMEA-0183 协议数据
  • CTA策略
  • flash player安装失败的解决办法
  • 基于51单片机的停车场车位管理系统
  • flv地址解析下载方法归纳总结
  • K8S集群管理平台Rancher(2):安装与使用
  • SiP封装、合封芯片和芯片合封是一种技术吗?都是合封芯片技术?
  • 2012年财富世界500强排行榜
  • EasyBoot使用方法
  • 钻石2 D2 让你的diamond2待机2天,甚至2天以上的方法(绝对不是购买电池)
  • 服务器压力测试_测试服务器性能好坏?3个小技巧轻松知晓
  • hadoop 批流处理的实现_干货!实时大数据平台的设计与实现分享
  • 明日之后服务器崩了最新消息,《明日之后》崩了是什么原因?明日之后崩了怎么登陆服务器...
  • American ,they say....
  • 关于Lucene和ES全文搜索引擎的介绍和使用
  • 【DB笔试面试630】在Oracle中,怎样收集表的统计信息?怎样收集分区表的统计信息?...
  • 勒索病毒WannaCry深度技术分析——详解传播、感染和危害细节
  • 如何用python爬取网页数据,python爬取网页数据步骤
  • ios和鸿蒙哪个好,鸿蒙和iOS的两大区别!看过这两大区别,网友惊叹:鸿蒙太强大了...
  • GPRS手机+笔记本电脑无线上网
  • 一周一本程序员书,宅在家里充电才是硬道理
  • 【java毕业设计】基于javaEE+ssh+jsp+MySqL的大学生就业信息管理系统设计与实现(毕业论文+程序源码)——大学生就业信息管理系统
  • 几个开源日志分析系统介绍
  • 2022年SEO计费系统按积分扣费新版上线(独立源码)
  • “AV终结者/8749”病毒清理办法
  • 计算机专业学生在大学不要错过了这些竞赛!
  • VMware 7.0安装教程
  • 浅谈一下DNF游戏小晶块,这个神秘的道具
  • 网络安全基础技术扫盲篇 — 内网DNS服务器搭建