- 浏览: 565439 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (267)
- 随笔 (4)
- Spring (13)
- Java (61)
- HTTP (3)
- Windows (1)
- CI(Continuous Integration) (3)
- Dozer (1)
- Apache (11)
- DB (7)
- Architecture (41)
- Design Patterns (11)
- Test (5)
- Agile (1)
- ORM (3)
- PMP (2)
- ESB (2)
- Maven (5)
- IDE (1)
- Camel (1)
- Webservice (3)
- MySQL (6)
- CentOS (14)
- Linux (19)
- BI (3)
- RPC (2)
- Cluster (9)
- NoSQL (7)
- Oracle (25)
- Loadbalance (7)
- Web (5)
- tomcat (1)
- freemarker (1)
- 制造 (0)
最新评论
-
panamera:
如果设置了连接需要密码,Dynamic Broker-Clus ...
ActiveMQ 集群配置 -
panamera:
请问你的最后一种模式Broker-C节点是不是应该也要修改持久 ...
ActiveMQ 集群配置 -
maosheng:
longshao_feng 写道楼主使用 文件共享 模式的ma ...
ActiveMQ 集群配置 -
longshao_feng:
楼主使用 文件共享 模式的master-slave,produ ...
ActiveMQ 集群配置 -
tanglanwen:
感触很深,必定谨记!
少走弯路的十条忠告
ORACLE将执行过的SQL语句存放在内存的共享池(shared buffer pool)中,可以被所有的数据库用户共享。当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同,
ORACLE就能很快获得已经被解析的语句以及最好的执行路径. 这个功能大大地提高了SQL的执行性能并节省了内存的使用。
为了不重复解析相同的SQL语句,在第一次解析之后,Oracle将SQL语句存放在内存中。这块位于系统全局区域SGA(systemglobal area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前执行过的语句完全相同,Oracle就能很快获得已经被解析的语句以及最好的执行方案。Oracle的这个功能大大地提高了SQL的执行性能并节省了内存的使用。
可惜的是,Oracle只对简单的表提供高速缓冲(cache buffering),这个功能并不适用于多表连接查询。数据库管理员必须在启动参数文件中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了。当向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
检查共享SQL语句:
select * from v$db_object_cache
where name like 'select * from user_files%';
SQL语句的四个处理阶段:
解析(PARSE):
1,在共享池中查找SQL语句
2,检查语法
3,检查语义和相关的权限
4,合并(MERGE)视图定义和子查询
5,确定执行计划
绑定(BIND):
1,在语句中查找绑定变量
2,赋值(或重新赋值)
执行(EXECUTE):
1,应用执行计划
2,执行必要的I/O和排序操作
提取(FETCH):
1,从查询结果中返回记录
2,必要时进行排序
3,使用ARRAY FETCH机制
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优化器,而直接采用基于规则或者基于成本的优化器。
访问数据表的方式:
① 全表扫描
全表扫描就是顺序地访问表中每条记录。Oracle采用一次读入多个数据块(database block)的方式优化全表扫描。
② 通过ROWID访问表
ROWID包含了表中记录的物理位置信息。可以采用基于ROWID的访问方式情况提高访问表的效率。Oracle采用索引实现了数据和存放数据的物理位置(ROWID)之间的联系 通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能的提高。
影响数据库系统性能的要素:
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包。
ORACLE就能很快获得已经被解析的语句以及最好的执行路径. 这个功能大大地提高了SQL的执行性能并节省了内存的使用。
为了不重复解析相同的SQL语句,在第一次解析之后,Oracle将SQL语句存放在内存中。这块位于系统全局区域SGA(systemglobal area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前执行过的语句完全相同,Oracle就能很快获得已经被解析的语句以及最好的执行方案。Oracle的这个功能大大地提高了SQL的执行性能并节省了内存的使用。
可惜的是,Oracle只对简单的表提供高速缓冲(cache buffering),这个功能并不适用于多表连接查询。数据库管理员必须在启动参数文件中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了。当向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
检查共享SQL语句:
select * from v$db_object_cache
where name like 'select * from user_files%';
SQL语句的四个处理阶段:
解析(PARSE):
1,在共享池中查找SQL语句
2,检查语法
3,检查语义和相关的权限
4,合并(MERGE)视图定义和子查询
5,确定执行计划
绑定(BIND):
1,在语句中查找绑定变量
2,赋值(或重新赋值)
执行(EXECUTE):
1,应用执行计划
2,执行必要的I/O和排序操作
提取(FETCH):
1,从查询结果中返回记录
2,必要时进行排序
3,使用ARRAY FETCH机制
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优化器,而直接采用基于规则或者基于成本的优化器。
访问数据表的方式:
① 全表扫描
全表扫描就是顺序地访问表中每条记录。Oracle采用一次读入多个数据块(database block)的方式优化全表扫描。
② 通过ROWID访问表
ROWID包含了表中记录的物理位置信息。可以采用基于ROWID的访问方式情况提高访问表的效率。Oracle采用索引实现了数据和存放数据的物理位置(ROWID)之间的联系 通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能的提高。
影响数据库系统性能的要素:
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包。
发表评论
-
Oracle的三种高可用集群方案
2015-05-18 15:14 9751. RAC(Real Application Cluster ... -
Oracle 执行计划介绍
2013-08-09 15:22 960优化定义: 是选择最有效的执行计划来执行SQL语句的过 ... -
Oracle 优化器介绍
2013-08-08 17:51 7592种类型的优化器:基于规则的优化器与基于代价的优化器。 基于 ... -
Oracle SQL 语句的处理过程详解
2013-08-08 17:24 1069SQL语句: 1 数据查询语言DQL:select查询语句 ... -
Oracle SQL性能优化深入浅出 3
2013-08-08 16:29 859用EXPLAIN PLAN 分析SQL语句 ... -
Oracle 索引介绍
2013-08-07 15:26 969Oracle 创建索引要做到三 ... -
Oracle普通视图和实体化视图比较
2013-07-29 15:54 8840相对于普通的视图来说,实体化视图的不同之处在于实体化视图管理存 ... -
Oracle 实体化视图
2013-07-29 14:28 1748简介: MView中文名称为 ... -
Oracle Read-only Tablespace(只读表空间)
2013-07-25 15:31 3254一,只读表空间与数据的备份/恢复 表空间设置成只读之后,只需 ... -
Oracle 存储过程读文件
2013-05-02 19:01 1439create or replace PROCEDURE PR_ ... -
Oracle Alter 语句
2013-03-28 14:40 1064oracle怎样修改表名、列名、字段类型、添加表列、删除表列: ... -
Oracle SQL性能优化总结
2013-03-22 11:21 1067Oracle数据库技术的两大基石是:索引和表连接 1.能不写 ... -
Oracle SQL 分析工具
2013-02-22 15:09 1082用EXPLAIN PLAN 分析SQL语句: EXPLAIN ... -
Oracle SQL性能优化深入浅出 0
2013-02-22 14:38 805随着软件技术的不断发展,系统性能越来越重要。 系统性能主要用 ... -
Oracle 数据库介绍
2013-02-20 17:43 1869概要: 1、 ORACLE ... -
Oracle Tkprof(Trace Kernel Profile)工具
2013-02-20 13:37 1399TKPROF介绍 Tkprof:分析ORACLE跟踪文件并且 ... -
Oracle分区技术介绍
2013-03-25 14:09 1021Oracle的分区技术基本原理 分而治之: Oracle分区表 ... -
Oracle SQL性能优化深入浅出 2
2013-01-25 10:47 968SQL 语句的编写原则: 1. ... -
Oracle 触发器详解 5
2012-12-21 09:20 10268.6 数据库触发器的应用实例 用户可以使用数据库触发器实 ... -
Oracle 触发器详解 4
2012-12-21 09:17 9808.5 数据库触发器的应用举例 例1:创建一个DML语句 ...
相关推荐
Oracle教程——深入浅出Oracle学习资料 Oracle数据库系统是全球广泛应用的关系型数据库管理系统,由甲骨文公司(Oracle Corporation)开发。本教程旨在为初学者和有经验的IT专业人士提供全面、深入的Oracle知识,...
盖国强先生的《Oracle数据库性能优化》一书深入浅出地探讨了这个主题,旨在帮助读者理解并掌握提高Oracle数据库效率的关键技术。 在Oracle数据库性能优化中,首要涉及的知识点是SQL优化。SQL语句是数据库操作的基础...
《深入浅出Oracle》这本书是Oracle数据库管理员(DBA)学习和提升技能的重要参考资料。Oracle DBA是一个复杂的领域,涵盖数据库的安装配置、性能优化、备份恢复、安全性管理等多个方面。以下将详细介绍书中可能涉及的...
总之,《深入浅出Oracle》这本书涵盖了Oracle数据库的基础理论、安装配置、管理维护、性能优化、安全策略等多个方面,对于Oracle数据库的学习者和管理员来说,是一本不可或缺的参考书。通过阅读和实践,读者可以全面...
本文深入探讨了Oracle数据库中SQL性能优化的方法和技术。首先,文中强调了优化SQL语句对系统性能的重要性,指出应用程序的性能在很大程度上取决于数据库中SQL语句的执行效率。因此,为了提升Oracle数据库性能,必须...
在"深入浅出Oracle"这份资料中,读者可能将接触到Oracle的安装配置、数据库设计、SQL查询优化、存储结构、备份恢复策略、性能调优、安全性管理以及高级特性等内容。通过学习,无论是数据库管理员、开发人员还是系统...
《深入浅出Oracle:DBA入门、进阶与诊断案例》是一本专为数据库管理员(DBA)设计的Oracle技术指南。这本书详细介绍了Oracle数据库管理的基础知识,中级技能以及高级故障诊断技巧,旨在帮助读者从新手到专家逐步提升...
下面将详细介绍SQL的基础知识、SQL在数据库操作中的应用以及SQL的基本语法结构,旨在深入浅出地解释SQL在IT行业中的重要性。 SQL是用于访问和处理数据库的标准的计算机语言。它广泛应用于多种数据库系统,如MySQL、...
该书通过丰富的示例和深入浅出的讲解,帮助读者掌握Oracle SQL的核心概念和技术。 #### 主要内容概览 1. **SQL基础**: 包括表的创建、数据的插入、更新和删除等基本操作。 2. **数据查询**: 教授如何编写高效的SQL...
《深入浅出Oracle:DBA入门、进阶与诊断案例》是盖国强先生的一部经典之作,专门针对Oracle数据库管理员(DBA)的学习路径和实际问题解决提供了详尽的指导。Oracle数据库是全球广泛使用的大型关系型数据库系统,对于...
在分析实例的过程中,兼顾深度与广度,不仅对实际问题的现象、产生原因和相关的原理进行了深入浅出的讲解,更主要的是,结合实际应用环境,提供了一系列解决问题的思路和方法,包括详细的操作步骤,具有很强的实战性...
本书《深入浅出Oracle:DBA入门、进阶与诊断案例》由盖国强编著,由人民邮电出版社出版,旨在为初学者提供全面的Oracle数据库管理入门知识,并为有一定经验的DBA提供进阶技巧和实际案例分析。 首先,本书开篇可能会...
这套资料主要由三个文档组成,分别是"Oracle8i_9i数据库基础.pdf"、"oracle1.pdf"和"SQL基础.pdf",它们分别从不同角度深入浅出地介绍了Oracle SQL的各个方面。 首先,"Oracle8i_9i数据库基础.pdf"可能是针对Oracle...
《深入浅出Oracle之Forms开发指南》是一本专注于Oracle企业资源规划(ERP)E-BUSINESS SUITE中的核心应用技术——Forms开发的书籍。作者黄建华在2008年首次发布并更新了该文档,旨在提供Oracle Forms的详细开发指导...
《深入浅出Oracle:DBA入门、进阶与诊断案例》是数据库领域的经典之作,由知名专家eagle精心编著,旨在帮助读者全面理解和掌握Oracle数据库管理(DBA)的各项技能。Oracle DBA是一个关键角色,负责维护Oracle数据库...