Oracle优化配置指南(3.2.3)-共享池
2019-03-28 10:51|来源: 道长A
共享池是对SQL,PL/SQL程序进行语法分析,编译,执行的内存区域。
它包含三个部分:
?库缓冲区(Library Cache)包含SQL,PL/SQL语句的分析码,执行计划;
?数据字典缓冲区(Data Dictionary Cache)表,列定义,权限;
?用户全局区(Usr Global Area)用户MTS会话信息。
这三个部分都不可单独定义大小,必须通过共享池间接定义。
你可能会问,为什么要缓存SQL语句呢?不缓存又能怎么样呢?要想搞清楚这个问题,我们要先了解一个SQL在Oracle里的执行过程。
在Oracle里执行一个SQL语句,一般都要经过下面几个步骤:
?Create a Cursor创建游标;
?Parse the Statement解析语句;
?Bind Any Variables绑定变量;
?Run the Statement运行语句;
?Close the Cursor关闭游标;
如果是一个查询SQL,则还要经过下面的步骤:
?Describe Results of a Query描述查询的结果集;
?Define Output of a Query定义查询的输出数据;
?Fetch Rows of a Query获取查询出来的行。
3.2.3.2SQL解析过程
从上面的步骤可以看出,每执行一个SQL,都需要对它进行解析(Parse),而一个解析过程,需要完成下面的工作:
?语法检查,验证它是否是合法的语句,有没有语法错误;
?语义检查,实现数据字典的查找,以验证是否符合表和列的定义,类型是否正确;
?(如果是CBO优化模式,关于CBO,请看后面Oracle的优化器一章)收集参考对象的统计;
?在所要求的对象上获取语法分析锁,使得在语句的语法分析过程中不改变这些对象的定义;
?检查用户的权限是否足够;
?从许多可能的执行路径中选择此语句最佳的执行计划;
?将它装入共享SQL区;
?生成语句的编译版本(P-CODE)。
解析是一个昂贵的操作,因为解析过程中需要消耗许多资源,而且费时,正因为如此,Oracle创造了共享池的概念,共享池会自动将解析过的SQL缓存起来,以后碰到相同的SQL,就不用再解析了,这样可以大大提高SQL的执行速度。
3.2.3.3缓存SQL的原理
ORACLE执行SQL语句时,先将SQL语句的字串通过一个hash算法得出一个hash值,然后检查共享池中是否已存在这个哈希值,若有就用已缓存的执行计划来执行这个语句(即缓存命中,后面我们会提到共享池的命中率,就是这个概念),若没有(即缓存缺失)则需进行解析。
由于Oracle是通过SQL字符的hash值来判断是否为相同的SQL语句,因此,如果你的SQL有一点小小的变换,在Oracle看来,就是另外一个SQL了,会对它进行重新解析。
例如:
selectid,namefrommemberswhereid=1403
selectid,nameFrommemberswhereid=1403
selectname,idfrommemberswhereid=1403
这三条SQL在Oracle看来就是三条不同的SQL。
在大部分时候,sql语句里有一些经常会变化的值。例如:
selectid,namefrommemberswhereid=1207
selectid,namefrommemberswhereid=1208
selectid,namefrommemberswhereid=1209
前面说过了,这样的SQL其实是三条不同的SQL,因为它们的字符明显不一样。那我们该怎么样才能让它们成为同一条SQL呢?可以通过绑定变量来实现。
下面是一条含绑定变量的
相关问答
vi /etc/samba/smb.conf 找到 workgroup = MYGROUP 改为你的工作组,不该也没关系。找到 security = XXX 吧后面的XXX 改为 share 使用SHARE就不需要用户密码就可以访问翻到最后,建立一下内容[myshare] #共享名comment = XXXX #注释 path = /share #共享的路径 public = yes writable = yes保存推出后,services smb restart然后再WIN客户端输入\\LINU
...
做索引和合理地建表就是优化的其中之一了~ 合理使用索引 索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引的使用要恰到好处,其使用原则如下: ●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。 ●在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。 ●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的
...
参加过CUUG的Oracle性能优化网络公开课,网上应该有录制的视频,讲得不错。 网上也有很多oracle性能优化的技术文章啊,发不了链接,你百度一下oracle网络公开课就有了!
根据我的猜想,这个主要有两可以从以下几个个方面出来 1、检查webservice与数据库之间是不是会有丢包的现象,优化webservice的数据库链接 2、查看数据库的数据量以及读写(i/o)情况,根据情况添加相应的索引或者采取一定的表的读写优化 3、添加数据库的pga,因为pga主要是管理数据的链接的。尽量减少不需要的数据库的排序和分组
不需要了,如果在spring或者hibernate的配置文件里配置了,就不需要配置tomcat数据库连接池,并且在tomcat配置文件里配置连接池维护起来既麻烦性能又不好
修改配置文件 ThinkPHP\Conf\convention.php {XT:} {/XT}可根据个人喜好自定义 修改1: // 布局设置 'TMPL_ENGINE_TYPE' => 'Smarty', // 默认模板引擎 以下设置仅对使用Think模板引擎有效 'TMPL_CACHFILE_SUFFIX' => '.html', // 默认模板缓存后缀 'TMPL_DENY_FUNC_LIST' => 'echo,exit', // 模板引擎禁用函数 'TMPL_DENY_PHP' => fa
...
基本相同,都遵循SQL语言的语法规则。在SQL脚本上两者最大的区别是函数不一样和个别关键字不一样。比如Oracle里没有limit关键字,所以Oracle实现分页比MySQL麻烦。
是什么让你认为共享池没有被刷新? 我怀疑你混淆了共享池和会话统计信息? 会话统计数据统计了会话的不同资源消耗情况。 刷新共享池会影响会话消耗的资源数量(因为它需要解析语句),但这显然不会重置资源消耗计数器。 我建议您重新审视分配的读数,其中详细说明了这些内容。 最好的祝福 你友好的老师,他会设定你所询问的练习 What is it that makes you think that the shared pool doesn't get flushed? I have a suspicion th
...
实际的用途是,您应该从JDBC连接配置开始,该配置将成为生产JDBC池配置的副本 ,以便具有实际的负载模式。 如果您检测到数据库性能问题,可以使用池设置(连接号,事务隔离等)来确定最高性能的配置,一旦您有证据证明这些或那个池设置可以提供更好的性能,您可以将其报告给开发人员或根据您的发现启动并修改您的应用程序数据库连接设置。 检出使用JMeter中的JDBC Sampler获取JMeter连接池设置。 从Oracle的角度来看,我认为连接池和缓存以及高性能Oracle JDBC编程将会有很大帮助。
...
您可以将您的web.xml上下文参数更改为:
contextConfigLocation
classpath*:META-INF/spring/applicationContext*.xml
并创建任何计数的上下文文件,而不必将其导入根上下文 当你有multimodule项目,并将配置文件放到每个模块时,它是非常
...