当前位置:首页>开发>正文

oracle数据库性能优化方法 oracle数据库的性能优化有哪些方法

2023-04-10 18:58:22 互联网 未知 开发

oracle数据库性能优化方法 oracle数据库的性能优化有哪些方法

oracle数据库的性能优化有哪些方法?

你最好买一本专门讲ORACLE性能优化的书,好好看看
1、调整数据库服务器的性能
Oracle数据库服务器是整个系统的核心,它的性能高低直接影响整个系统的性能,为了调整Oracle数据库服务器的性能,主要从以下几个方面考虑:
1.1、调整操作系统以适合Oracle数据库服务器运行
Oracle数据库服务器很大程度上依赖于运行服务器的操作系统,如果操作系统不能提供最好性能,那么无论如何调整,Oracle数据库服务器也无法发挥其应有的性能。
1.1.1、为Oracle数据库服务器规划系统资源
据已有计算机可用资源, 规划分配给Oracle服务器资源原则是:尽可能使Oracle服务器使用资源最大化,特别在Client/Server中尽量让服务器上所有资源都来运行Oracle服务。
1.1.2、调整计算机系统中的内存配置
多数操作系统都用虚存来模拟计算机上更大的内存,它实际上是硬盘上的一定的磁盘空间。当实际的内存空间不能满足应用软件的要求时,操作系统就将用这部分的磁盘空间对内存中的信息进行页面替换,这将引起大量的磁盘I/O操作,使整个服务器的性能下降。为了避免过多地使用虚存,应加大计算机的内存。
1.1.3、为Oracle数据库服务器设置操作系统进程优先级
不要在操作系统中调整Oracle进程的优先级,因为在Oracle数据库系统中,所有的后台和前台数据库服务器进程执行的是同等重要的工作,需要同等的优先级。所以在安装时,让所有的数据库服务器进程都使用缺省的优先级运行。
1.2、调整内存分配
Oracle数据库服务器保留3个基本的内存高速缓存,分别对应3种不同类型的数据:库高速缓存,字典高速缓存和缓冲区高速缓存。库高速缓存和字典高速缓存一起构成共享池,共享池再加上缓冲区高速缓存便构成了系统全程区(SGA)。SGA是对数据库数据进行快速访问的一个系统全程区,若SGA本身需要频繁地进行释放、分配,则不能达到快速访问数据的目的,因此应把SGA放在主存中,不要放在虚拟内存中。内存的调整主要是指调整组成SGA的内存结构的大小来提高系统性能,由于Oracle数据库服务器的内存结构需求与应用密切相关,所以内存结构的调整应在磁盘I/O调整之前进行。
1.2.1、库缓冲区的调整
库缓冲区中包含私用和共享SQL和PL/SQL区,通过比较库缓冲区的命中率决定它的大小。要调整库缓冲区,必须首先了解该库缓冲区的活动情况,库缓冲区的活动统计信息保留在动态性能表v$librarycache数据字典中,可通过查询该表来了解其活动情况,以决定如何调整。

Select sum(pins),sum(reloads) from v$librarycache

Pins列给出SQL语句,PL/SQL块及被访问对象定义的总次数;Reloads列给出SQL 和PL/SQL块的隐式分析或对象定义重装载时在库程序缓冲区中发生的错误。如果sum(pins)/sum(reloads) ≈0,则库缓冲区的命中率合适;若sum(pins)/sum(reloads)>1, 则需调整初始化参数 shared_pool_size来重新调整分配给共享池的内存量。
1.2.2、数据字典缓冲区的调整
数据字典缓冲区包含了有关数据库的结构、用户、实体信息。数据字典的命中率,对系统性能影响极大。数据字典缓冲区的使用情况记录在动态性能表v$librarycache中,可通过查询该表来了解其活动情况,以决定如何调整。

Select sum(gets),sum(getmisses) from v$rowcache

