oracle 索引概念、索引相关、sql查询执行计划

Oracle SQL执行计划与优化 目录 系统函数Userenv00、准备工作作业1ROWID、ROWNUM分析Oracle索引扫描四大类DML语句-MERGEDML语句-CALLEXPLAIN PLAN总结oracle table-lock的5种模式SQL优化器如何进行评估优化执行计划稳定性深入研究Oracle查询优化4大方面的主要途径SQL优化例子 阅读详情

一.索引

1.1 索引概念

  索引作为表相关的可选结构,用于提高sql语句执行性能,减少磁盘IO;索引在逻辑上和物理上都独立于表的数据;使用create index语句创建索引;oracle自动维护索引;

1.2 索引分类

索引分为:B树索引、位图索引

B树索引分为:唯一索引、组合索引、反向键索引、基于函数的索引

1.3 位图索引(企业版oracle):

  位图索引适合创建在低基数列(如 性别 仅有 男 女2个属性)上,用一个索引键条目存储指向多行的指针;
  位图索引不直接存储rowid,而存储字节列到rowid的映射;
  如果索引列被经常更新的话,不适合建立位图索引;
  位图索引适合于数据仓库中,不适合OLTP中

1.4 B树索引

在这里插入图片描述
  B树索引是一个二叉树,通过根节点块、分支节点块确定叶子节点块,最后叶子节点块包含索引列和指向表中每个匹配行的rowid值

(1) 唯一索引

  唯一索引确保在定义索引的列中没有重复值;oracle自动在表的主键上创建唯一索引;

创建表:

create table  stu1 (sid number,sname varchar2(20),sage number,male varchar2(2));

在表上创建唯一索引

create unique index s1_index on stu1(SID);

唯一索引可重复插入空值,不违反唯一约束

insert into stu1 values (null,'mk',20,'1');

在这里插入图片描述

(2) 组合索引

  组合索引是在表中多个列上创建的索引;索引上列的顺序是任意的;如果sql查询中where子句中引用了组合索引的所有列或大多数列,则可以提升检索速度;

(3) 反向键索引

  根据实际情况,反转索引列键值的每个字节;通常建立在值是连续增长的列上,使数据均匀地分布在整个索引上;

create index rev_stu1_index on stu1(sid) reverse ;
(4) 函数索引

  基于一个或多个列上的函数或者表达式创建索引;表达式中不能出现聚合函数;不能在lob类型的列上创建;
创建时必须有QUERY REWRITE权限;

create index index3 on stu1(upper(sname));

在这里插入图片描述

1.5 和分区相关的索引(可将索引存储在不同分区中)

和分区相关的索引有三种类型:

(1) 局部分区索引:

  在分区表上创建的索引,在每个表分区上创建独立的索引,索引的分区范围和表一致;

create table employee1 (code number,name varchar2(10)) partition by range (code)(
    partition p1 values less than (1000),
    partition p1 values less than (2000),
    partition p1 values less than (maxvalue )
                                                                                );

create index ind_emp on employee1(code) local ;

select  u.INDEX_NAME,u.TABLE_NAME,u.PARTITIONED from USER_INDEXES u;

select * from USER_IND_PARTITIONS;
(2)全局分区索引:

  在分区表和非分区表上创建的索引,索引单独指向分区的范围,与表的分区范围或者是否分区无关;

create table employee1 (code number,name varchar2(10)) partition by range (code)(
    partition p1 values less than (1000),
    partition p1 values less than (2000),
    partition p1 values less than (maxvalue )
                                                                                );

create index ind_emp on employee1(code) global partition by range (code)(partition p1 values less than (1500),
 partition p1 values less than (maxvalue )) ;

select  u.INDEX_NAME,u.TABLE_NAME,u.PARTITIONED from USER_INDEXES u;
(3)全局非分区索引:

  在分区表上创建的全局普通索引,索引没有被分区

create table employee1 (code number,name varchar2(10)) partition by range (code)(
    partition p1 values less than (1000),
    partition p1 values less than (2000),
    partition p1 values less than (maxvalue )
                                                                                );

