设为首页 收藏本站
查看: 882|回复: 0

[经验分享] ORACLE将执行过的SQL语句存放在内存的共享池

[复制链接]

尚未签到

发表于 2018-10-23 11:15:20 | 显示全部楼层 |阅读模式
  Oracle SQL性能优化深入浅出
  ORACLE将执行过的SQL语句存放在内存的共享池(shared buffer pool)中,可以被所有的数据库用户共享。当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同,
  ORACLE就能很快获得已经被解析的语句以及最好的执行路径. 这个功能大大地提高了SQL的执行性能并节省了内存的使用。
  为了不重复解析相同的SQL语句,在第一次解析之后,Oracle将SQL语句存放在内存中。这块位于系统全局区域SGA(systemglobal area)的共享池(shared buffer poo1)中的内存可以被所有的数据库用户共享。因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前执行过的语句完全相同,Oracle就能很快获得已经被解析的语句以及最好的执行方案。Oracle的这个功能大大地提高了SQL的执行性能并节省了内存的使用。
  可惜的是,Oracle只对简单的表提供高速缓冲(cache bufferiIlg),这个功能并不适用于多表连接查询。数据库管理员必须在启动参数文件中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了。当向Oracle提交一个SQL语句时,Oracle会首先在这块内存中查找相同的语句。
  SQL共享的三个条件:
  1,当前被执行的语句和共享池中的语句必须完全相同 (包括大小写、空格、换行等)
  2,两个语句所指的对象必须完全相同 (同义词与表是不同的对象)
  3,两个SQL语句中必须使用相同的名字的绑定变量(bind variables)
  Oracle对两者采取的是一种严格匹配策略,要达成共享。SQL语句必须完全相同(包括空格、换行等)。能够使用共享的语句必须满足三个条件:
  ① 字符级的比较。当前被执行的语句和共享池中的语句必须完全相同。
  例如: SELECT * FROM ATABLE;和下面每一个SQL语句都不同:
  SELECT *from ATABLE
  Select * From Atable;
  ② 语句所指对象必须完全相同。即两条SQL语句操作的数据库对象必须同一。
  ③语句中必须使用相同命名的绑定变量。如:第一组的两个SQL语句是相同的,可以共享;而第二组中两个语句不同,即使在运行时赋予不同的绑定变量以相同的值:
  ● 第一组 select pin,name from people where pin = :blk1.pin;
  select pin,name from people where pin =:blk1.pin;
  ●第二组 select pin,name from people where pin =:blk1.ot_jnd;
  select pin,name from people where pin = :blk1.ov_jnd;


  SQL PARSE与共享SQL语句:
  当一个Oracle实例接收一条sql后
  1、Create a Cursor 创建游标
  2、Parse the Statement 分析语句
  3、Describe Results of a Query 描述查询的结果集
  4、Define Output of a Query 定义查询的输出数据
  5、Bind Any Variables 绑定变量
  6、Parallelize the Statement 并行执行语句
  7、Run the Statement 运行语句
  8、Fetch Rows of a Query 取查询出来的行
  9、Close the Cursor 关闭游标
  下面这个语句每执行一次就需要在SHARE POOL 硬解析一次,一百万用户就是一百万次,消耗CPU和内存,如果业务量大,很可能导致宕库……
  如果绑定变量,则只需要硬解析一次,重复调用即可
  select * from dConMsg
  where contract_no = 32013484095139
  ORACLE 优化器模式:
  Oracle的优化器共有3种模式:RULE (基于规则)、COST(基于成本)、CHOOSE(基于选择)。
  设置缺省的优化器的方法,是在启动参数文件中针对OPTIMIZER_ MODE参数的各种声明进行选择,如RULE、COST、CHOOSE、ALL_ ROWS、FIRST_ ROWS。当然也可以在SQL语句级别或是会话级别对其进行覆盖。
  为了使用基于成本的优化器(CBO,Cost—Based Optimizer),必须经常运行analyze命令,以增加数据库中的对象统计信息(object statistics)的准确性。如果数据库的优化器模式设置为基于选择,那么实际的优化器模式将和是否运行过analyze命令有关。如果数据表已经被analyze过,优化器模式将自动切换成CBO,反之,数据库将采用RULE形式的优化器。在缺省情况下,Oracle采用CHOOSE优化器。为避免那些不必要的全表扫描,必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。
  影响数据库系统性能的要素:
  1,主机CPU,RAM,存储系统;
  2,OS参数配置,ORACLE参数配置;
  3,应用方面:数据库设计及SQL编程的质量
  一个性能优秀的应用系统需要:
  1,良好的硬件配置;
  2,正确合理的数据库及中间件参数配置;
  3,合理的数据库设计;
  4,良好的sql编程;
  5,运行期的性能优化
  SQL Tunning 的重点:
  SQL: insert, update, delete, select(主要关注的是select)
  关注的是:如何用最小的硬件资源消耗、最少的响应时间定位数据位置
  SQL优化的一般性原则:
  1,目标:
  减少服务器资源消耗(主要是磁盘IO);
  2,设计方面:
  尽量依赖oracle的优化器,并为其提供条件;
  合适的索引,索引的双重效应,列的选择性;
  3,编码方面:
  利用索引,避免大表FULL TABLE SCAN;
  合理使用临时表;
  避免写过于复杂的sql,不一定非要一个sql解决问题;
  在不影响业务的前提下减小事务的粒度;
  优化概括:
  ● 创建表的时候。应尽量建立主键,尽量根据实际需要调整数据表的PCTFREE和PCTUSED参数;大数据表删除,用truncate table代替delete。
  ● 合理使用索引,在OLTP应用中一张表的索引不要太多。数据重复量大的列不要建立二叉树索引,可以采用位图索引;组合索引的列顺序尽量与查询条件列顺序保持一致;对于数据操作频繁的表,索引需要定期重建,以减少失效的索引和碎片。
  ● 查询尽量用确定的列名,少用*号。select count(key)from tab where key> 0性能优于select count(*)from tab;
  当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*’ 是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间;
  尽量少嵌套子查询,这种查询会消耗大量的CPU资源;对于有比较多or运算的查询,建议分成多个查询,用union all联结起来;多表查询的查询语句中,选择最有效率的表名顺序。Oracle解析器对表解析从右到左,所以记录少的表放在右边。
  ● 尽量多用commit语句提交事务,可以及时释放资源、解锁、释放日志空间、减少管理花费;在频繁的、性能要求比较高的数据操作中,尽量避免远程访问,如数据库链等,访问频繁的表可以常驻内存:alter table...cache;
  ● 在Oracle中动态执行SQL,尽量用execute方式,不用dbms_sql包。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-625388-1-1.html 上篇帖子: sql 层次化查询(START BY ... CONNECT BY PRIOR) 下篇帖子: Azure中国篇之应用服务--如何连接Windows azure PASS上的sql
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表