Gets列是对相应项请求次数的统计;Getmisses 列是引起缓冲区出错的数据的请求次数。对于频繁访问的数据字典缓冲区,sum(getmisses)/sum(gets)<10%~15%。若大于此百分数,则应考虑增加数据字典缓冲区的容量,即需调整初始化参数shared_pool_size来重新调整分配给共享池的内存量。
1.2.3、缓冲区高速缓存的调整
用户进程所存取的所有数据都是经过缓冲区高速缓存来存取,所以该部分的命中率,对性能至关重要。缓冲区高速缓存的使用情况记录在动态性能表v$sysstat中,可通过查询该表来了解其活动情况,以决定如何调整。

Select name,value from v$sysstat where name in (dbblock gets,consistent gets,physical reads)

dbblock gets和consistent gets的值是请求数据缓冲区中读的总次数。physical reads的值是请求数据时引起从盘中读文件的次数。从缓冲区高速缓存中读的可能性的高低称为缓冲区的命中率,计算公式:

Hit Ratio=1-(physical reds/(dbblock gets consistent gets))

如果Hit Ratio<60%~70%,则应增大db_block_buffers的参数值。db_block_buffers可以调整分配给缓冲区高速缓存的内存量,即db_block_buffers可设置分配缓冲区高速缓存的数据块的个数。缓冲区高速缓存的总字节数=db_block_buffers的值*db_block_size的值。db_block_size 的值表示数据块大小的字节数,可查询 v$parameter 表:

select name,value from v$parameter where name=db_block_size

在修改了上述数据库的初始化参数以后,必须先关闭数据库,在重新启动数据库后才能使新的设置起作用。

如何提高oracle数据库的性能