create index ind_emp on employee1(code) global ;

二.索引操作

2.1 创建标准索引:

create index emp_ind_1 on emp(last_name);

2.2 查看表中的索引:

select * from user_indexes ui where ui.TABLE_NAME='EMP';

在这里插入图片描述

2.3 查看索引信息:

select * from user_ind_columns uic where uic.INDEX_NAME='EMP_IND_1';

在这里插入图片描述

2.4 分析索引是否存在索引碎片:

  当一个table经常进行DML操作时,它的索引会存在许多block空间的浪费,这是因为index block中的记录只有在全部表示为不可用时, block 才能被加入到freelist中去被重新利用,若存在索引碎片,表查询变慢。
通过 analyze index <index名> validate structure分析索引的数据块是否有坏块
然后查看index_stats表中的pct_used列的值,如果pct_used的值过低,说明在索引中存在碎片,需要重建索引

测试:

create table student (sname varchar2(8));

begin
    for i in 1..13000000 loop
        insert into student values (ltrim(to_char(i,'00000009')));
        if mod(i,100)=0 then
            commit;
        end if;
        end loop;
end;
analyze index STU_IND validate  structure ;
select s.NAME,s.PCT_USED from INDEX_STATS s where s.NAME='STU_IND';

在这里插入图片描述

pct_used一般为90%, 默认会保留10%的空闲。

delete student where ROWNUM<3000000;

2.5 重建索引:

alter index <索引名> rebuild [ONLINE] [NOLOGGING] [COMPUTE STATISTICS]

online: 使得在重建索引过程中,用户可对原来的索引进行修改;

nologging: 表示在重建过程中产生最少的重做条目redo entry;

compute statistics : 表示在重建过程中生成了oracle优化器所需要的统计信息,
避免了索引重建之后再进行analyze或者dbms_stats来收集统计信息;

2.6 删除索引:

drop index index3;

三.执行计划(explain plan)

3.1 执行计划概念

一条查询语句在oracle中的执行过程或访问路径的描述。

3.2 如何查看执行计划

explain plan for sql语句;

或者

通过第三方工具,如plsql developer(f5查看执行计划)

在这里插入图片描述

3.3 表访问方式

(1).全表扫描 TABLE ACCESS FULL

  oracle顺序读取表中所有的行,并逐条匹配WHERE限定条件。采用多块读的方式进行全表扫描,可以有效提高系统的吞吐量,降低I/O次数。即使创建索引,oracle也会根据CBO的计算结果,决定是否使用索引。

注:
  只有全表扫描时才可以使用多块读。该方式下,单个数据块仅访问一次。
  对于数据量较大的表,不建议使用全表扫描进行访问。
  当访问表中的数据量超过数据总量的5%—10%时,通常oracle会采用全表扫描的方式进行访问。
  并行查询可能会导致优化器选择全表扫描的方式。

(2). 索引扫描 TABLE ACCESS BY ROWID

  ORACLE在访问目标表数据时,直接通过数据所在的ROWID(与ORACLE中数据块里的行记录一一对应)去定位并访问相关数据。

index unique scan --索引唯一扫描

  针对唯一性索引(UNIQUE INDEX)的扫描,它仅仅适用于WHERE条件里是等值查询的目标SQL。因为扫描对象是唯一性索引,所以结果至多只会返回一条记录。

index range scan --索引范围扫描

  当扫描的对象是唯一性索引时,此时目标SQL的WHERE条件一定是范围查询(between,<,>等);当扫描对象是非唯一性索引时,对目标SQL的WHERE条件没有限制(可以是等值查询,也可以是范围查询)。索引范围扫描的结果可能会返回多条记录。

index full scan --索引全扫描

  索引全扫描的执行结果也是有序的,并且是按照该索引键值列来排序,这也意味着走索引全扫描能够既达到排序的效果,又同时避免了对该索引的索引键值列真正排序操作。简单来说就是通过索引全扫描查出来的数据都是排序好的。
  ORACLE能走索引全扫描的前提条件是目标索引至少有一个索引键值列的属性是NOT NULL,如果空还走索引全扫描的话会遗漏目标表中那些索引键值列均为NULL的记录。

