当前位置:  数据库>oracle

Oracle SQL语句优化心得

    来源: 互联网  发布时间:2017-06-27

    本文导语: 1.Oracle优化器种类 自从Oracle 10g以来,Oracle就存在了两种优化器--CBO和RBO。 RBO: Rule-Based Optimization 基于规则的优化器 CBO: Cost-Based Optimization 基于代价的优化器 RBO顾名思义,Oracle在系统内部定义了一系列sql语句执行了规则,sql严格...

1.Oracle优化器种类

自从Oracle 10g以来,Oracle就存在了两种优化器--CBO和RBO。

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

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

RBO顾名思义,Oracle在系统内部定义了一系列sql语句执行了规则,sql严格按照规则来生成执行计划,并执行,对表的数据分布和变化不敏感,所以才有了CBO的出现。

CBO是对每个查询所耗费的资源进行量化,从而可以根据这个量化的值选出最佳的执行计划,一个查询所耗费的资源可分为:I/O,CPU,network三部分代价。

I/O一般是将数据库文件中的数据库块读入内存(磁盘读入内存)所耗费的资源

CPU代价是内存中处理数据的代价,在这些数据上进行排序sort,表的join连接操作,这都需要cpu资源的耗费。

network是远程查询数据库表或者执行分布式连接的网络传输代价

注:Oracle中数据库的概念是Oracle数据文件中的最小单位,由多个操作系统块组成。

数据库使用的优化器根据参数optimizer_mode决定,取值如下:

RULE 使用RBO优化器

choose 数据字典有被引用的对象的统计数据,则使用CBO,否则使用RBO

all_rows 以数据吞吐量为主要目标,以便使用最少的资源完成语句

first_rows 以数据响应时间为主要目标,以便快速查询开始的n行数据

first_rows[1|100|1000|n] 让优化器选一个能把响应时间减到最小的执行计划,以迅速产生查询结果的前n行

2.执行计划中的概念

row_sources(行源) 根据where中条件限制后的结果集或者多表链接后的结果集,不单指table

predicate(谓词)

access谓词 这个谓词的条件的值将会影响数据的访问路径(一般针对索引)

fileter谓词 起过滤作用

driving table(驱动表,外表,outer table) 用于嵌套连接和哈希连接

probed table(被探查表,内表,inner table)

access path(访问路径)

full table scans(全表扫描) Oracle顺序读取分配给表的每个数据块,知道表的最高水位线。可以一次性读取多个块,block的数量则由操作系统的I/O最大值和multiblock(db_block_multiblock_read_count)参数共同决定

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

Index Scan(索引扫描/index lookup)

......

sort-mergejoin(排序合并连接)

nested loop(嵌套连接)

hash join(哈希连接)

3.sql语句执行过程

每种类型sql语句都要一下n个阶段:

create a cursor

parse the statement解析语句

判断语法是否正确,权限是否充足,查找数据字典是否符合表,列的定义,锁分析,生成执行计划等,这一步骤比较耗费资源,一般都应该减少解析次数。但是也有下述这种情况:当sql的基表发生的dml语句导致数据分布发生了较大的变化(可能影响的执行计划),如果还采用之前的执行计划,有可能性能会不太好,这时候最好重新进行表分析,重新生成执行计划,所以这个还是要看具体情况决定。

bind any variables

run the statement

close the cursor

若使用了并行功能

parallelize the statement 并行执行语句

若是select语句

describe result of a query 描述查询结果集

define output of a query 定义查询输出

fetch rows of a query 获取查询行

4.sql中标的连接方式

排序合并连接

MERGE

row_source1按照连接列进行排序,row_source2按照连接列进行排序

row_source1,row_source2一起执行合并操作,即将两个row_source按照连接条件连接起来

嵌套循环

一般原则是选择驱动表是较小的row_source

优点:可以快速返回已经连接的行,不必等所有行连接操作处理完才返回数据,可实时响应

hash连接

较小的row_source用来构建hash table的bitmap,第二个row_source被用来hansed,并与第一个row_source生成的hash table匹配,以便进一步连接,比bitmap用来check hash table中是否有匹配的行。

三种连接方式比较:

smj:第一,对于非等值连接效率较高。关联列上有索引更好。对于两个较大的row_source比nl效率高

nl:第一快速响应。外部表较小,内部表上有唯一索引/高效的非唯一索引

hj:hash_area_size参数要合适。只能用于等值连接。


    
 
 

您可能感兴趣的文章:

  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • oracle用什么SQL语句判断表存不存在
  • 请问怎么用jsp语句删除oracle中的一条记录?
  • Oracle中SQL语句连接字符串的符号使用介绍
  • Oracle用什么语句查询字段?
  • 怎么在java中向一个sql语句传参数,就像oracle的proc一样啊?
  • 请问在 Linux 下如何用代码实现连接oracle数据库 并 执行 SQL 语句?
  • Oracle 9i轻松取得建表和索引的DDL语句
  • Oracle的SQL语句中如何处理‘&’符号
  • 关于Oracle中的sql语句的疑问,向大家请教。
  • Oracle Sql语句长度限制问题及解决
  • Oracle9i取得建表和索引的DDL语句
  • Oracle 中文字段进行排序的sql语句
  • oracle数据库添加或删除一列的sql语句
  • Oracle中查询本月星期5的所有日期列表的语句
  • Oracle中备份表的简单sql命令语句
  • oracle中误删除表后恢复语句(FLASHBACK)
  • Oracle判断指定列是否全部为数字的sql语句
  • jsp中在oracle中查询日期类型时sql语句该怎么写啊?
  • Oracle 常用的SQL语句
  • Oracle数据库恢复后心得
  • ORACLE数据库空间整理心得
  • oracle的导入导出注意事项及心得分享
  • Oracle提高sql执行效率的心得建议
  • Oracle 数据库学习入门心得
  • Linux操作系统下安装Oracle数据库体会心得
  • Oracle数据库业务优化心得分享
  • Oracle认证心得:OCP DBA过关
  • Oracle 数据库优化实战心得总结
  • Oracle ebs 11.5.10 for Linux 安装心得
  • Oracle 的入门心得 强烈推荐
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 取数据库前几条数据(sql server、oracle、mysql)的sql写法
  • Oracle发布Oracle SQL Developer 1.2数据库开发工具 帮助用户简化开发工作
  • 与jsp搭配,oracle好?sql server好?
  • Oracle开发工具 Oracle SQL Handler
  • Oracle与SQL Server区别在哪里
  • oracle sql执行过程(流程图)
  • 怎么写一个Shell来执行这样的功能,访问Oracle数据库,然后执行一个SQL脚本,生成一个文件。急!
  • Oracle捕获问题SQL解决CPU过渡消耗
  • Unix系统下oracle sql排版
  • oracle.xml.sql.query.OracleXMLQuery
  • oracle SQL解析步骤小结
  • Oracle中DBMS_SQL解析SQL语句的流程
  • Linux/UNIX下,C++程序通过那些步骤访问Oracle或者Sybase SQL数据库?
  • Oracle SQL使用时注意自己的输入
  • 用oracle pl/sql 从A unix机器,去读取B unix机器上的一个文件,怎么实现?
  • 请问哪里可以找到 package oracle.sql.*
  • shell 执行oracle sql脚本的问题
  • oracle中如何用PL/SQL打开一个指定的库,并在屏幕上列出库中的所有表?
  • Oracle中在pl/sql developer修改表的2种方法
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3