SQL Tuning 基础概述10

在《SQL Tuning 基础概述05 - Oracle 索引类型及介绍》的1.5小节,提到了几种"索引的常见执行计划":

INDEX FULL SCAN:索引的全扫描,单块读,有序
INDEX RANGE SCAN:索引的范围扫描
INDEX FAST FULL SCAN:索引的快速全扫描,多块读,无序
INDEX FULL SCAN(MIN/MAX):针对MAX(),MIN()函数的查询
INDEX SKIP SCAN:查询条件没有用到组合索引的第一列,而组合索引的第一列重复度较高时,可能用到

本文用简单的测试案例,体会下索引使用这些执行计划的场景:

1.准备测试环境

创建测试表和索引:

conn jingyu/jingyu
drop table test_objects;
create table test_objects as select * from all_objects;
create index idx_test_objects_1 on test_objects(owner, object_name, subobject_name);
create index idx_test_objects_2 on test_objects(object_id);

查看测试表结构:

SQL> desc test_objects;
 Name                                                              Null?    Type
 ----------------------------------------------------------------- -------- --------------------------------------------
 OWNER                                                             NOT NULL VARCHAR2(30)
 OBJECT_NAME                                                       NOT NULL VARCHAR2(30)
 SUBOBJECT_NAME                                                             VARCHAR2(30)
 OBJECT_ID                                                         NOT NULL NUMBER
 DATA_OBJECT_ID                                                             NUMBER
 OBJECT_TYPE                                                                VARCHAR2(19)
 CREATED                                                           NOT NULL DATE
 LAST_DDL_TIME                                                     NOT NULL DATE
 TIMESTAMP                                                                  VARCHAR2(19)
 STATUS                                                                     VARCHAR2(7)
 TEMPORARY                                                                  VARCHAR2(1)
 GENERATED                                                                  VARCHAR2(1)
 SECONDARY                                                                  VARCHAR2(1)
 NAMESPACE                                                         NOT NULL NUMBER
 EDITION_NAME                                                               VARCHAR2(30)

查看测试表上的索引信息:

SQL> select index_name, column_name, column_position from user_ind_columns where table_name = ‘TEST_OBJECTS‘;

INDEX_NAME                     COLUMN_NAME                              COLUMN_POSITION
------------------------------ ---------------------------------------- ---------------
IDX_TEST_OBJECTS_1             OWNER                                                  1
IDX_TEST_OBJECTS_1             OBJECT_NAME                                            2
IDX_TEST_OBJECTS_1             SUBOBJECT_NAME                                         3
IDX_TEST_OBJECTS_2             OBJECT_ID                                              1

分析表并清空测试环境的shared_pool和buffer_cache:

analyze table test_objects compute statistics;
alter system flush shared_pool;
alter system flush buffer_cache;

2.编写SQL语句

根据不同执行计划的场景,编写SQL语句:

--INDEX RANGE SCAN(索引的范围扫描)
SELECT owner, object_name FROM test_objects WHERE owner = ‘SYS‘ AND object_name = ‘DBMS_OUTPUT‘;

--INDEX SKIP SCAN(针对MAX(),MIN()函数的查询)
SELECT owner, object_name FROM test_objects WHERE object_name = ‘DBMS_OUTPUT‘;

--INDEX FAST FULL SCAN(索引的快速全扫描,多块读,无序)
SELECT owner, object_name FROM test_objects;

--INDEX FULL SCAN(索引的全扫描,单块读,有序)
SELECT owner, object_name FROM test_objects order by 1, 2;

--INDEX FULL SCAN (MIN/MAX)(针对MAX(),MIN()函数的查询)
SELECT max(object_id) FROM test_objects;

3.实验环境验证

根据2中的SQL分别在实验环境中验证,没有问题,结果如下:

SQL> set autot trace
--1. INDEX RANGE SCAN
SQL> SELECT owner, object_name FROM test_objects WHERE owner = ‘SYS‘ AND object_name = ‘DBMS_OUTPUT‘;