index fast full scan --索引快速全局扫描

  索引快速全扫描只适用于CBO;
  索引快速全扫描可以使用多块读,也可以并行执行。
  索引快速全扫描执行结果不一定有序的。
  这是因为索引快速扫描时oracle是根据索引行在磁盘上的物理存储顺序来扫描,而不是根据索引行的逻辑顺序来扫描的,所以扫描结果才不一定有序。(对于单个索引叶子块中索引而言,其物理存储顺序与逻辑存储顺序一直,但对于物理存储位置相邻的所有叶子块而言,块与块之间索引行的物理存储顺序不一定在逻辑上有序)

index skip scan --索引跳跃扫描

  ORACLE中的索引跳跃式扫描仅仅适用于那些目标索引前导列的DISTINCT值数量较少,后续非前导列的可选择性又非常好的情形,所以索引跳跃式扫描的执行效率一定会随着目标索引前导列的DISTINCT值数量递增而递减。

注:
oracle优化器(Optimizer)

  Oracle 数据库中优化器(Optimizer)是SQL分析和执行的优化工具,它负责指定SQL的执行计划,也就是它负责保证SQL执行的效率最高。
  比如优化器决定Oracle 以什么样的方式来访问数据,是全表扫描(Full Table Scan),索引范围扫描(Index Range Scan)还是全索引快速扫描(INDEX Fast Full Scan:INDEX_FFS);
  对于表关联查询,它负责确定表之间以一种什么方式来关联,比如HASH_JOHN还是NESTED LOOPS 或者MERGE JOIN。
  这些因素直接决定SQL的执行效率,所以优化器是SQL 执行的核心,它做出的执行计划好坏,直接决定着SQL的执行效率。

      Oracle 的优化器有两种:

               RBO(Rule-Based Optimization): 基于规则的优化器

               CBO(Cost-Based Optimization): 基于代价的优化器

从Oracle 10g开始,RBO 已经被弃用,使用CBO优化器

Oracle执行计划 执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述。即就是对一个查询任务,做出一份怎样去完成任务的详细方案。如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的每一步执行是否存在问题。看懂执行计划也就成了SQL优化的先决条件。通过执行计划定位性能问题,定位后就通过建立索引、修改sql等解决问题。 阅读详情

相关推荐

Windows下用Anaconda安装d2l库避坑指南(附PermissionError解决方案)

本文详细介绍了在Windows系统下使用Anaconda安装d2l库的完整指南,特别针对常见的PermissionError问题提供了多种解决方案。从环境准备到库安装,再到VSCode配置和数据路径处理,帮助读者顺利搭建深度学习环境并运行《动手学深度学习》的代码示例。

3a9bq4r8t2y的博客 224

查看oracle sql是否使用索引

【代码】查看oracle sql是否使用索引。

weixin_43292547的博客 2799

AGV路径规划实战:如何用Python+ROS实现激光SLAM导航(附避障代码)

本文提供了一份基于Python和ROS实现AGV激光SLAM导航的实战指南。内容涵盖从Docker环境搭建、激光雷达数据处理、Gmapping建图,到Move_Base全局/局部路径规划与TEB局部规划器配置的全流程。重点解析了如何通过参数调优实现稳定导航,并附带了紧急避障代码,帮助开发者快速构建具备自主路径规划与实时避障能力的AGV系统。

pepsi的博客 1233

复合索引和多个单列索引的效率性能比较

原文来自:http://www.hongchawenda.com/article/3712 结论:查询条件中stcd或者tm是单独作为where条件,如果使用了stcd+tm的多列索引,效率降低。如果stcd和tm是作为联合where条件,建立stcd和tm的单列索引,效率明显低于使用stcd+tm的多列索引。 a.当一个sql语句有站点分组跟时间查询嵌套使用时,推荐将stcd和tm分开建立单列索引。列如: select t1.EQP_ID ,max(MEASURE_TIME) maxtm fro.

ly273329124的博客 1631

