oracle如何优化数据 优化oracle sql 语句性能的方法

怎样优化oracle数据库1
调整数据结构的设计 。这一部分在开发信息系统之前完成,程序员需要考虑是否使用ORACLE数据库的分区功能,对于经常访问的数据库表是否需要建立索引等 。
2
调整应用程序结构设计 。这一部分也是在开发信息系统之前完成,程序员在这一步需要考虑应用程序使用什么样的体系结构,是使用传统的Client/Server两层体系结构,还是使用Browser/Web/Database的三层体系结构 。不同的应用程序体系结构要求的数据库资源是不同的 。
3
调整数据库SQL语句 。应用程序的执行最终将归结为数据库中的SQL语句执行,因此SQL语句的执行效率最终决定了ORACLE数据库的性能 。ORACLE公司推荐使用ORACLE语句优化器(Oracle Optimizer)和行锁管理器(row-level manager)来调整优化SQL语句 。
4
调整服务器内存分配 。内存分配是在信息系统运行过程中优化配置的,数据库管理员可以根据数据库运行状况调整数据库系统全局区(SGA区)的数据缓冲区、日志缓冲区和共享池的大?。换箍梢缘髡绦蛉智≒GA区)的大小 。需要注意的是,SGA区不是越大越好,SGA区过大会占用操作系统使用的内存而引起虚拟内存的页面交换,这样反而会降低系统 。
5
调整硬盘I/O,这一步是在信息系统开发之前完成的 。数据库管理员可以将组成同一个表空间的数据文件放在不同的硬盘上,做到硬盘之间I/O负载均衡 。
6
调整操作系统参数,例如:运行在UNIX操作系统上的ORACLE数据库,可以调整UNIX数据缓冲池的大小 , 每个进程所能使用的内存大小等参数 。实际上,上述数据库优化措施之间是相互联系的 。ORACLE数据库性能恶化表现基本上都是用户响应时间比较长,需要用户长时间的等待 。但性能恶化的原因却是多种多样的,有时是多个因素共同造成了性能恶化的结果,这就需要数据库管理员有比较全面的计算机知识 , 能够敏感地察觉到影响数据库性能的主要原因所在 。另外 , 良好的数据库管理工具对于优化数据库性能也是很重要的
优化数据库大幅度提高Oracle的性能 几个简单的步骤大幅提高Oracle性能 我优化数据库的三板斧
数据库优化的讨论可以说是一个永恒的主题 资深的Oracle优化人员通常会要求提出性能问题的人对数据库做一个statspack 贴出数据库配置等等 还有的人认为要抓出执行最慢的语句来进行优化 但实际情况是 提出疑问的人很可能根本不懂执行计划 更不要说statspack了 而我认为 数据库优化 应该首先从大的方面考虑 网络 服务器硬件配置 操作系统配置 Oracle服务器配置 数据结构组织 然后才是具体的调整 实际上网络 硬件等往往无法决定更换 应用程序一般也无法修改 因此应该着重从数据库配置 数据结构上来下手 首先让数据库有一个良好的配置 然后再考虑具体优化某些过慢的语句 我在给我的用户系统进行优化的过程中 总结了一些基本的 简单易行的办法来优化数据库 算是我的三板斧 呵呵 不过请注意 这些不一定普遍使用 甚至有的会有副作用 但是对OLTP系统 基于成本的数据库往往行之有效 不妨试试 (注 附件是Burleson写的用来报告数据库性能等信息的脚本 本文用到)
一.设置合适的SGA
常常有人抱怨服务器硬件很好 但是Oracle就是很慢 很可能是内存分配不合理造成的 ( )假设内存有 M 这通常是小型应用 建议Oracle的SGA大约 M 其中 共享池(SHARED_POOL_SIZE)可以设置 M到 M 根据实际的用户数 查询等来定 数据块缓冲区可以大致分配 M M i下需要设置DB_BLOCK_BUFFERS DB_BLOCK_BUFFER*DB_BLOCK_SIZE等于数据块缓冲区大小 i 下的数据缓冲区可以用db_cache_size来直接分配
( )假设内存有 G Oracle 的SGA可以考虑分配 M 共享池分配 M到 M 数据缓冲区分配 M到 M
( )内存 G SGA可以考虑分配 G 共享池 M到 M 剩下的给数据块缓冲区
( )内存 G以上 共享池 M到 M就足够啦 再多也没有太大帮助 (Biti_rainy有专述)数据缓冲区是尽可能的大 但是一定要注意两个问题 一是要给操作系统和其他应用留够内存 二是对于 位的操作系统 Oracle的SGA有 G的限制 有的 位操作系统上可以突破这个限制 方法还请看Biti的大作吧
二.分析表和索引 更改优化模式
Oracle默认优化模式是CHOOSE 在这种情况下 如果表没有经过分析 经常导致查询使用全表扫描 而不使用索引 这通常导致磁盘I/O太多 而导致查询很慢 如果没有使用执行计划稳定性 则应该把表和索引都分析一下 这样可能直接会使查询速度大幅提升 分析表命令可以用ANALYZE TABLE 分析索引可以用ANALYZE INDEX命令 对于少于 万的表 可以考虑分析整个表 对于很大的表 可以按百分比来分析 但是百分比不能过低 否则生成的统计信息可能不准确 可以通过DBA_TABLES的LAST_ANALYZED列来查看表是否经过分析或分析时间 索引可以通过DBA_INDEXES的LAST_ANALYZED列
下面通过例子来说明分析前后的速度对比 (表CASE_GA_AJZLZ大约有 万数据 有主键)首先在SQLPLUS中打开自动查询执行计划功能 (第一次要执行\RDBMS\ADMIN\utlxplan sql来创建PLAN_TABLE这个表)
SQL SET AUTOTRACE ON SQLSET TIMING ON
通过SET AUTOTRACE ON 来查看语句的执行计划 通过SET TIMING ON 来查看语句运行时间
SQL select count(*) from CASE_GA_AJZLZ; COUNT(*)已用时间: : :Execution PlanSELECT STATEMENT Optimizer=CHOOSESORT (AGGREGATE)TABLE ACCESS (FULL) OF CASE_GA_AJZLZ ……………………
请注意上面分析中的TABLE ACCESS(FULL) 这说明该语句执行了全表扫描 而且查询使用了 秒 这时表还没有经过分析 下面我们来对该表进行分析
SQL *** yze table CASE_GA_AJZLZ pute statistics;
表已分析 已用时间: : : 然后再来查询
SQL select count(*) from CASE_GA_AJZLZ; COUNT(*)已用时间: : :Execution PlanSELECT STATEMENT Optimizer=FIRST_ROWS (Cost= Card= )SORT (AGGREGATE)INDEX (FAST FULL SCAN) OF PK_AJZLZ (UNIQUE) (Cost= Card= ) …………………………
请注意 这次时间仅仅用了 秒!这要归功于INDEX(FAST FULL SCAN) 通过分析表 查询使用了PK_AJZLZ索引 磁盘I/O大幅减少 速度也大幅提升!下面的实用语句可以
用来生成分析某个用户的所有表和索引 假设用户是GAXZUSR
SQL set pagesize SQL spool d:\ *** yze_tables sql; SQL select *** yze table ||owner|| ||table_name|| pute statistics; from dba_tables where owner= GAXZUSR ; SQL spool off SQL spool spool d:\ *** yze_indexes sql; SQL select *** yze index ||owner|| ||index_name|| pute statistics; from dba_indexes where owner= GAXZUSR ; SQL spool off SQL @d:\ *** yze_tables sql SQL @d:\ *** yze_indexes sql
解释 上面的语句生成了两个sql文件 分别分析全部的GAXZUSR的表和索引 如果需要按照百分比来分析表 可以修改一下脚本 通过上面的步骤 我们就完成了对表和索引的分析 可以测试一下速度的改进啦 建议定期运行上面的语句 尤其是数据经过大量更新
当然 也可以通过dbms_stats来分析表和索引 更方便一些 但是我仍然习惯上面的方法 因为成功与否会直接提示出来
另外 我们可以将优化模式进行修改 optimizer_mode值可以是RULE CHOOSE FIRST_ROWS和ALL_ROWS 对于OLTP系统 可以改成FIRST_ROWS 来要求查询尽快返回结果 这样即使不用分析 在一般情况下也可以提高查询性能 但是表和索引经过分析后有助于找到最合适的执行计划
三.设置cursor_sharing=FORCE 或SIMILAR
这种方法是 i才开始有的 oracle 不支持 通过设置该参数 可以强制共享只有文字不同的语句解释计划 例如下面两条语句可以共享
SQL SELECT * FROM MYTABLE WHERE NAME= tom SQL SELECT * FROM MYTABLE WHERE NAME= turner
这个方法可以大幅降低缓冲区利用率低的问题 避免语句重新解释 通过这个功能 可以很大程度上解决硬解析带来的性能下降的问题 个人感觉可根据系统的实际情况 决定是否将该参数改成FORCE 该参数默认是exact 不过一定要注意 修改之前 必须先给ORACLE打补丁 否则改之后oracle会占用 %的CPU 无法使用 对于ORACLE i 可以设置成SIMILAR 这个设置综合了FORCE和EXACT的优点 不过请慎用这个功能 这个参数也可能带来很大的负面影响!
四.将常用的小表 索引钉在数据缓存KEEP池中
内存上数据读取速度远远比硬盘中读取要快 据称 内存中数据读的速度是硬盘的 倍!如果资源比较丰富 把常用的小的 而且经常进行全表扫描的表给钉内存中 当然是在好不过了 可以简单的通过ALTER TABLE tablename CACHE来实现 在ORACLE i之后可以使用ALTER TABLE table STORAGE(BUFFER_POOL KEEP) 一般来说 可以考虑把 数据块之内的表放在keep池中 当然要根据内存大小等因素来定 关于如何查出那些表或索引符合条件 可以使用本文提供的access sql和access_report sql 这两个脚本是著名的Oracle专家 Burleson写的 你也可以在读懂了情况下根据实际情况调整一下脚本 对于索引 可以通过ALTER INDEX indexname STORAGE(BUFFER_POOL KEEP)来钉在KEEP池中
将表定在KEEP池中需要做一些准备工作 对于ORACLE i 需要设置DB_KEEP_CACHE_SIZE 对于 i 需要设置buffer_pool_keep 在 i中 还要修改db_block_lru_latches 该参数默认是 无法使用buffer_pool_keep 该参数应该比 * *CPU数量少 但是要大于 才能设置DB_KEEP_CACHE_BUFFER buffer_pool_keep从db_block_buffers中分配 因此也要小于db_block_buffers 设置好这些参数后 就可以把常用对象永久钉在内存里
五.设置optimizer_max_permutations
对于多表连接查询 如果采用基于成本优化(CBO) ORACLE会计算出很多种运行方案
从中选择出最优方案 这个参数就是设置oracle究竟从多少种方案来选择最优 如果设置太大 那么计算最优方案过程也是时间比较长的 Oracle 和 i默认是 建议改成 对于 i 已经默认是 了
六.调整排序参数
( ) SORT_AREA_SIZE:默认的用来排序的SORT_AREA_SIZE大小是 K 通常显得有点小 一般可以考虑设置成 M( ) 这个参数不能设置过大 因为每个连接都要分配同样的排序内存
lishixinzhi/Article/program/Oracle/201311/18879
oracle数据库优化有哪些方法?oracle如何优化数据你最好买一本专门讲ORACLE性能优化的书,好好看看\x0d\x0a1、调整数据库服务器的性能\x0d\x0aOracle数据库服务器是整个系统的核心,它的性能高低直接影响整个系统的性能,为oracle如何优化数据了调整Oracle数据库服务器的性能,主要从以下几个方面考虑: \x0d\x0a1.1、调整操作系统以适合Oracle数据库服务器运行\x0d\x0aOracle数据库服务器很大程度上依赖于运行服务器的操作系统,如果操作系统不能提供最好性能,那么无论如何调整,Oracle数据库服务器也无法发挥其应有的性能 。\x0d\x0a1.1.1、为Oracle数据库服务器规划系统资源 \x0d\x0a据已有计算机可用资源, 规划分配给Oracle服务器资源原则是:尽可能使Oracle服务器使用资源最大化,特别在Client/Server中尽量让服务器上所有资源都来运行Oracle服务 。\x0d\x0a1.1.2、调整计算机系统中的内存配置 \x0d\x0a多数操作系统都用虚存来模拟计算机上更大的内存,它实际上是硬盘上的一定的磁盘空间 。当实际的内存空间不能满足应用软件的要求时,操作系统就将用这部分的磁盘空间对内存中的信息进行页面替换,这将引起大量的磁盘I/O操作,使整个服务器的性能下降 。为oracle如何优化数据了避免过多地使用虚存,应加大计算机的内存 。\x0d\x0a1.1.3、为Oracle数据库服务器设置操作系统进程优先级 \x0d\x0a不要在操作系统中调整Oracle进程的优先级,因为在Oracle数据库系统中,所有的后台和前台数据库服务器进程执行的是同等重要的工作,需要同等的优先级 。所以在安装时 , 让所有的数据库服务器进程都使用缺省的优先级运行 。\x0d\x0a1.2、调整内存分配\x0d\x0aOracle数据库服务器保留3个基本的内存高速缓存 , 分别对应3种不同类型的数据:库高速缓存,字典高速缓存和缓冲区高速缓存 。库高速缓存和字典高速缓存一起构成共享池 , 共享池再加上缓冲区高速缓存便构成了系统全程区(SGA) 。SGA是对数据库数据进行快速访问的一个系统全程区,若SGA本身需要频繁地进行释放、分配,则不能达到快速访问数据的目的,因此应把SGA放在主存中,不要放在虚拟内存中 。内存的调整主要是指调整组成SGA的内存结构的大小来提高系统性能,由于Oracle数据库服务器的内存结构需求与应用密切相关 , 所以内存结构的调整应在磁盘I/O调整之前进行 。\x0d\x0a1.2.1、库缓冲区的调整 \x0d\x0a库缓冲区中包含私用和共享SQL和PL/SQL区,通过比较库缓冲区的命中率决定它的大小 。要调整库缓冲区,必须首先了解该库缓冲区的活动情况,库缓冲区的活动统计信息保留在动态性能表v$librarycache数据字典中,可通过查询该表来了解其活动情况,以决定如何调整 。\x0d\x0a \x0d\x0aSelect sum(pins),sum(reloads) from v$librarycache;\x0d\x0a \x0d\x0aPins列给出SQL语句,PL/SQL块及被访问对象定义的总次数oracle如何优化数据;Reloads列给出SQL 和PL/SQL块的隐式分析或对象定义重装载时在库程序缓冲区中发生的错误 。如果sum(pins)/sum(reloads) ≈0,则库缓冲区的命中率合适;若sum(pins)/sum(reloads)1, 则需调整初始化参数 shared_pool_size来重新调整分配给共享池的内存量 。\x0d\x0a1.2.2、数据字典缓冲区的调整 \x0d\x0a数据字典缓冲区包含了有关数据库的结构、用户、实体信息 。数据字典的命中率,对系统性能影响极大 。数据字典缓冲区的使用情况记录在动态性能表v$librarycache中,可通过查询该表来了解其活动情况,以决定如何调整 。\x0d\x0a \x0d\x0aSelect sum(gets),sum(getmisses) from v$rowcache;\x0d\x0a \x0d\x0aGets列是对相应项请求次数的统计;Getmisses 列是引起缓冲区出错的数据的请求次数 。对于频繁访问的数据字典缓冲区,sum(getmisses)/sum(gets)10%~15% 。若大于此百分数,则应考虑增加数据字典缓冲区的容量,即需调整初始化参数shared_pool_size来重新调整分配给共享池的内存量 。\x0d\x0a1.2.3、缓冲区高速缓存的调整 \x0d\x0a用户进程所存取的所有数据都是经过缓冲区高速缓存来存?。?所以该部分的命中率 , 对性能至关重要 。缓冲区高速缓存的使用情况记录在动态性能表v$sysstat中 , 可通过查询该表来了解其活动情况 , 以决定如何调整 。\x0d\x0a \x0d\x0aSelect name,value from v$sysstat where name in ('dbblock gets','consistent gets','physical reads');\x0d\x0a \x0d\x0adbblock gets和consistent gets的值是请求数据缓冲区中读的总次数 。physical reads的值是请求数据时引起从盘中读文件的次数 。从缓冲区高速缓存中读的可能性的高低称为缓冲区的命中率,计算公式: \x0d\x0a \x0d\x0aHit Ratio=1-(physical reds/(dbblock gets consistent gets))\x0d\x0a \x0d\x0a如果Hit Ratio60%~70%,则应增大db_block_buffers的参数值 。db_block_buffers可以调整分配给缓冲区高速缓存的内存量,即db_block_buffers可设置分配缓冲区高速缓存的数据块的个数 。缓冲区高速缓存的总字节数=db_block_buffers的值*db_block_size的值 。db_block_size 的值表示数据块大小的字节数,可查询 v$parameter 表: \x0d\x0a \x0d\x0aselect name,value from v$parameter where name='db_block_size';\x0d\x0a \x0d\x0a在修改了上述数据库的初始化参数以后,必须先关闭数据库,在重新启动数据库后才能使新的设置起作用 。
ORACLE数据库性能优化概述 实际上 为了保证ORACLE数据库运行在最佳的性能状态下 在信息系统开发之前就应该考虑数据库的优化策略 优化策略一般包括服务器操作系统参数调整 ORACLE数据库参数调整 网络性能调整 应用程序SQL语句分析及设计等几个方面 其中应用程序的分析与设计是在信息系统开发之前完成的
分析评价ORACLE数据库性能主要有数据库吞吐量 数据库用户响应时间两项指标 数据库吞吐量是指单位时间内数据库完成的SQL语句数目 数据库用户响应时间是指用户从提交SQL语句开始到获得结果的那一段时间 数据库用户响应时间又可以分为系统服务时间和用户等待时间两项 即
数据库用户响应时间=系统服务时间 + 用户等待时间
上述公式告诉我们 获得满意的用户响应时间有两个途径 一是减少系统服务时间 即提高数据库的吞吐量 二是减少用户等待时间 即减少用户访问同一数据库资源的冲突率
性能优化包括如下几个部分
ORACLE数据库性能优化之一 调整数据结构的设计
这一部分在开发信息系统之前完成 程序员需要考虑是否使用ORACLE数据库的分区功能 对于经常访问的数据库表是否需要建立索引等
ORACLE数据库性能优化之二 调整应用程序结构设计
这一部分也是在开发信息系统之前完成 程序员在这一步需要考虑应用程序使用什么样的体系结构 是使用传统的Client/Server两层体系结构 还是使用Browser/Web/Database的三层体系结构 不同的应用程序体系结构要求的数据库资源是不同的
ORACLE数据库性能优化之三 调整数据库SQL语句
应用程序的执行最终将归结为数据库中的SQL语句执行 因此SQL语句的执行效率最终决定了ORACLE数据库的性能 ORACLE公司推荐使用ORACLE语句优化器(Oracle Optimizer)和行锁管理器(row level manager)来调整优化SQL语句
ORACLE数据库性能优化之四 调整服务器内存分配
内存分配是在信息系统运行过程中优化配置的 数据库管理员可以根据数据库运行状况调整数据库系统全局区(SGA区)的数据缓冲区 日志缓冲区和共享池的大小 还可以调整程序全局区(PGA区)的大小 需要注意的是 SGA区不是越大越好 SGA区过大会占用操作系统使用的内存而引起虚拟内存的页面交换 这样反而会降低系统
ORACLE数据库性能优化之五 调整硬盘I/O 这一步是在信息系统开发之前完成的
数据库管理员可以将组成同一个表空间的数据文件放在不同的硬盘上 做到硬盘之间I/O负载均衡
ORACLE数据库性能优化之六 调整操作系统参数
例如 运行在UNIX操作系统上的ORACLE数据库 可以调整UNIX数据缓冲池的大小 每个进程所能使用的内存大小等参数
lishixinzhi/Article/program/Oracle/201311/17687
如何加速Oracle大批量数据处理?一、提高DML操作的办法:\x0d\x0a简单说来:\x0d\x0a1、暂停索引,更新后恢复.避免在更新的过程中涉及到索引的重建.\x0d\x0a2、批量更新,每更新一些记录后及时进行提交动作.避免大量占用回滚段和或临时表空间.\x0d\x0a3、创建一临时的大的表空间用来应对这些更新动作.\x0d\x0a\x0d\x0a4、批量更新,每更新一些记录后及时进行提交动作.避免大量占用回滚段和或临时表空间.\x0d\x0a\x0d\x0a5、创建一临时的大的表空间用来应对这些更新动作.\x0d\x0a\x0d\x0a6、加大排序缓冲区\x0d\x0aalter session set sort_area_size=100000000;\x0d\x0ainsert into tableb select * from tablea;\x0d\x0acommit;\x0d\x0a\x0d\x0a如果UPDATE的是索引字段,就会涉及到索引的重建,暂停索引不会提高多少的速度,反而有可能降低UPDATE速度,\x0d\x0a因为在更新是索引可以提高数据的查询速度 , 重建索引引起的速度降低影响不大 。\x0d\x0a\x0d\x0aORACLE优化修改参数最多也只能把性能提高15%,大部分都是SQL语句的优化!\x0d\x0a\x0d\x0aupdate总体来说比insert要慢 :\x0d\x0a几点建议:\x0d\x0a1、如果更新的数据量接近整个表 , 就不应该使用index而应该采用全表扫描\x0d\x0a2、减少不必要的index,因为update表通常需要update index\x0d\x0a3、如果你的服务器有多个cpu , 采用parellel hint,可以大幅度的提高效率\x0d\x0a另外,建表的参数非常重要,对于更新非常频繁的表,建议加大PCTFREE的值,以保证数据块中有足够的空间用于UPDATE,从而降低CHAINED_ROWS 。\x0d\x0a\x0d\x0a二、各种批量DML操作:\x0d\x0a(1)、oracle批量拷贝:\x0d\x0aset arraysize 20\x0d\x0aset copycommit 5000\x0d\x0acopy from username/password@oraclename append table_name1\x0d\x0ausing select * from table_name2;\x0d\x0a(2)、常规插入方式:\x0d\x0ainsert into t1 select * from t;\x0d\x0a为了提高速度可以使用下面方法,来减少插入过程中产生的日志:\x0d\x0aalter table t1 nologging;\x0d\x0ainsert into t1 select * from t;\x0d\x0acommit;\x0d\x0a(3)、CTAS方式:\x0d\x0acreate table t1\x0d\x0aas\x0d\x0aselect * from t;\x0d\x0a为了提高速度可以使用下面方法,来减少插入过程中产生的日志,并且可以制定并行度:\x0d\x0acreate table t1 nologging parallel(degree 2) as select * from t;\x0d\x0a(4)、Direct-Path插入:\x0d\x0ainsert /* append*/ into t1 select * from t;\x0d\x0acommit;\x0d\x0a为了提高速度可以使用下面方法 , 来减少插入过程中产生的日志:\x0d\x0aalter table t1 nologging;\x0d\x0ainsert /* append*/ into t1 select * from t;\x0d\x0a \x0d\x0aDirect-Path插入特点:\x0d\x0a1、append只在insert ? select ?中起作用,像insert /*append */ into t values(?)这类的语句是不起作用的 。在update、delete操作中,append也不起作用 。\x0d\x0a2、 Direct-Path会使数据库不记录直接路径导入的数据的重做日志,会对恢复带来麻烦 。\x0d\x0a3、 Direct-Path直接在表段的高水位线以上的空白数据块中写数据 , 不会重用高水位线以下的空间 , 会对空间的使用造成一定的浪费,对查询的性能也会造成一定的影响 。而常规插入会优先考虑使用高水位线之下有空闲空间存在的数据块 。因此理论上Direct-Path插入会比常规插入速度更快,因为Direct-Path直接使用新数据块 , 而常规插入要遍历freelist获取可用空闲数据块 , 如果同 nologging 配合 , 这种速度优势会更加明显 。\x0d\x0a4、 以append方式插入记录后,要执行commit,才能对表进行查询 。否则会出现错误:ORA-12838: 无法在并行模式下修改之后读/修改对象 。\x0d\x0a5、 用append导入数据后 , 如果没有提交或者回滚,在其他会话中任何对该表的DML都会被阻塞(不会报错),但对该表的查询可以正常执行 。\x0d\x0a6、 在归档模式下,要把表设置为nologging,然后以append方式批量添加记录,才会显著减少redo数量 。在非归档模式下,不必设置表的 nologging属性,即可减少redo数量 。如果表上有索引,则append方式批量添加记录,不会减少索引上产生的redo数量,索引上的redo 数量可能比表的redo数量还要大 。\x0d\x0a7、 数据直接插入数据文件,绕过buffer cache并且忽略了引用完整性约束 。\x0d\x0a8、 不管表是否在nologging 下,只要是 directinsert,就不会对数据内容生成undo 。\x0d\x0a9、 Oracle在Direct-Path INSERT 操作末尾,对具有索引的表执行索引维护,这样就避免了在drop掉索引后,再rebuild 。\x0d\x0a10、Direct-Path INSERT比常规的插入需要更多的空间 。因为它将数据插入在高水位之上 。并行插入非分区表需要更多的空间,因为它需要为每一个并行线程创建临时段 。\x0d\x0a11、在插入期间 , 数据库在表上获得排他锁,用户不能在表上执行并行插入、更新或者删除操作,并行的索引创建和build也不被允许 。但却可以并行查询,但查询返回的是插入之前的结果集 。\x0d\x0a(5)、并行DML:\x0d\x0a如果你的服务器有多个cpu,采用parellel hint,可以大幅度的提高效率\x0d\x0aALTER SESSION ENABLE PARALLEL DML;\x0d\x0a\x0d\x0aINSERT /*PARALLEL(tableA, 2) */INTO tableA \x0d\x0aSELECT * FROM tableB;\x0d\x0a\x0d\x0a为了提高速度可以使用下面方法,来减少插入过程中产生的日志:\x0d\x0a\x0d\x0a INSERT /*PARALLEL(tableA, 2) */INTO tableA NOLOGGING\x0d\x0aSELECT * FROM tableB;\x0d\x0a\x0d\x0aoracle默认并不会打开PDML,对DML语句必须手工启用 。即需要执行\x0d\x0aalter table enable parallel dml命令 。\x0d\x0a \x0d\x0a并行DML特点:\x0d\x0a1、在并行DML模式中,默认的就是DIRECT-PATH插入,为了运行并行DML模式,必须满足以下条件:\x0d\x0aa、必须是Oracle企业版;\x0d\x0ab、必须在session中使并行DML生效,执行以下sql语句:\x0d\x0aALTER SESSION { ENABLE | FORCE } PARALLEL DML;\x0d\x0ac、必须指定table的并行属性,在创建的时候或者其他时候,或者在insert操作时使用“PARALLEL”提示 。\x0d\x0ad、为了使Direct-Path Insert模式失效,在INSERT语句中指定“NOAPPEND”提示,覆盖并行DML模式 。\x0d\x0a2、并行Direct-Path INSERT到分区表:\x0d\x0a类似于serial Direct-Path INSERT,每个并行操作分配给一个或者多个分区,每个并行操作插入数据到各自的分区段的高水位标志之上 , commit之后,用户就能看到更新的数据 。\x0d\x0a3、并行Direct-Path INSERT到非分区表:\x0d\x0a每个并行执行分配一个新的临时段,并插入数据到临时段 。当commit运行后,并行执行协调者合并新的临时段到主表段,用户就能看到更新的数据 。\x0d\x0a4、Direct-Path INSERT可以使用Log或者不使用Log 。\x0d\x0a5、另外不得不说的是,并行不是一个可扩展的特性,只有在数据仓库或作为DBA等少数人的工具在批量数据操作时利于充分利用资源,而在OLTP环境下使用并行需要非常谨慎 。事实上PDML还是有比较多的限制的,例如不支持触发器,引用约束,高级复制和分布式事务等特性,同时也会带来额外的空间占用,PDDL同 样是如此 。
oracle如何完成数据库优化1、1、调整数据结构的设计 。这一部分在开发信息系统之前完成,程序员需要考虑是否使用ORACLE数据库的分区功能,对于经常访问的数据库表是否需要建立索引等 。
2、2、调整应用程序结构设计 。这一部分也是在开发信息系统之前完成,程序员在这一步需要考虑应用程序使用什么样的体系结构,是使用传统的Client/Server两层体系结构,还是使用Browser/Web/Database的三层体系结构 。不同的应用程序体系结构要求的数据库资源是不同的 。
3、3、调整数据库SQL语句 。应用程序的执行最终将归结为数据库中的SQL语句执行,因此SQL语句的执行效率最终决定了ORACLE数据库的性能 。ORACLE公司推荐使用ORACLE语句优化器(Oracle Optimizer)和行锁管理器(row-level manager)来调整优化SQL语句 。
4、4、调整服务器内存分配 。内存分配是在信息系统运行过程中优化配置的,数据库管理员可以根据数据库运行状况调整数据库系统全局区(SGA区)的数据缓冲区、日志缓冲区和共享池的大?。换箍梢缘髡绦蛉智≒GA区)的大小 。需要注意的是,SGA区不是越大越好,SGA区过大会占用操作系统使用的内存而引起虚拟内存的页面交换,这样反而会降低系统 。
5、5、调整硬盘I/O,这一步是在信息系统开发之前完成的 。数据库管理员可以将组成同一个表空间的数据文件放在不同的硬盘上,做到硬盘之间I/O负载均衡 。
6、6、调整操作系统参数 , 例如:运行在UNIX操作系统上的ORACLE数据库,可以调整UNIX数据缓冲池的大小,每个进程所能使用的内存大小等参数 。
实际上,上述数据库优化措施之间是相互联系的 。ORACLE数据库性能恶化表现基本上都是用户响应时间比较长,需要用户长时间的等待 。但性能恶化的原因却是多种多样的,有时是多个因素共同造成了性能恶化的结果,这就需要数据库管理员有比较全面的计算机知识,能够敏感地察觉到影响数据库性能的主要原因所在 。另外 , 良好的数据库管理工具对于优化数据库性能也是很重要的 。
ORACLE数据库性能优化工具
常用的数据库性能优化工具有:
1、1、ORACLE数据库在线数据字典,ORACLE在线数据字典能够反映出ORACLE动态运行情况,对于调整数据库性能是很有帮助的 。
2、2、操作系统工具,例如UNIX操作系统的vmstat , iostat等命令可以查看到系统系统级内存和硬盘I/O的使用情况,这些工具对于管理员弄清出系统瓶颈出现在什么地方有时候很有用 。
3、3、SQL语言跟踪工具(SQL TRACE FACILITY),SQL语言跟踪工具可以记录SQL语句的执行情况,管理员可以使用虚拟表来调整实例 , 使用SQL语句跟踪文件调整应用程序性能 。SQL语言跟踪工具将结果输出成一个操作系统的文件,管理员可以使用TKPROF工具查看这些文件 。
4、4、ORACLE Enterprise Manager(OEM),这是一个图形的用户管理界面,用户可以使用它方便地进行数据库管理而不必记住复杂的ORACLE数据库管理的命令 。
5、5、EXPLAIN PLAN——SQL语言优化命令,使用这个命令可以帮助程序员写出高效的SQL语言 。
ORACLE数据库的系统性能评估
信息系统的类型不同 , 需要关注的数据库参数也是不同的 。数据库管理员需要根据自己的信息系统的类型着重考虑不同的数据库参数 。
1、1、在线事务处理信息系统(OLTP),这种类型的信息系统一般需要有大量的Insert、Update操作,典型的系统包括民航机票发售系统、银行储蓄系统等 。OLTP系统需要保证数据库的并发性、可靠性和最终用户的速度,这类系统使用的ORACLE数据库需要主要考虑下述参数:
ll数据库回滚段是否足够?
ll是否需要建立ORACLE数据库索引、聚集、散列?
ll系统全局区(SGA)大小是否足够?
llSQL语句是否高效?
2、2、数据仓库系统(Data Warehousing),这种信息系统的主要任务是从ORACLE的海量数据中进行查询,得到数据之间的某些规律 。数据库管理员需要为这种类型的ORACLE数据库着重考虑下述参数:
ll是否采用B*-索引或者bitmap索引?
ll是否采用并行SQL查询以提高查询效率?
ll是否采用PL/SQL函数编写存储过程?
ll有必要的话,需要建立并行数据库提高数据库的查询效率
SQL语句的调整原则
SQL语言是一种灵活的语言,相同的功能可以使用不同的语句来实现,但是语句的执行效率是很不相同的 。程序员可以使用EXPLAIN PLAN语句来比较各种实现方案,并选出最优的实现方案 。总得来讲,程序员写SQL语句需要满足考虑如下规则:
1、1、尽量使用索引 。试比较下面两条SQL语句:
语句A:SELECT dname, deptno FROM dept WHERE deptno NOT IN
(SELECT deptno FROM emp);
语句B:SELECT dname, deptno FROM dept WHERE NOT EXISTS
(SELECT deptno FROM emp WHERE dept.deptno = emp.deptno);
这两条查询语句实现的结果是相同的,但是执行语句A的时候,ORACLE会对整个emp表进行扫描,没有使用建立在emp表上的deptno索引,执行语句B的时候,由于在子查询中使用了联合查询,ORACLE只是对emp表进行的部分数据扫描,并利用了deptno列的索引,所以语句B的效率要比语句A的效率高一些 。
2、2、选择联合查询的联合次序 。考虑下面的例子:
SELECT stuff FROM taba a, tabb b, tabc c
WHERE a.acol between :alow and :ahigh
AND b.bcol between :blow and :bhigh
AND c.ccol between :clow and :chigh
AND a.key1 = b.key1
AMD a.key2 = c.key2;
这个SQL例子中,程序员首先需要选择要查询的主表 , 因为主表要进行整个表数据的扫描,所以主表应该数据量最?。岳又斜鞟的acol列的范围应该比表B和表C相应列的范围小 。
3、3、在子查询中慎重使用IN或者NOT IN语句,使用where (NOT) exists的效果要好的多 。
4、4、慎重使用视图的联合查询,尤其是比较复杂的视图之间的联合查询 。一般对视图的查询最好都分解为对数据表的直接查询效果要好一些 。
5、5、可以在参数文件中设置SHARED_POOL_RESERVED_SIZE参数,这个参数在SGA共享池中保留一个连续的内存空间,连续的内存空间有益于存放大的SQL程序包 。
6、6、ORACLE公司提供的DBMS_SHARED_POOL程序可以帮助程序员将某些经常使用的存储过程“钉”在SQL区中而不被换出内存,程序员对于经常使用并且占用内存很多的存储过程“钉”到内存中有利于提高最终用户的响应时间 。
CPU参数的调整
CPU是服务器的一项重要资源,服务器良好的工作状态是在工作高峰时CPU的使用率在90%以上 。如果空闲时间CPU使用率就在90%以上,说明服务器缺乏CPU资源,如果工作高峰时CPU使用率仍然很低,说明服务器CPU资源还比较富余 。
使用操作相同命令可以看到CPU的使用情况,一般UNIX操作系统的服务器,可以使用sar –u命令查看CPU的使用率 , NT操作系统的服务器,可以使用NT的性能管理器来查看CPU的使用率 。
数据库管理员可以通过查看v$sysstat数据字典中“CPU used by this session”统计项得知ORACLE数据库使用的CPU时间 , 查看“OS User level CPU time”统计项得知操作系统用户态下的CPU时间,查看“OS System call CPU time”统计项得知操作系统系统态下的CPU时间,操作系统总的CPU时间就是用户态和系统态时间之和 , 如果ORACLE数据库使用的CPU时间占操作系统总的CPU时间90%以上,说明服务器CPU基本上被ORACLE数据库使用着,这是合理,反之,说明服务器CPU被其它程序占用过多 , ORACLE数据库无法得到更多的CPU时间 。
数据库管理员还可以通过查看v$sesstat数据字典来获得当前连接ORACLE数据库各个会话占用的CPU时间,从而得知什么会话耗用服务器CPU比较多 。
【oracle如何优化数据 优化oracle sql 语句性能的方法】出现CPU资源不足的情况是很多的:SQL语句的重解析、低效率的SQL语句、锁冲突都会引起CPU资源不足 。
1、数据库管理员可以执行下述语句来查看SQL语句的解析情况:
SELECT * FROM V$SYSSTAT
WHERE NAME IN
('parse time cpu', 'parse time elapsed', 'parse count (hard)');
这里parse time cpu是系统服务时间,parse time elapsed是响应时间,用户等待时间
waite time = parse time elapsed – parse time cpu
由此可以得到用户SQL语句平均解析等待时间=waite time / parse count 。这个平均等待时间应该接近于0,如果平均解析等待时间过长,数据库管理员可以通过下述语句
SELECT SQL_TEXT, PARSE_CALLS, EXECUTIONS FROM V$SQLAREA
ORDER BY PARSE_CALLS;
来发现是什么SQL语句解析效率比较低 。程序员可以优化这些语句,或者增加ORACLE参数SESSION_CACHED_CURSORS的值 。
2、数据库管理员还可以通过下述语句:
SELECT BUFFER_GETS, EXECUTIONS, SQL_TEXT FROM V$SQLAREA;
查看低效率的SQL语句 , 优化这些语句也有助于提高CPU的利用率 。
3、3、数据库管理员可以通过v$system_event数据字典中的“latch free”统计项查看ORACLE数据库的冲突情况,如果没有冲突的话,latch free查询出来没有结果 。如果冲突太大的话 , 数据库管理员可以降低spin_count参数值,来消除高的CPU使用率 。
内存参数的调整
内存参数的调整主要是指ORACLE数据库的系统全局区(SGA)的调整 。SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区 。
1、1、共享池由两部分构成:共享SQL区和数据字典缓冲区 , 共享SQL区是存放用户SQL命令的区域,数据字典缓冲区存放数据库运行的动态信息 。数据库管理员通过执行下述语句:
select (sum(pins - reloads)) / sum(pins) "Lib Cache"from v$librarycache;
来查看共享SQL区的使用率 。这个使用率应该在90%以上,否则需要增加共享池的大小 。数据库管理员还可以执行下述语句:
select (sum(gets - getmisses - usage - fixed)) / sum(gets) "Row Cache" from v$rowcache;
查看数据字典缓冲区的使用率,这个使用率也应该在90%以上,否则需要增加共享池的大小 。
2、2、数据缓冲区 。数据库管理员可以通过下述语句:
SELECT name, valueFROM v$sysstatWHERE name IN ('db block gets', 'consistent gets','physical reads');
来查看数据库数据缓冲区的使用情况 。查询出来的结果可以计算出来数据缓冲区的使用命中率=1 - ( physical reads / (db block getsconsistent gets) ) 。
这个命中率应该在90%以上,否则需要增加数据缓冲区的大小 。
3、3、日志缓冲区 。数据库管理员可以通过执行下述语句:
select name,value from v$sysstat where name in ('redo entries','redo log space requests');查看日志缓冲区的使用情况 。查询出的结果可以计算出日志缓冲区的申请失败率:
申请失败率=requests/entries,申请失败率应该接近于0 , 否则说明日志缓冲区开设太小,需要增加ORACLE数据库的日志缓冲区 。
oracle如何优化数据的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于优化oracle sql 语句性能的方法、oracle如何优化数据的信息别忘了在本站进行查找喔 。

    推荐阅读