Execution Plan
----------------------------------------------------------
Plan hash value: 3492129186

---------------------------------------------------------------------------------------
| Id  | Operation        | Name               | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |                    |     1 |    29 |     3   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| IDX_TEST_OBJECTS_1 |     1 |    29 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------------------

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

   1 - access("OWNER"=‘SYS‘ AND "OBJECT_NAME"=‘DBMS_OUTPUT‘)

Statistics
----------------------------------------------------------
         59  recursive calls
          0  db block gets
        104  consistent gets
         17  physical reads
          0  redo size
        676  bytes sent via SQL*Net to client
        519  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          6  sorts (memory)
          0  sorts (disk)
          2  rows processed

--2. INDEX SKIP SCAN
SQL> SELECT owner, object_name FROM test_objects WHERE object_name = ‘DBMS_OUTPUT‘;

Execution Plan
----------------------------------------------------------
Plan hash value: 1228438998

---------------------------------------------------------------------------------------
| Id  | Operation        | Name               | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |                    |     2 |    58 |    27   (0)| 00:00:01 |
|*  1 |  INDEX SKIP SCAN | IDX_TEST_OBJECTS_1 |     2 |    58 |    27   (0)| 00:00:01 |
---------------------------------------------------------------------------------------

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

   1 - access("OBJECT_NAME"=‘DBMS_OUTPUT‘)
       filter("OBJECT_NAME"=‘DBMS_OUTPUT‘)

Statistics
----------------------------------------------------------
          2  recursive calls
          0  db block gets
         32  consistent gets
         23  physical reads
          0  redo size
        684  bytes sent via SQL*Net to client
        519  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          3  rows processed

--3. INDEX FAST FULL SCAN
SQL> SELECT owner, object_name FROM test_objects;

84311 rows selected.

Execution Plan
----------------------------------------------------------
Plan hash value: 2324984732

-------------------------------------------------------------------------------------------
| Id  | Operation            | Name               | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |                    | 84311 |  387K|   138   (0)| 00:00:02 |
|   1 |  INDEX FAST FULL SCAN| IDX_TEST_OBJECTS_1 | 84311 |  387K|   138   (0)| 00:00:02 |
-------------------------------------------------------------------------------------------

Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
       6097  consistent gets
        480  physical reads
          0  redo size
    3509341  bytes sent via SQL*Net to client
      62339  bytes received via SQL*Net from client
       5622  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      84311  rows processed

--4. INDEX FULL SCAN
SQL> SELECT owner, object_name FROM test_objects order by 1, 2;

84311 rows selected.

Execution Plan
----------------------------------------------------------
Plan hash value: 2751381935

---------------------------------------------------------------------------------------
| Id  | Operation        | Name               | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |                    | 84311 |  387K|   505   (1)| 00:00:07 |
|   1 |  INDEX FULL SCAN | IDX_TEST_OBJECTS_1 | 84311 |  387K|   505   (1)| 00:00:07 |
---------------------------------------------------------------------------------------

Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
       6090  consistent gets
          0  physical reads
          0  redo size
    3509341  bytes sent via SQL*Net to client
      62339  bytes received via SQL*Net from client
       5622  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      84311  rows processed

--5. INDEX FULL SCAN (MIN/MAX)
SQL> SELECT max(object_id) FROM test_objects;

Execution Plan
----------------------------------------------------------
Plan hash value: 729623451

-------------------------------------------------------------------------------------------------
| Id  | Operation                  | Name               | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |                    |     1 |     4 |     2   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE            |                    |     1 |     4 |            |          |
|   2 |   INDEX FULL SCAN (MIN/MAX)| IDX_TEST_OBJECTS_2 |     1 |     4 |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------

Statistics
----------------------------------------------------------
          2  recursive calls
          0  db block gets
          5  consistent gets
          2  physical reads
          0  redo size
        534  bytes sent via SQL*Net to client
        519  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed
时间: 2024-12-24 12:35:56

SQL Tuning 基础概述10的相关文章

