`

oracle 查询分析器的使用

 
阅读更多
以下文字均来自网上,自己做个备份,免得需要时找不到。
index unique scan 与index range scan等的区别

存取Oracle当中扫描数据的方法(一)
Oracle 是一个面向Internet计算环境的数据库。它是在数据库领域一直处于领先地位的甲骨文公司的产品。可以说Oracle关系数据库系统是目前世界上流行的关系数据库管理系统,本文将对oracle当中扫描数据的存取方法进行介绍。

1) 全表扫描(Full Table Scans, FTS)

为实现全表扫描,Oracle读取表中所有的行,并检查每一行是否满足语句的WHERE限制条件一个多块读操作可以使一次I/O能读取多块数据块(db_block_multiblock_read_count参数设定),而不是只读取一个数据块,这极大的减少了I/O总次数,提高了系统的吞吐量,所以利用多块读的方法可以十分高效地实现全表扫描,而且只有在全表扫描的情况下才能使用多块读操作。在这种访问模式下,每个数据块只被读一次。

使用FTS的前提条件:在较大的表上不建议使用全表扫描,除非取出数据的比较多,超过总量的5% -- 10%,或你想使用并行查询功能时。

使用全表扫描的例子: 


SQL> explain plan for select * from dual;

Query Plan

SELECT STATEMENT[CHOOSE] Cost=

TABLE ACCESS FULL DUAL



2) 通过ROWID的表存取(Table Access by ROWID或rowid lookup)

行的ROWID指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过ROWID来存取数据可以快速定位到目标数据上,是Oracle存取单行数据的最快方法。

这种存取方法不会用到多块读操作,一次I/O只能读取一个数据块。我们会经常在执行计划中看到该存取方法,如通过索引查询数据。

使用ROWID存取的方法: 


     SQL> explain plan for select * from dept where rowid = 'AAAAyGAADAAAAATAAF';

Query Plan

SELECT STATEMENT [CHOOSE] Cost=1

TABLE ACCESS BY ROWID DEPT [ANALYZED]



3)索引扫描(Index Scan或index lookup)

我们先通过index查找到数据对应的rowid值(对于非唯一索引可能返回多个rowid值),然后根据rowid直接从表中得到具体的数据,这种查找方式称为索引扫描或索引查找(index lookup)。一个rowid唯一的表示一行数据,该行对应的数据块是通过一次i/o得到的,在此情况下该次i/o只会读取一个数据库块。

在索引中,除了存储每个索引的值外,索引还存储具有此值的行对应的ROWID值。索引扫描可以由2步组成:(1) 扫描索引得到对应的rowid值。 (2) 通过找到的rowid从表中读出具体的数据。每步都是单独的一次I/O,但是对于索引,由于经常使用,绝大多数都已经CACHE到内存中,所以第1步的I/O经常是逻辑I/O,即数据可以从内存中得到。但是对于第2步来说,如果表比较大,则其数据不可能全在内存中,所以其I/O很有可能是物理I/O,这是一个机械操作,相对逻辑I/O来说,是极其费时间的。所以如果多大表进行索引扫描,取出的数据如果大于总量的5% -- 10%,使用索引扫描会效率下降很多。如下列所示: 


     SQL> explain plan for select empno, ename from emp where empno=10;

Query Plan

SELECT STATEMENT [CHOOSE] Cost=1

TABLE ACCESS BY ROWID EMP [ANALYZED]

INDEX UNIQUE SCAN EMP_I1



但是如果查询的数据能全在索引中找到,就可以避免进行第2步操作,避免了不必要的I/O,此时即使通过索引扫描取出的数据比较多,效率还是很高的


     SQL> explain plan for select empno from emp where empno=10;-- 只查询empno列值

Query Plan

SELECT STATEMENT [CHOOSE] Cost=1

INDEX UNIQUE SCAN EMP_I1



存取Oracle当中扫描数据的方法(二)



进一步讲,如果sql语句中对索引列进行排序,因为索引已经预先排序好了,所以在执行计划中不需要再对索引列进行排序

      SQL> explain plan for select empno, ename from emp

where empno > 7876 order by empno;

Query Plan

SELECT STATEMENT[CHOOSE] Cost=1

TABLE ACCESS BY ROWID EMP [ANALYZED]

INDEX RANGE SCAN EMP_I1 [ANALYZED]



从这个例子中可以看到:因为索引是已经排序了的,所以将按照索引的顺序查询出符合条件的行,因此避免了进一步排序操作。

根据索引的类型与where限制条件的不同,有4种类型的索引扫描:

索引唯一扫描(index unique scan)

索引范围扫描(index range scan)

索引全扫描(index full scan)

索引快速扫描(index fast full scan)

(1) 索引唯一扫描(index unique scan)

通过唯一索引查找一个数值经常返回单个ROWID。如果存在UNIQUE 或PRIMARY KEY 约束(它保证了语句只存取单行)的话,Oracle经常实现唯一性扫描。

使用唯一性约束的例子:


     SQL> explain plan for

select empno,ename from emp where empno=10;

Query Plan

SELECT STATEMENT [CHOOSE] Cost=1

TABLE ACCESS BY ROWID EMP [ANALYZED]

INDEX UNIQUE SCAN EMP_I1



(2) 索引范围扫描(index range scan)

使用一个索引存取多行数据,在唯一索引上使用索引范围扫描的典型情况下是在谓词(where限制条件)中使用了范围操作符(如>、<、<>、>=、<=、between)

使用索引范围扫描的例子:


      SQL> explain plan for select empno,ename from emp

where empno > 7876 order by empno;

Query Plan

SELECT STATEMENT[CHOOSE] Cost=1

TABLE ACCESS BY ROWID EMP [ANALYZED]

INDEX RANGE SCAN EMP_I1 [ANALYZED]



在非唯一索引上,谓词col = 5可能返回多行数据,所以在非唯一索引上都使用索引范围扫描。

使用index rang scan的3种情况:

(a) 在唯一索引列上使用了range操作符(> < <> >= <= between)

(b) 在组合索引上,只使用部分列进行查询,导致查询出多行

(c) 对非唯一索引列上进行的任何查询。

(3) 索引全扫描(index full scan)

与全表扫描对应,也有相应的全索引扫描。而且此时查询出的数据都必须从索引中可以直接得到。

全索引扫描的例子:


An Index full scan will not perform single block i/o's and so it may prove to be inefficient.

e.g.

Index BE_IX is a concatenated index on big_emp (empno, ename)

SQL> explain plan for select empno, ename from big_emp order by empno,ename;

Query Plan

SELECT STATEMENT[CHOOSE] Cost=26

INDEX FULL SCAN BE_IX [ANALYZED]



(4) 索引快速扫描(index fast full scan)

扫描索引中的所有的数据块,与 index full scan很类似,但是一个显著的区别就是它不对查询出的数据进行排序,即数据不是以排序顺序被返回。在这种存取方法中,可以使用多块读功能,也可以使用并行读入,以便获得最大吞吐量与缩短执行时间。

索引快速扫描的例子:

BE_IX索引是一个多列索引: 


     big_emp (empno,ename)

SQL> explain plan for select empno,ename from big_emp;

Query Plan

SELECT STATEMENT[CHOOSE] Cost=1

INDEX FAST FULL SCAN BE_IX [ANALYZED]



只选择多列索引的第2列:


     SQL> explain plan for select ename from big_emp;

Query Plan

SELECT STATEMENT[CHOOSE] Cost=1

INDEX FAST FULL SCAN BE_IX [ANALYZED]

分享到:
评论

相关推荐

    通用查询分析器(Oracle数据查询)

    "通用查询分析器"就是为此目的设计的一款工具,它能够帮助用户更方便、直观地执行Oracle数据库的SQL查询操作。 通用查询分析器通常具备以下特性: 1. **图形化界面**:与命令行界面相比,通用查询分析器提供了一个...

    万能数据库查询分析器中的事务管理在Oracle中的应用

    万能数据库查询分析器(以下简称“DB 查询分析器”)作为一种强大的数据库工具,不仅具备友好的用户界面和良好的操作性能,而且支持跨数据库平台使用,极大地简化了数据库的维护与管理工作。 #### 二、DB 查询分析...

    一个基于C#实现的Query Analyzer for Oracle查询分析器源码例子

    本资源提供了一个基于C#语言实现的Query Analyzer for Oracle查询分析器的源码实例,旨在帮助开发者更好地理解和优化Oracle数据库的SQL查询。 首先,我们来了解一下`Query Analyzer`的基本概念。查询分析器是数据库...

    Oracle对查询语句的分析过程

    这一步骤是基于CBO(Cost-Based Optimizer,成本基础优化器)进行的,优化器会分析SQL语句并生成最佳执行路径。 接下来,Oracle执行一系列的检查,包括语句的语法合法性,确认SQL格式正确;语义检查,验证涉及的表...

    Oracle 数据查询器

    使用Oracle数据查询器,用户可以进行以下操作: 1. **连接管理**:连接到Oracle数据库服务器,输入必要的连接参数,如服务名、用户名、密码和主机地址。 2. **SQL编辑**:提供一个集成的SQL编辑器,用户可以在这里...

    oracle日志分析工具LogMiner使用.

    LogMiner 的架构主要包括三个部分:日志挖掘器(LogMiner)、日志分析器(Log Analyzer)和日志报告器(Log Reporter)。日志挖掘器负责从日志文件中提取日志记录,日志分析器对日志记录进行分析和处理,而日志报告...

    Oracle数据库性能分析

    - **使用Hint**: 在SQL语句中添加Hint可以指导优化器如何执行查询,这对于调试和性能调优非常有用。 通过以上几个方面的深入理解和实践,你可以更好地掌握Oracle数据库性能分析的基本方法,从而有效地管理和优化...

    《Oracle查询优化改写技巧与案例》PDF版本下载.txt

    根据提供的文件信息,本文将对《Oracle查询优化改写技巧与案例》这一主题进行详细的解析,涵盖Oracle查询优化的基本概念、重要性、改写技巧及其实际应用案例。 ### 一、Oracle查询优化概述 #### 1.1 查询优化定义 ...

    Oracle查询优化改写 技巧与案例.pdf

    针对Oracle数据库的查询优化,本文件提供了丰富的技巧和案例分析,以帮助读者深入理解优化原理,并能在实际工作中学以致用。 首先,要进行有效的查询优化,我们需要了解一些基础概念和原理。优化主要是指对SQL查询...

    ORACLE_SQLDeveloper使用教程

    - 通过分析 SQL 查询计划,可以识别性能瓶颈。 - SQL Developer 提供了工具帮助优化 SQL 语句,提高执行效率。 3. **SQL 脚本管理:** - 可以将常用的 SQL 语句保存为脚本文件,便于重复使用。 - SQL Developer...

    自动生成oracle数据库表分析语句

    通过分析表和索引,Oracle可以更新统计信息,这些信息将被查询优化器用于选择最佳的执行计划。本文将详细介绍如何自动生成表分析SQL语句和索引分析SQL语句。 #### 表分析语句 表分析语句主要用于更新表的统计信息...

    Oracle性能分析工具的使用.docx

    性能规划器(Capacity Planner)是一款强大的工具,集成于Oracle企业治理包(Oracle Enterprise Management Packs)之中,主要用于收集和分析反映系统性能的关键参数。通过该工具,数据库管理员能够指定所需收集的...

    万能数据库查询分析器《DB 查询分析器》 1.0

    经过近四年的潜心研究、设计与开发,再加上三个月左右在DB2、ORACLE、SYBASE、INFORMIX、MYSQL、MS SQL SERVER、ACCESS、FORPRO和PARADOX上的综合测试,数据库万能查询分析器《DB 查询分析器》终于同大家见面了...

    sql查询分析器

    同时,掌握基本的SQL语法和最佳实践,对于高效地使用查询分析器至关重要。例如,理解JOIN、GROUP BY、WHERE子句、子查询、聚合函数以及窗口函数等,可以帮助编写出更高效的查询。此外,了解如何利用索引和优化查询...

    oracle 查询优化改写

    1. 使用EXPLAIN PLAN分析查询执行计划,理解SQL语句的执行流程,找出瓶颈。 2. 避免全表扫描,尽可能利用索引。例如,使用"WHERE"子句筛选数据,避免在"FROM"或"JOIN"中使用不等于(NULL)的条件,这可能导致无法使用...

    oracle查询优化

    13. **使用索引合并**:在有多个索引且无法确定哪个最优时,Oracle的索引合并策略允许同时使用多个索引来加速查询。 14. **避免在索引列上使用函数**:如果在索引列上使用函数,Oracle可能无法使用索引,导致全表...

    把oracle查询结果导出execl,独立完整

    Oracle是一种广泛使用的数据库管理系统,它为企业提供了强大的数据存储和查询功能。在日常工作中,我们经常需要将Oracle数据库中的查询结果导出到Excel,以便进行数据分析、报告制作或者共享给不熟悉数据库系统的...

    『smilycella』Oracle查询器(英文版)

    支持选中查询和f5快捷方式,跟sql查询分析器一样; 4。支持在查询结果中直接修改记录,可以选择启动事务; 5。支持保存和打开查询语句(跟sql查询分析器一样) 6。支持查询结果导出到文本或者xls; 7。有任何...

    oracle内存全面分析

    ADDM是Oracle的自动诊断监视器,定期分析数据库性能,提出内存调整建议。 2. 实时监控 定期检查V$SESSION、V$PGA_MEMORY_ALLOCATIONS等视图,监控内存使用状态,及时发现异常。 总结,Oracle内存全面分析涉及SGA...

Global site tag (gtag.js) - Google Analytics