在公路建设中,通过建立多条车道可以提高道路的流量。其实这个道理在Oracle数据库中也行得通。即可以将关键数据文件存储在多块硬盘上,以提高Oracle数据库的性能。可惜的是,不少数据库管理员没有意识到这一点。在这篇文章中笔者就以Oracle11G为例,说明如何通过在硬盘之间分布关键数据文件来提高性能。 一、在硬盘之间分布关键数据文件的基本原则。
在传统的文件系统上(即不是在裸机上)部署Oracle数据库,可以通过将关键的数据文件分布到多个可用的文件系统上或者不同的硬盘上来提高数据库的性能。具体的来说,需要遵循如下几个原则。
一是对于表来说,往往包含两个部分,即基本表与索引表。只要为基本表中的字段创建了索引,其对应的就有一张索引表。当用户访问表中的数据时,应用系统需要同时访问到索引表与数据表。此时我们可以将这两张表比喻成两辆车。如果现在只有一个车道(即将他们同时存放在一个硬盘或者文件系统中),那么两辆车必须前后行使。而如果现在有两个车道(即将基本表与其相对应的索引表存放在不同的硬盘或者文件系统中),那么这两辆车就可以并排行使。显然,后者的效率更高。为此笔者建议,可将经常需要访问的表和与之对应的索引表分开来存放。
二是可以将日志文件也分开来存放。不光光是数据表与索引表存在着这种状况。其实在日志文件管理中也是如此。只要条件允许,那么最好能够将联机重做日志和归档日志与其它数据文件存放在不同的硬盘或者文件系统上。因为当用户往数据库中写入数据时,需要同时往数据文件与重做日志文件中写入数据。此时如果将它们分开来存放,那么就相当于有了多条车道,分别往不同的文件中写入数据。这无疑就可以提高数据写入的效率,从而提高数据库的性能。
二、哪些文件最好能够分开存放?
在讲到硬盘之间分布关键数据文件的基本原则的时候,笔者举了几个需要分开存放的几个案例。但是在实际工作中,并不仅仅局限于上面提到的这些文件。笔者认为,如果条件允许的话,那么可以考虑将如下文件放置在不同的硬盘上。
一是表空间,如临时表空间、系统表空间、UNDO表空间等等。这三个表空间可能系统会同时进行访问。为此需要将其分开来存放。二是数据文件和索引文件。上面提到过,需要将经常访问的数据文件与其对应的索引文件存放在不同的硬盘上。因为这两类文件在访问数据时也可能会同时访问到。三是操作系统盘与数据库文件单独存放。显然Oracle系统肯定是与操作系统同时运行的。为了避免他们之间的I/Q冲突,就需要将Oracle部署在操作系统盘以外的磁盘上。四是联机重做日志文件。这个文件比较复杂,不但要将其与其他文件分开来存放。而且还需要注意的是,最好能够将其存放在性能最佳的硬盘上。
最后需要说明的一点是,增加磁盘也会增加成本。这不光光是购买磁盘所需要的花费,还包括管理的成本。所以这之间也会涉及到成本与性能之间的一个均衡问题。如果企业的数据不是很多,或者主要是涉及到查询操作,那么这么设计的话,就可能不怎么合理。因为投入要大于回报。
三、如何确定是否需要将文件分开来存放?
在实际工作中,企业的数据是一个从少到多的过程。也就是说,刚开始使用数据库的时候,可能数据量比较少,此时出于成本的考虑,没有将相关文件存放在不同的磁盘上。但是随着工作的深入,用户会发现数据库的性能在逐渐的降低。此时管理员就需要考虑,能够采取这种多建车道的措施,来提高数据库性能。当然在采取这个措施之前,管理员需要先进性评估。此时评估所需要用到的一个指标就是磁盘的I/O争用。
磁盘争用通常发生在有多个进程试图同时访问一个物理磁盘的情况下。如现在用户需要访问某个数据表中的数据,此时系统需要访问索引文件与数据表文件。如果将它们放置在同一磁盘上,那么在访问时就会发生I/O冲突。所以评估I/O冲突的严重程度,可以帮我们来确定是否需要将关键文件存放在不同的磁盘上。
将I/O平均的分布到多个可用的磁盘上,这可以有效的减少磁盘之间的争用情况,提高数据存储与读取的性能。从而提高Oracle等应用程序的效率。在实际工作中,数据库控制文件中有两个参数可以用来帮助我们评估这个指标。这两个参数是文件平均读取时间和文件平均写入时间。不过在使用这两个参数的时候,其只评估所有与数据库相关联的文件。管理员如果有需要的话,也可以通过下面的查询语句来查询数据文件是否存在I/O问题。查询的语法与结果如下图所示:
从如上的查询结果中可以看出某个数据文件是否繁忙,数据文件之间是否存在着/I/O冲突文件。这里需要注意的是,这个结果是一个动态的结果。在不同的时刻、用户进行不同的操作时往往会得出不同的结论。为此笔者建议,在使用这个数据的时候,最好能够多跟踪几次。然后分析多次运行的结果。只有如此,才能够得到比较合乎情理的判断。 通常情况下,管理员根据上面的结果可以得出三种结论。
第一种结论是上面这些数据文件都不是很忙。即文件的平均读取时间与写入时间都比较短,表示这两个文件都是比较空闲的。此时正常情况下,数据库的性能应该是不错的。也就是说,如果此时数据库的性能不理想的话,那么就不是磁盘的I/O所造成的。管理员应该从其他角度来改善数据库的性能。
第二种结论是每个数据库文件都非常的繁忙。此时有可能是读取时间或者写入时间比较长,或者说两个时间都比较长。当多个数据文件同时比较繁忙并且他们处于同一磁盘的话,那么管理员就需要考虑购买新的磁盘,然后将上面提到的这些关键文件重新整理,让他们部署在不同的磁盘上。

