一、实验说明:

操作系统: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,使它通过全表扫描方式的效率优于索引访问,分别给出各自的执行计划。...相关推荐

  1. 哪些SQL语句会引起全表扫描

    大家都知道,用SQL语句对数据库进行操作时,如果引起全表扫描会对数据库的性能形成影响,下面简单介绍下SQL中哪些情况会引起全表扫描. 1.模糊查询效率很低: 原因:like本身效率就比较低,应该尽量避 ...

  2. 什么情况导致全表扫描,而不是用索引 收藏

    1.不要使用in操作符,这样数据库会进行全表扫描,  推荐方案:在业务密集的SQL当中尽量不采用IN操作符 2.not in 使用not in也不会走索引  推荐方案:用not exists或者(外联 ...

  3. SQL数据库不用SQL语句能显示全表的内容_阿里巴巴数据库分库分表的实践

    在2006年阿里巴巴B2B团队以开源方式研发了Cobar这一关系型数据的分布式处理系统.该系统在很大程度上解决了最初使用Oracle数据库因为存储数据变得越来越大带来的扩展性问题,并且为开发人员提供了 ...

  4. 范围查找(比如日期范围)下查询出现全表扫描MySQL数据库索引失效

    范围查找(比如日期范围)下查询出现全表扫描MySQL数据库索引失效 当下MySQL数据库在多款数据库中脱颖而出,成为使用最广泛的数据库之一,这里我们来看看数据库索引上的一个问题.我们知道在数据量上去以 ...

  5. MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析...

    文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...

  6. oracle 索引快速全扫描,使用目录快速全扫描(Index FFS)避免全表扫描的若干场景

    使用索引快速全扫描(Index FFS)避免全表扫描的若干场景 使用索引快速全扫描(Index FFS)避免全表扫描(FTS) (文档 ID 70135.1) 什么使用使用Index FFS比FTS好 ...

  7. 索引法则--LIKE以%开头会导致索引失效进而转向全表扫描(使用覆盖索引解决)...

    Mysql 系列文章主页 =============== 1 准备数据 1.1 建表 DROP TABLE IF EXISTS staff; CREATE TABLE IF NOT EXISTS st ...

  8. Mybatis 获取当前序列和下一个序列值 以及在一个方法中写多条SQL 语句

    目录 1.Mybatis 获取当前序列和下一个序列值 2.Mybatis 在一个方法中写多条SQL 语句 1.Mybatis 获取当前序列和下一个序列值 #获取当前序列值 select XXX_seq ...

  9. 【项目经验】如果想在mapper.xml文件中的一个标签中写多条sql语句,则需要在jdbc的配置文件中稍做配置

    如果想在mapper.xml文件中的一个标签中写多条sql语句,则需要在jdbc的配置文件中稍做配置: url=jdbc:mysql://127.0.0.1:3306/airipo?useUnicod ...

  10. 【每日一练:SQL】写一条SQL统计连续三个月金额大于0及每个月的金额

    写一条SQL统计连续在三个月金额大于0及展现每个月的金额 需求: 下面是表FEE,字段是month(月份),service_id(电话号码),fee(出帐金额),请参看下面要求:    Month   ...

最新文章

  1. 文巾解题 面试题 01.06. 字符串压缩
  2. 全球及中国水软化盐行业消费规模及市场现状调研分析报告2022-2027年
  3. 1971 John McCarthy--人工智能之父和LISP语言的发明人(ZT)
  4. 【排序算法】冒泡排序 选择排序 插入排序 希尔排序(数组)
  5. 犀牛重建曲面_【教程】Rhino犀牛面包机建模教学(含模型领取)
  6. rtmp/rtsp/hls公网真正可用的测试地址
  7. 【双11狂欢背后】微服务注册中心如何承载大型系统的千万级访问?
  8. 王道 —— 进程的定义、组成、组织方式、特征
  9. 音视频开发(37)---麦克风阵列语音增强(二)
  10. Greenplum元数据信息
  11. MooseFS源代码分析(三)
  12. java 整数相乘_Java中两个int相乘的结果是怎么算的?
  13. 如何发布一个BT种子文件
  14. 码云html页面预览,码云,正式支持 Pages 功能,可以部署静态页面
  15. 文章标题怎么伪原创?火车头标题伪原创插件
  16. 2022年电工(技师)考试试题模拟考试平台操作
  17. BI神器Power Query(5)-- PQ从工作簿导入数据(1/2)
  18. 精准DNA甲基化/羟甲基化测序(oxBS-seq)|易基因技术推介
  19. 云计算,社交网络,移动互联网
  20. XENOGEARS,延续万年的的永恒之爱(引)

热门文章

  1. 4.1线程组(Thread Group)
  2. Matlab矩阵各行各列求和的不同方法
  3. 关于URL编码(转载)
  4. Python进阶(一)Python中的内置函数、内置方法、私有属性和方法详解
  5. Texar安装、Textgenrnn安装
  6. 软件工程期末考试复习(二)
  7. sso(single sign on)介绍
  8. 多线程之间通讯JDK1.5-Lock
  9. C++标准库bitset类型(简单使用方法)
  10. JAVA 多线程 线程间的通讯