PyMySQLSaver实战:构建高可靠性的LangGraph状态管理

本文详细介绍了如何使用PyMySQLSaver构建高可靠性的LangGraph状态管理系统。通过检查点机制和MySQL持久化技术,开发者可以确保AI应用在崩溃后从最近状态恢复,支持长时间运行任务和多轮交互。文章包含核心架构解析、生产环境部署指南及实战案例,帮助开发者掌握状态管理的核心技术。

weixin_29310605的博客 494

Autosar诊断实战系列07-Dcm之0x19 06扩展数据配置及工程问题讨论

19 06扩展数据如何配置?如果某DTC没有出现过故障扩展数据该如何响应?

initiallizer的博客 1703

ORACLE高级课程-怎样选择索引

一、怎样选择索引(8建议) 1.由于唯一索引扫描效率最高,因此能使用唯一索引,尽量使用唯一索引; 2.对于取值基数较少的字段,如性别、状态、Check项,尽量使用位图索引; 3.由于NULL值在索引中没有定义,因此建议尽量不要在允许NULL值的列上建立索引,虽然Oracle宣称在允许NULL值的列上位图索引,也是有效的,但我们依然强烈建议可以将null指定为一个默认的值后再建立索引; 4.

寒江的专栏 1674

基于Solidworks的三维光路结构示意图绘制实例演示-技术细节

基于Solidworks的三维光路结构示意图绘制实例演示-技术细节

简单光学 1万+

oracle 索引多了,多个索引的时候,如何选择用哪个索引的算法是?

看看我这个问题吧,Oracle 9.2.0.6,默认的索引选择是如何计算的?在一个表上有多个索引,而在查询的时候,使用了各个索引的主索引字段,那么这个时候Oracle是如何计算到底用哪个索引呢?下面是我测试的过程,有了解的同志请谈谈![php]SQL> create table toms_test as select * from dba_objects;表已创建。SQL> creat...

weixin_39805883的博客 1220

人工智能训练师三级·模型生命周期真题40题|训练→评估→调优全链路通关

本文为人工智能训练师三级考试真题解析系列第2篇,聚焦模型生命周期全链路(训练→评估→调优)。内容包含40道精选真题,覆盖数据划分、模型训练、评估指标、超参数调优4个核心阶段。重点考察:1)数据集的合理划分方法(留出法、交叉验证);2)模型训练的基本原理;3)关键评估指标(准确率、召回率、F1等)的应用场景;4)超参数调优技术(网格搜索、随机搜索等)。通过真题解析帮助考生系统掌握模型生命周期的闭环迭代方法论,提升从数据准备到模型优化的全流程实践能力。适合备考人工智能训练师三级认证的考生学习参考。

白话机器学习 88

智能 Agent 跨模态决策机制实战:多源数据融合与感知驱动行为策略设计

随着智能 Agent 应用从结构化文本处理拓展至图像识别、语音交互、传感器响应等多模态环境,其决策机制也面临从单模态语言理解向“多源感知驱动行为选择”的系统跃迁。本文聚焦跨模态输入下的 Agent 决策体系,系统性解析多源数据建模、感知融合方式、模态对齐机制、输入权重控制策略与策略引擎适配路径,进一步结合多模态提示构建、模态感知异常检测、模态优先级路由调度等工程问题进行实战拆解。通过企业级智能客服、制造车间控制、智慧医疗助手等典型案例,本文提供面向真实场景的跨模态 Agent 架构与多输入决策融合方案。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1351

oracle 索引问题梳理

索引基础知识 索引概念 索引是为了加快数据的查找而创建的可选数据库对象 索引是建立在表的一列或多列上且进行排序的一种结构 通过指针快速定位数据行的方法,减少CPU和磁盘的I/O 索引是由Oracle自动使用和维护的,数据更新会自动传播到所有相关的索引 索引存在双面性,表面存在过多的索引会影响到DML语句的性能 索引类型 唯一索引 保证在定义索引的列中没有重复值 Oracle自动在表的主键列上创建唯一索引 唯一索引对应的字段上可以插入null值 语法: create unique index idx