SQL Tuning 基础概述01 - autotrace的设定

1.autotrace的设定 SQL> set autotrace Usage: SET AUTOT[RACE] {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]] set autot on --打开autotrace,之后执行的sql,会显示sql执行结果.执行计划.统计信息 set autot on exp --会显示sql执行结果.执行计划 set autot on stat --会显示sql执行结果.统计信息 set autot tra

SQL Tuning 基础概述08 - SQL Tuning Advisor

SQL调优顾问 SQL Tuning Advisor的使用案例: 1.构建测试表T SQL> conn zjy/zjy Connected. SQL> create table t as select * from dba_objects; Table created. SQL> select count(*) from t; COUNT(*) ---------- 653500 2.对“select owner, object_id, object_name from t where

SQL Tuning 基础概述05 - Oracle 索引类型及介绍

一.B-Tree索引 三大特点:高度较低.存储列值.结构有序 1.1利用索引特性进行优化 外键上建立索引:不但可以提升查询效率,而且可以有效避免锁的竞争(外键所在表delete记录未提交,主键所在表会被锁住). 统计类查询SQL:count(), avg(), sum(), max(), min() 排序操作:order by字段建立索引 去重操作:distinct UNION/UNION ALL:union all不需要去重,不需要排序 1.2联合索引    应用场景一:SQL查询列很少,建立

SQL Tuning 基础概述03 - 使用sql_trace和10046事件跟踪执行计划

1.使用sql_trace跟踪执行计划 1.1 当前session跟踪: alter session set sql_trace = true; //开始sql_trace alter session set tracefile_identifier = jytrace; //设定trace文件的标识符 alter session set sql_trace = false; //结束sql_trace 1.2 其他session跟踪:(根据其他session的sid, serial#定位,最常

SQL Tuning 基础概述06 - 表的连接方式:Nested Loops Join,Merge Sort Join & Hash Join

nested loops join 嵌套循环 merge sort join 排序合并 hash join 哈希连接 nested loops join(嵌套循环)   驱动表返回几条结果集,被驱动表访问多少次,有驱动顺序,无须排序,无任何限制. 驱动表限制条件有索引,被驱动表连接条件有索引. hints:use_nl() merge sort join(排序合并)   驱动表和被驱动表都是最多访问1次,无驱动顺序,需要排序(SORT_AREA_SIZE),连接条件是<>或like导致无法使用

SQL Tuning 基础概述02 - explain plan的使用

1.explain plan的使用 SQL> explain plan for delete from t_jingyu; Explained. SQL> select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT ----------------------------------------------------------------------------------------------------------------

SQL Tuning 基础概述07 - SQL Joins

N多年之前,刚刚接触SQL的时候,就被多表查询中的各种内连接,外连接,左外连接,右外连接等各式各样的连接弄的晕头转向. 更坑的是书上看到的各种表连接还有两种不同的写法, 比如对于表A,表B的查询 1,内连接两种写法: select * from A, B where A.id = B.id; select * from A join B on A.id = B.id; 2,右外连接写法: select * from A, B where A.id(+) = B.id; select * from

SQL Tuning 基础概述04 - Oracle 表的类型及介绍

Tables A table describes an entity such as employees. You define a table with a table name, such as employees, and set of columns. In general, you give each column a name, a data type, and a width when you create the table. 1.普通堆表(Heap-Organized Tabl

SQL优化(SQL TUNING)之10分钟完毕亿级数据量性能优化(SQL调优)

前几天.一个用户研发QQ找我,例如以下: 自由的海豚. 16:12:01 岛主,我的一条SQL查不出来结果,能帮我看看不? 兰花岛主 16:12:10 多久不出结果? 自由的海豚 16:12:17 多久都没出结果,一直没看到结果过. 兰花岛主 16:12:26 呵呵.好. 兰花岛主 16:12:39 发下sql和运行计划. 自由的海豚 16:12:55 select n.c1, n.c2,n.c3,n.c4,n.c5 from (select  count(t.c1), t.c1, t.c2,t