当前位置:主页 > 查看内容

记一次Oracle数据库实验--索引的常见执行计划

发布时间:2021-06-06 00:00| 位朋友查看

简介:概述 今天主要介绍下Oracle索引的常见执行计划: INDEX FULL SCAN:索引的全扫描,单块读,有序 INDEX RANGE SCAN:索引的范围扫描 INDEX FAST FULL SCAN:索引的快速全扫描,多块读,无序 INDEX FULL SCAN(MIN/MAX):针对MAX(),MIN()函数的查询 INDEX SKIP……

概述

今天主要介绍下Oracle索引的常见执行计划:

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

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

Oracle

1. 准备测试环境

创建测试表和索引:

  1. drop table test_objects; 
  2. create table test_objects as select * from all_objects; 
  3. create index idx_test_objects_1 on test_objects(owner, object_name, subobject_name); 
  4. create index idx_test_objects_2 on test_objects(object_id); 
  5. desc test_objects; 

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

  1. select index_name, column_name, column_position from user_ind_columns where table_name = 'TEST_OBJECTS'

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

  1. analyze table test_objects compute statistics; 
  2. alter system flush shared_pool; 
  3. alter system flush buffer_cache; 

记一次Oracle数据库实验--索引的常见执行计划

记一次Oracle数据库实验--索引的常见执行计划

2. 准备SQL语句

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

  1. --INDEX RANGE SCAN(索引的范围扫描) 
  2. SELECT owner, object_name FROM test_objects WHERE owner = 'SYS' AND object_name = 'DBMS_OUTPUT'
  3.  
  4. --INDEX SKIP SCAN(针对MAX(),MIN()函数的查询) 
  5. SELECT owner, object_name FROM test_objects WHERE object_name = 'DBMS_OUTPUT'
  6.  
  7. --INDEX FAST FULL SCAN(索引的快速全扫描,多块读,无序) 
  8. SELECT owner, object_name FROM test_objects; 
  9.  
  10. --INDEX FULL SCAN(索引的全扫描,单块读,有序) 
  11. SELECT owner, object_name FROM test_objects order by 1, 2; 
  12.  
  13. --INDEX FULL SCAN (MIN/MAX)(针对MAX(),MIN()函数的查询) 
  14. SELECT max(object_id) FROM test_objects; 

3. 实验论证

结果如下:

(1) INDEX RANGE SCAN

  1. set autotrace traceonly 
  2. SELECT owner, object_name FROM test_objects WHERE owner = 'SYS' AND object_name = 'DBMS_OUTPUT'

记一次Oracle数据库实验--索引的常见执行计划

(2) INDEX SKIP SCAN

  1. SELECT owner, object_name FROM test_objects WHERE object_name = 'DBMS_OUTPUT'

记一次Oracle数据库实验--索引的常见执行计划

(3) INDEX FAST FULL SCAN

  1. SELECT owner, object_name FROM test_objects; 

记一次Oracle数据库实验--索引的常见执行计划

(4) INDEX FULL SCAN

  1. SELECT owner, object_name FROM test_objects order by 1, 2;  

记一次Oracle数据库实验--索引的常见执行计划

(5) INDEX FULL SCAN (MIN/MAX)

  1. SELECT max(object_id) FROM test_objects;  

记一次Oracle数据库实验--索引的常见执行计划


本文转载自网络,原文链接:https://www.toutiao.com/i6762884286803608072/
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