忙碌的菠萝 4368

华为面试手撕真题【求1-n的最小公倍数】

求1-n的最小公倍数

MISAYAONE的博客 2万+

简单介绍oracle执行计划,Oracle执行计划详解

转自:http://blog.chinaunix.net/u3/107265/showart_2192657.html简介:本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容。并有总结和概述,便于理解与记忆!+++目录---一.相关的概念Rowid的概念Recursive Sql概念Predicate(谓词)DRiving Table(驱动表)Probed T...

weixin_28818873的博客 2621

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Oracle执行计划详解

[code="sql"] 简介: 本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容。 并有总结和概述,便于理解与记忆! +++ 目录 --- 一.相关的概念 Rowid的概念 Recursive Sql概念 Predicate(谓词) DRiving Table(驱动表) ...

SouthKing 109

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【转】Oracle执行计划详解

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33964094的博客 95

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

oracle执行计划详解

&lt;span style="font-size:14px;"&gt;简介: 本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容。 并有总结和概述,便于理解与记忆!+++目录--- 一.相关的概念 Rowid的概念 Recursive Sql概念 Predic...

yimenglin的博客 321

Oracle优化SQL基础

简介: 本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容。 并有总结和概述,便于理解与记忆!+++目录--- 一.相关的概念 Rowid的概念 Recursive Sql概念 Predicate(谓词) DRiving Table(驱动表) Probed Table(被探查表) 组合...

weixin_34128534的博客 84

Oracle执行计划 explain plan 详解

Oracle执行计划详解 --- 本人 作者:TTT BLOG 本文地址:http://blog.chinaunix.net/u3/107265/showart_2192657.html --- 简介:     本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容。     并有总结和概述,便于理解与记忆!

caiyongji 4003

Oracle SQL优化 总结

文章转自:http://blog.youkuaiyun.com/tianlesoftware/article/details/7008801 SQL 的优化主要涉及几个方面: (1)    相关的统计信息缺失或者不准确 (2)    索引问题 (3)    SQL 的本身的效率问题,比如使用绑定变量,批量DML 采用bulk等,这个就考验写SQL的基本功了,这一点也是最主要的一点。

you are my SunShine 714

Oracle查询执行计划

执行计划(Execution Plan)也叫查询计划(Query Plan),它是数据库执行SQL语句的具体步骤和过程。SQL查询语句的执行计划主要包括: ● 访问表的方式。数据库通过索引或全表扫描等方式访问表中的数据。 ● 多表连接的方式。数据库使用什么连接算法实现表的连接,包括多个表的先后访问顺序。 ● 分组聚合以及排序等操作的实现方式。 虽然不同数据库对于SQL查询的执行过程采用了不同的实现方式,但是一个查询语句大致需要经过分析器、优化器以及执行器的处理并返回最终结果,同时还可能利用各种缓存来

每天学习一点点 4万+

Oracle SQL调优系列之看懂执行计划explain

文章目录 1、文章写作前言简介 2、什么是执行计划? 3、怎么查看执行计划? 4、查看真实执行计划 5、看懂Oracle执行计划  5.1 查看explain  5.2 explain执行顺序  5.3 访问数据的方法   5.3.1 全表扫描(TABLE ACCESS FULL)   5.3.2 ROWID扫描(TABLE ACCESS BY ROWID)   5.3.3 索引唯一扫描(INDEX UNIQUE SCAN)   5.3.4 索引范围扫描(INDEX RANGE SCAN)   5.3.5

Ruishine的博客 8103

优化SQL查询性能:索引、分区和执行计划解析查看

索引,分区,查看执行计划解析

m0_65776770的博客 1620
上一篇: oracle11g 联机重做日志、归档日志、日志文件组以及日志文件操作
下一篇: oracle 物理和逻辑结构、SGA和PGA的作用和构成以及自动管理、默认的表空间的结构的特点
但行益事莫问前程
但行益事莫问前程 新星创作者: 数据库技术领域 新星创作者: 数据库技术领域
博客等级 码龄7年 8490粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

但行益事莫问前程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值