第三种结论是某几个特定的数据文件比较繁忙,而其他数据文件还可以。此时管理员如果成本受到限制,那么也不需要重新购买硬盘。在磁盘上的物理写入和读取次数上如果出现比较大的差异,就表明某个磁盘负载过大,即有很严重的I/O冲突。此时最好能够将这个磁盘中的文件进行调整,如将某些文件移动到另外的一块I/O相对不怎么严重的磁盘上。不过在采取这个操作的时候,需要注意一点。对于联机重做日志文件来说,即使其所在的磁盘I/O冲突比较低,或者访问这个文件的时间比较短,但是也不建议将其他数据文件转移到其所在的磁盘上来。因为通常情况下,为了保障数据库的性能,我们都建议将联机重做日志文件单独存放,并且还需要讲起放置在性能比较高的硬盘上。
总之,将关键的Oracle数据库文件分开放置。如此的话可以有效避免磁盘争用成为Oracle数据库系统的性能瓶颈。

怎样修改oracle数据库的优化模式

Oracle的优化器共有两种的优化方式,即基于规则的优化方式(Rule-Based Optimization,简称为RBO)和基于代价的优化方式(Cost-Based Optimization,简称为CBO) A、RBO方式:优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则。

ORACLE数据库性能优化包括哪几个部分

1. 应用架构优化,主要优化应用对数据库的调用,数据库的数据结构,这个是对系统性能提高最多的部分,一般在系统架构时期要做好,后期很浪费人力
2. oracle实例配置优化,主要优化实例的内存使用,IO性能

3. sql语句优化,主要通过修改sql的优化查询速度,表索引的合理性
4. 硬件架构,提高硬盘的IO速度,redo的磁盘分布,硬盘的raid,rac通信网速等。
一时就想到这么多

如何对Oracle进行优化

Oracle有很多值得学习的地方,这里我们主要介绍Oracle优化,包括介绍可变参数的Oracle优化等方面。数据库系统和操作系统一样,在计算机上安装成功后,还需要进一步配置和优化,从而使其具有更强大的功能和运行在最佳状态。如果在设计阶段因为各种因素没有进行较为合理的配置和计划,那么就需要在后期对数据库系统进行优化。
数据库系统性能的优化,除了在设计阶段对其逻辑存储结构和物理存储结构设计进行优化,使之在满足需求条件下,时空开销性能最佳外,还可在运行阶段,采取一些优化措施,使系统性能最佳。本专题所讨论的性能优化主要指运行阶段的性能优化,即讨论如何使用Oracle所提供的优化手段来提高系统性能。大多数性能问题并不是一种孤立的症状,而是系统设计的结果,因此性能优化就集中在那些导致不可接受特征的同一的、固定的和潜在的问题上。优化是数据库设计中“计划”、 “设计”、“监视”和“优化”四大步骤的最后一步。除了用Oracle优化器来优化数据库的性能外,DBA还可通过Oracle优化的参数设置等手段来优化数据库的性能,对参数的细微优化便能影响系统整体性能。

如何对Oracle sql 进行性能优化的调整

在SQL查询中,为了提高查询的效率,我们常常采取一些措施对查询语句进行SQL性能优化。本文我们总结了一些优化措施,接下来我们就一一介绍。
1.查询的模糊匹配
尽量避免在一个复杂查询里面使用 LIKE %parm1%—— 红色标识位置的百分号会导致相关列的索引无法使用,最好不要用。
解决办法:
其实只需要对该脚本略做改进,查询速度便会提高近百倍。改进方法如下:
a、修改前台程序——把查询条件的供应商名称一栏由原来的文本输入改为下拉列表,用户模糊输入供应商名称时,直接在前台就帮忙定位到具体的供应商,这样在调用后台程序时,这列就可以直接用等于来关联了。
b、直接修改后台——根据输入条件,先查出符合条件的供应商,并把相关记录保存在一个临时表里头,然后再用临时表去做复杂关联。
2.索引问题
在做性能跟踪分析过程中,经常发现有不少后台程序的性能问题是因为缺少合适索引造成的,有些表甚至一个索引都没有。这种情况往往都是因为在设计表时,没去定义索引,而开发初期,由于表记录很少,索引创建与否,可能对性能没啥影响,开发人员因此也未多加重视。然一旦程序发布到生产环境,随着时间的推移,表记录越来越多。这时缺少索引,对性能的影响便会越来越大了。
法则:不要在建立的索引的数据列上进行下列操作:
避免对索引字段进行计算操作
避免在索引字段上使用not,<>,!=
避免在索引列上使用IS NULL和IS NOT NULL
避免在索引列上出现数据类型转换
避免在索引字段上使用函数
避免建立索引的列中使用空值
3.复杂操作
部分UPDATE、SELECT 语句 写得很复杂(经常嵌套多级子查询)——可以考虑适当拆成几步,先生成一些临时数据表,再进行关联操作。
4.update
同一个表的修改在一个过程里出现好几十次,如:

update table1 set col1=... where col2=... update table1 set col1=... where col2=... ...

这类脚本其实可以很简单就整合在一个UPDATE语句来完成(前些时候在协助xxx项目做性能问题分析时就发现存在这种情况)
5.在可以使用UNION ALL的语句里,使用了UNION
UNION 因为会将各查询子集的记录做比较,故比起UNION ALL ,通常速度都会慢上许多。一般来说,如果使用UNION ALL能满足要求的话,务必使用UNION ALL。还有一种情况大家可能会忽略掉,就是虽然要求几个子集的并集需要过滤掉重复记录,但由于脚本的特殊性,不可能存在重复记录,这时便应该使用 UNION ALL,如xx模块的某个查询程序就曾经存在这种情况,见,由于语句的特殊性,在这个脚本中几个子集的记录绝对不可能重复,故可以改用UNION ALL)。
6.在WHERE 语句中,尽量避免对索引字段进行计算操作
这个常识相信绝大部分开发人员都应该知道,但仍有不少人这么使用,我想其中一个最主要的原因可能是为了编写写简单而损害了性能,那就不可取了。9月份在对XX系统做性能分析时发现,有大量的后台程序存在类似用法,如:where trunc(create_date)=trunc(:date1),虽然已对create_date 字段建了索引,但由于加了TRUNC,使得索引无法用上。此处正确的写法应该是where create_date>=trunc(:date1) and create_date< pre=""><>或者是where create_date between trunc(:date1) and trunc(:date1) 1-1/(24*60*60)。
注意:因between 的范围是个闭区间(greater than or equal to low value and less than or equal to high value.),故严格意义上应该再减去一个趋于0的小数,这里暂且设置成减去1秒(1/(24*60*60)),如果不要求这么精确的话,可以略掉这步。
7.对Where 语句的法则
7.1 避免在WHERE子句中使用in,not in,or 或者having。
可以使用 exist 和not exist代替in和not in。
可以使用表链接代替 exist。Having可以用where代替,如果无法代替可以分两步处理。
例子

SELECT * FROM ORDERS WHERE CUSTOMER_NAME NOT IN (SELECT CUSTOMER_NAME FROM CUSTOMER)
优化

SELECT * FROM ORDERS WHERE CUSTOMER_NAME not exist (SELECT CUSTOMER_NAME FROM CUSTOMER)

7.2 不要以字符格式声明数字,要以数字格式声明字符值。(日期同样)否则会使索引无效,产生全表扫描。
例子使用:
SELECT emp.ename, emp.job FROM emp WHERE emp.empno = 7369
--不要使用:
SELECT emp.ename, emp.job FROM emp WHERE emp.empno = 7369
8.对Select语句的法则
在应用程序、包和过程中限制使用select * from table这种方式。看下面例子
--使用
SELECT empno,ename,category FROM emp WHERE empno = 7369
--而不要使用
SELECT * FROM emp WHERE empno = 7369
9. 排序
避免使用耗费资源的操作,带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎 执行,耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序。
10.临时表
慎重使用临时表可以极大的提高系统性能。
关于SQL性能优化的知识就介绍到这里了