写一条SQL,使它通过全表扫描方式的效率优于索引访问,分别给出各自的执行计划。...
一、实验说明:
操作系统:redhat 5.4 x86
数据库:oracle 11g R2
该实验通过建立一张规则表和一张不规则表,对这两张表分别使用全表扫描和索引访问,重点在于说明全表扫描的效率也可以优于索引访问。
二、实验具体步骤:
2.1、创建一张规则表jack_test和一张不规则表echo_test。
1 SQL> create table jack_test(x int,y varchar2(2000)); --创建jack_test表 2 3 Table created. 4 5 SQL> begin 6 2 for i in 1..100000 7 3 loop 8 4 insert into jack_test values(i,rpad(dbms_random.random,75,'*')); 9 5 end loop; 10 6 commit; 11 7 end; 12 8 / 13 14 PL/SQL procedure successfully completed. 15 16 SQL> alter table jack_test add constraint jack_pks primary key(x); 17 18 Table altered. 19 20 SQL> create table echo_test nologging --创建echo_test表,并随机插入数据 21 2 as 22 3 select x,y from jack_test 23 4 order by y 24 5 / 25 26 Table created. 27 SQL> alter table echo_test add constraint echo_pk primary key(x); 28 29 Table altered.
2.2、比较对规则表用全表扫描与索引访问:
1 SQL> set timing on; 2 SQL> set linesize 200; 3 SQL> set autotrace traceonly; 4 SQL> select * from jack_test where x between 20000 and 40000; 5 6 20001 rows selected. 7 8 Elapsed: 00:00:00.23 9 10 Execution Plan 11 ---------------------------------------------------------- 12 Plan hash value: 3796984134 13 14 ------------------------------------------------------------------------------- 15 | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 16 ------------------------------------------------------------------------------- 17 | 0 | SELECT STATEMENT | | 28379 | 27M| 342 (1)| 00:00:05 | 18 |* 1 | TABLE ACCESS FULL| JACK_TEST | 28379 | 27M| 342 (1)| 00:00:05 | --这里的Cost消耗比较大,还有Bytes也比较大 19 ------------------------------------------------------------------------------- 20 21 Predicate Information (identified by operation id): 22 --------------------------------------------------- 23 24 1 - filter("X">=20000 AND "X"<=40000) 25 26 Note 27 ----- 28 - dynamic sampling used for this statement (level=2) 29 30 31 Statistics 32 ---------------------------------------------------------- 33 9 recursive calls 34 0 db block gets 35 2576 consistent gets 36 9 physical reads 37 0 redo size 38 1813724 bytes sent via SQL*Net to client 39 15082 bytes received via SQL*Net from client 40 1335 SQL*Net roundtrips to/from client 41 0 sorts (memory) 42 0 sorts (disk) 43 20001 rows processed 44 45 SQL> analyze table jack_test compute statistics; 46 47 Table analyzed. 48 49 Elapsed: 00:00:01.47 50 SQL> select /*+ index(jack_test jack_pks) */ * from jack_test where x between 20000 and 40000; 51 52 20001 rows selected. 53 54 Elapsed: 00:00:00.20 55 56 Execution Plan 57 ---------------------------------------------------------- 58 Plan hash value: 674810340 59 60 ----------------------------------------------------------------------------------------- 61 | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 62 ----------------------------------------------------------------------------------------- 63 | 0 | SELECT STATEMENT | | 20002 | 1543K| 282 (0)| 00:00:04 | 64 | 1 | TABLE ACCESS BY INDEX ROWID| JACK_TEST | 20002 | 1543K| 282 (0)| 00:00:04 | 65 |* 2 | INDEX RANGE SCAN | JACK_PKS | 20002 | | 43 (0)| 00:00:01 | 66 ----------------------------------------------------------------------------------------- 67 68 Predicate Information (identified by operation id): 69 --------------------------------------------------- 70 71 2 - access("X">=20000 AND "X"<=40000) 72 73 74 Statistics 75 ---------------------------------------------------------- 76 1 recursive calls 77 0 db block gets 78 2899 consistent gets 79 0 physical reads 80 0 redo size 81 1893672 bytes sent via SQL*Net to client 82 15082 bytes received via SQL*Net from client 83 1335 SQL*Net roundtrips to/from client 84 0 sorts (memory) 85 0 sorts (disk) 86 20001 rows processed
小结:
对于规则表的查询索引访问效率要高于全表扫描。
2.3、比较不规则表用全表扫描与索引访问:
1 SQL> select /*+ full(echo_test) */ * from echo_test where x between 20000 and 40000; 2 3 20001 rows selected. 4 5 Elapsed: 00:00:00.15 6 7 Execution Plan 8 ---------------------------------------------------------- 9 Plan hash value: 3930265464 10 11 ------------------------------------------------------------------------------- 12 | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 13 ------------------------------------------------------------------------------- 14 | 0 | SELECT STATEMENT | | 21652 | 20M| 333 (1)| 00:00:04 | 15 |* 1 | TABLE ACCESS FULL| ECHO_TEST | 21652 | 20M| 333 (1)| 00:00:04 | 16 ------------------------------------------------------------------------------- 17 18 Predicate Information (identified by operation id): 19 --------------------------------------------------- 20 21 1 - filter("X">=20000 AND "X"<=40000) 22 23 Note 24 ----- 25 - dynamic sampling used for this statement (level=2) 26 27 28 Statistics 29 ---------------------------------------------------------- 30 246 recursive calls 31 0 db block gets 32 2630 consistent gets 33 9 physical reads 34 0 redo size 35 1813724 bytes sent via SQL*Net to client 36 15082 bytes received via SQL*Net from client 37 1335 SQL*Net roundtrips to/from client 38 6 sorts (memory) 39 0 sorts (disk) 40 20001 rows processed 41 42 SQL> select /*+ index(echo_test echo_pk) */ * from echo_test where x between 20000 and 40000; 43 44 20001 rows selected. 45 46 Elapsed: 00:00:00.17 47 48 Execution Plan 49 ---------------------------------------------------------- 50 Plan hash value: 2911547479 51 52 ----------------------------------------------------------------------------------------- 53 | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 54 ----------------------------------------------------------------------------------------- 55 | 0 | SELECT STATEMENT | | 21652 | 20M| 19916 (1)| 00:03:59 | 56 | 1 | TABLE ACCESS BY INDEX ROWID| ECHO_TEST | 21652 | 20M| 19916 (1)| 00:03:59 | --这里Cost消耗比较大。 57 |* 2 | INDEX RANGE SCAN | ECHO_PK | 21652 | | 45 (0)| 00:00:01 | 58 ----------------------------------------------------------------------------------------- 59 60 Predicate Information (identified by operation id): 61 --------------------------------------------------- 62 63 2 - access("X">=20000 AND "X"<=40000) 64 65 Note 66 ----- 67 - dynamic sampling used for this statement (level=2) 68 69 70 Statistics 71 ---------------------------------------------------------- 72 7 recursive calls 73 0 db block gets 74 21445 consistent gets -- 一致读的数量比较多 75 38 physical reads 76 0 redo size 77 1893672 bytes sent via SQL*Net to client 78 15082 bytes received via SQL*Net from client 79 1335 SQL*Net roundtrips to/from client 80 0 sorts (memory) 81 0 sorts (disk) 82 20001 rows processed
小结:
对于不规则表的查询全表扫描的效率要高于索引访问。其中索引访问中consistent gets高达21445之多,而Cost达到了2w左右。
转载于:https://www.cnblogs.com/Richardzhu/archive/2012/12/20/2826061.html
写一条SQL,使它通过全表扫描方式的效率优于索引访问,分别给出各自的执行计划。...相关推荐
- 哪些SQL语句会引起全表扫描
大家都知道,用SQL语句对数据库进行操作时,如果引起全表扫描会对数据库的性能形成影响,下面简单介绍下SQL中哪些情况会引起全表扫描. 1.模糊查询效率很低: 原因:like本身效率就比较低,应该尽量避 ...
- 什么情况导致全表扫描,而不是用索引 收藏
1.不要使用in操作符,这样数据库会进行全表扫描, 推荐方案:在业务密集的SQL当中尽量不采用IN操作符 2.not in 使用not in也不会走索引 推荐方案:用not exists或者(外联 ...
- SQL数据库不用SQL语句能显示全表的内容_阿里巴巴数据库分库分表的实践
在2006年阿里巴巴B2B团队以开源方式研发了Cobar这一关系型数据的分布式处理系统.该系统在很大程度上解决了最初使用Oracle数据库因为存储数据变得越来越大带来的扩展性问题,并且为开发人员提供了 ...
- 范围查找(比如日期范围)下查询出现全表扫描MySQL数据库索引失效
范围查找(比如日期范围)下查询出现全表扫描MySQL数据库索引失效 当下MySQL数据库在多款数据库中脱颖而出,成为使用最广泛的数据库之一,这里我们来看看数据库索引上的一个问题.我们知道在数据量上去以 ...
- MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析...
文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...
- oracle 索引快速全扫描,使用目录快速全扫描(Index FFS)避免全表扫描的若干场景
使用索引快速全扫描(Index FFS)避免全表扫描的若干场景 使用索引快速全扫描(Index FFS)避免全表扫描(FTS) (文档 ID 70135.1) 什么使用使用Index FFS比FTS好 ...
- 索引法则--LIKE以%开头会导致索引失效进而转向全表扫描(使用覆盖索引解决)...
Mysql 系列文章主页 =============== 1 准备数据 1.1 建表 DROP TABLE IF EXISTS staff; CREATE TABLE IF NOT EXISTS st ...
- Mybatis 获取当前序列和下一个序列值 以及在一个方法中写多条SQL 语句
目录 1.Mybatis 获取当前序列和下一个序列值 2.Mybatis 在一个方法中写多条SQL 语句 1.Mybatis 获取当前序列和下一个序列值 #获取当前序列值 select XXX_seq ...
- 【项目经验】如果想在mapper.xml文件中的一个标签中写多条sql语句,则需要在jdbc的配置文件中稍做配置
如果想在mapper.xml文件中的一个标签中写多条sql语句,则需要在jdbc的配置文件中稍做配置: url=jdbc:mysql://127.0.0.1:3306/airipo?useUnicod ...
- 【每日一练:SQL】写一条SQL统计连续三个月金额大于0及每个月的金额
写一条SQL统计连续在三个月金额大于0及展现每个月的金额 需求: 下面是表FEE,字段是month(月份),service_id(电话号码),fee(出帐金额),请参看下面要求: Month ...
最新文章
- 文巾解题 面试题 01.06. 字符串压缩
- 全球及中国水软化盐行业消费规模及市场现状调研分析报告2022-2027年
- 1971 John McCarthy--人工智能之父和LISP语言的发明人(ZT)
- 【排序算法】冒泡排序 选择排序 插入排序 希尔排序(数组)
- 犀牛重建曲面_【教程】Rhino犀牛面包机建模教学(含模型领取)
- rtmp/rtsp/hls公网真正可用的测试地址
- 【双11狂欢背后】微服务注册中心如何承载大型系统的千万级访问?
- 王道 —— 进程的定义、组成、组织方式、特征
- 音视频开发(37)---麦克风阵列语音增强(二)
- Greenplum元数据信息
- MooseFS源代码分析(三)
- java 整数相乘_Java中两个int相乘的结果是怎么算的?
- 如何发布一个BT种子文件
- 码云html页面预览,码云,正式支持 Pages 功能,可以部署静态页面
- 文章标题怎么伪原创?火车头标题伪原创插件
- 2022年电工(技师)考试试题模拟考试平台操作
- BI神器Power Query(5)-- PQ从工作簿导入数据(1/2)
- 精准DNA甲基化/羟甲基化测序(oxBS-seq)|易基因技术推介
- 云计算,社交网络,移动互联网
- XENOGEARS,延续万年的的永恒之爱(引)