ORACLE-SQL性能优化(一)

容概述

课程主要讨论:

SQL语句执行的过程、ORACLE

优化器

,表之间的关联,如何得到SQL执行计划,如何分析执

行计划等内容,从而由浅到深的方式了解SQL优化的过

程,使大家逐步掌握SQL优化。

目录

  1. 优化基础知识
  2. 性能调整综述
  3. 有效的应用设计
  4. SQL语句的处理过程
  5. Oracle的优化器
  6. Oracle的执行计划

  1. 注意事项

一、优化基础知识

概述

性能管理 性能问题

调整的方法

SQL优化机制 应用的调整

SQL语句的处理过程

共享SQL区域

SQL语句处理的阶段 共享游标

S L编码标准

能管理

    • 尽早开始
    • 设立合适目标
    • 边调整边监控
    • 相关人员进行合作
    • 及时处理过程中发生的意外和变化
    • 80/20定律

SQL 优化衡量指标

随着软件技术的不断发展,系统性能越来越重要。系统性能主要用:系统响应时间和并发性来衡量。造成SQL语句性能不佳大致有两个原因:

      1. 开发人员只关注查询结果的正确性,忽视查询语句的效率。
      2. 开发人员只关注SQL语句本身的效率,对SQL语句执行原理、影响SQL执行效率的主要因素不清楚。

* 前者可以通过深入学习SQL语法及各种SQL调优技巧进行解决。SQL调优是一个系统工程,熟悉SQL语法、掌握各种内嵌函数、分析函数的用法只是编写高效SQL的必要条件。

* 后者从分析SQL语句执行原理入手,指出SQL调优应在优化SQL解析和优化CBO上。

优领域

调优领域:

  1. 应用程序级调优:* SQL语句调优

* 管理变化调优

  1. 实例级调优* 内存

* 数据结构* 实例配置

  1. 操作系统交互* I/O

* SWAP

* Parameters

本课程内容只讲解讨论应用程序级:

Oracle SQL语句调优及管理变化调优

整的方法

  1. 调整业务功能
  2. 调整数据设计
  3. 调整流程设计
  4. 调整SQL语句
  5. 调整物理结构
  6. 调整内存分配
  7. 调整I/O
  8. 调整内存竞争
  9. 调整操作系统

不同调整产生相应性能收益

整的角色

SQL语句优化是提高性能的重要环节

开发人员不能只注重功能的实现,不管性能如何

开发人员不能把Oracle当成一个黑盒子,必须了解其结构、处理SQL和数

据的方法

必需遵守既定的开发规范

SQL语句优化的过程

定位有问题的语句 检查执行计划

检查执行过程中优化器的统计信息

分析相关表的记录数、索引情况

改写SQL语句、使用HINT、调整索引、表分析

有些SQL语句不具备优化的可能,需优化处理方式

达到最佳执行计划

什么是好的SQL语句?

尽量简单,模块化 易读、易维护

节省资源

内存 CPU

扫描的数据块要少 少排序

不造成死锁

SQL共享原理

ORACLE将执行过的SQL语句存放在内存的共享池(shared

buffer pool)中,可以被所有的数据库用户共享。当你执行一个SQL语句(有时被称为一个游标),如果它和之前的执行过的语句完全相同,

ORACLE就能很快获得已经被解析的语句以及最好的 执行路径. 这个功能大大地提高了

SQL的执行性能并节省了内存的使用。

SQL共享原理

为了不重复解析相同的SQL语句,在第一次解析之后,OracleSQL语句存放在内存中。这块位于系统全局区域SGA(systemglobal area)的共享池(shared buffer poo1)中的内存可以被所有的数据库用户共享。因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前执行过的语句完全相同,Oracle就能很快获得已经被解析的语句以及最好的执行方案。Oracle的这个功能大大地提高了SQL的执行性能并节省

了内存的使用。

可惜的是,Oracle只对简单的表提供高速缓冲

(cache bufferiIlg),这个功能并不适用于多表连接查询。数据库管理员必须在启动参数文件中为这个区域设置合适的参数,

当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了。当向Oracle提交一个SQL语句时,Oracle会首先在这块内存中查找相同的语句。

SQL共享的三个条件

当前被执行的语句和共享池中的语句必须完全相同(包括大小写、空格、换行等)

两个语句所指的对象必须完全相同 (同义词与表是不同的对象)

两个SQL语句中必须使用相同的名字的绑定变量

(bind variables)

共享SQL语句

注意:

Oracle对两者采取的是一种严格匹配策略,要达成共享。SQL语句必须完全相同(包括空格、换行等)。能够使用共享的语句必须满足三个

条件:

① 字符级的比较。

当前被执行的语句和共享池中的语句必须完全相同。

例如:  SELECT * FROM ATABLE;和下面每一个SQL语句都不同:

SELECT  *from ATABLE Select  *  From Atable

语句所指对象必须完全相同 即两条SQL语句操作的数据库对象必须同一。③语句中必须使用相同命名的绑定变量。如:第一组的两个SQL语句是相同

的,可以共享;而第二组中两个语句不同,即使在运行时赋予不同的绑定变

量以相同的值:

第一组 select pinname from people where pin =  blk1.pinselect pinname from people where pin =blk1.pin

●第二组 select pinname from people where pin =blk1.ot_jndselect pinname from people where pin = blk1.ov_jnd

SQL语句的处理过程

共享SQL区域

Sql 处理过程

SQL PARSE与共享SQL语句

当一个Oracle实例接收一条sql1Create a Cursor 创建游标

2Parse the Statement 分析语句

3Describe Results of a Query 描述查询的结果集4Define Output of a Query 定义查询的输出数据5Bind Any Variables 绑定变量

6Parallelize the Statement 并行执行语句7Run the Statement 运行语句

8Fetch Rows of a Query 取查询出来的行9Close the Cursor 关闭游标

为什么要bind variables?

字符级的比较:

SELECT * FROM USER_FILES WHERE USER_NO = ‘10001234’;

SELECT * FROM USER_FILES WHERE USER_NO = ‘10004321’;

检查:

select name,executions from v$db_object_cache

where name like 'select * from user_files%'

什么叫做重编译问题

么叫做重编译?

下面这个语句每执行一次就需要在SHARE POOL 硬解析一次,一百万用户就是一百万次,消耗CPU和内存,如果业务量大,很可能导致宕库..

如果绑定变量,则只需要硬解析一次,重复调用即可

select * from dConMsg

where contract_no = 32013484095139

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

秒变学霸的18岁码农

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

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

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

打赏作者

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

抵扣说明:

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

余额充值