Oracle性能调优
- 格式:docx
- 大小:89.26 KB
- 文档页数:8
oracle数据库性能调优⼀:注意WHERE⼦句中的连接顺序:ORACLE采⽤⾃下⽽上的顺序解析WHERE⼦句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最⼤数量记录的条件必须写在WHERE⼦句的末尾.尤其是“主键ID=?”这样的条件。
⼆: SELECT⼦句中避免使⽤ ‘ * ‘:ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个⼯作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
简单地讲,语句执⾏的时间越短越好(尤其对于系统的终端⽤户来说)。
⽽对于查询语句,由于全表扫描读取的数据多,尤其是对于⼤型表不仅查询速度慢,⽽且对磁盘IO造成⼤的压⼒,通常都要避免,⽽避免的⽅式通常是使⽤索引Index。
三:使⽤索引的优势与代价。
优势:1)索引是表的⼀个概念部分,⽤来提⾼检索数据的效率,ORACLE使⽤了⼀个复杂的⾃平衡B-tree结构. 通常,通过索引查询数据⽐全表扫描要快. 当ORACLE找出执⾏查询和Update语句的最佳路径时, ORACLE优化器将使⽤索引. 同样在联结多个表时使⽤索引也可以提⾼效率. 2)另⼀个使⽤索引的好处是,它提供了主键(primary key)的唯⼀性验证.。
那些LONG或LONG RAW数据类型, 你可以索引⼏乎所有的列. 通常, 在⼤型表中使⽤索引特别有效. 当然,你也会发现, 在扫描⼩表时,使⽤索引同样能提⾼效率.代价:虽然使⽤索引能得到查询效率的提⾼,但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本⾝也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反⽽会使查询反应时间变慢.。
⽽且表越⼤,影响越严重。
使⽤索引需要注意的地⽅:1、避免在索引列上使⽤NOT , 我们要避免在索引列上使⽤NOT, NOT会产⽣在和在索引列上使⽤函数相同的影响. 当ORACLE”遇到”NOT,他就会停⽌使⽤索引转⽽执⾏全表扫描.2、避免在索引列上使⽤计算.WHERE⼦句中,如果索引列是函数的⼀部分.优化器将不使⽤索引⽽使⽤全表扫描.举例:代码如下:低效:SELECT … FROM DEPT WHERE SAL * 12 > 25000;⾼效:SELECT … FROM DEPT WHERE SAL > 25000/12;3、避免在索引列上使⽤IS NULL和IS NOT NULL避免在索引中使⽤任何可以为空的列,ORACLE性能上将⽆法使⽤该索引.对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录. 如果⾄少有⼀个列不为空,则记录存在于索引中.举例: 如果唯⼀性索引建⽴在表的A列和B列上, 并且表中存在⼀条记录的A,B值为(123,null) , ORACLE将不接受下⼀条具有相同A,B值(123,null)的记录(插⼊). 然⽽如果所有的索引列都为空,ORACLE将认为整个键值为空⽽空不等于空. 因此你可以插⼊1000 条具有相同键值的记录,当然它们都是空! 因为空值不存在于索引列中,所以WHERE⼦句中对索引列进⾏空值⽐较将使ORACLE停⽤该索引.代码如下:低效:(索引失效) SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;⾼效:(索引有效) SELECT … FROM DEPARTMENT WHERE DEPT_CODE >=0;4、注意通配符%的影响使⽤通配符的情况下Oracle可能会停⽤该索引。
Oracle数据库培训Oracle数据库培训:全面提升您的数据库管理技能一、引言Oracle数据库作为全球领先的数据库管理系统,以其卓越的性能、可靠性和安全性,在各个行业中得到了广泛的应用。
为了帮助广大数据库管理员和开发人员更好地掌握Oracle数据库技术,我们特推出Oracle数据库培训课程。
本文将详细介绍本课程的目标、内容、培训方式及预期效果,帮助您全面了解Oracle数据库培训的相关信息。
二、培训目标1.理论与实践相结合:使学员掌握Oracle数据库的基本概念、体系结构、核心功能及高级特性,能够熟练运用Oracle数据库进行数据管理和维护。
2.提升技能水平:通过培训,使学员具备独立进行Oracle数据库安装、配置、优化、备份与恢复的能力。
3.适应企业需求:针对企业实际应用场景,培养学员具备解决实际问题的能力,提高企业数据库管理水平和业务运行效率。
4.考取Oracle认证:帮助学员顺利通过Oracle认证考试,获得Oracle认证数据库管理员(OCP)证书,提升个人职业竞争力。
三、培训内容1.Oracle数据库基础(1)Oracle数据库概述(2)Oracle数据库体系结构(3)SQL语言基础(4)PL/SQL编程2.Oracle数据库管理(1)数据库安装与配置(2)表空间与数据文件管理(3)用户、权限与角色管理(4)备份与恢复策略3.Oracle数据库性能优化(1)SQL优化(2)索引优化(3)分区技术(4)数据库监控与分析4.Oracle数据库高级特性(1)RAC集群技术(2)DataGuard物理备用数据库(3)GoldenGate实时数据复制(4)Oracle数据库安全策略四、培训方式1.面授课程:小班授课,面对面教学,方便学员与讲师互动交流,及时解答疑问。
2.实践操作:课程中安排大量实验环节,确保学员在实际操作中掌握Oracle数据库技术。
3.在线辅导:提供在线学习平台,学员可随时提问,讲师将在第一时间给予解答。
性能调优---------------------方法:一、检查日志是否有错误二、检查参数是否设置正确三、检查系统IO、CPU、内存等利用率,查看哪些占用较高四、检查哪些SQL语句大量占用IO或CPU权衡性能与安全的方面:一、多个控制文件二、一个日志文件组中有多个日志文件三、频繁的执行检查点四、备份数据文件五、频繁的归档六、块检查七、同时执行操作与统计性能调优工具:查看ALTER.LOG中的信息:1、用/ORA- 能查找文件中的错误信息2、要想让ALTER.LOG文件中产生检查点开始与结束信息,得修改参数LOG_CHECKPOINTS_TO_ALERT,将之修改为TRUE。
默认为FALSE。
SQL>ALTER SYSTEM SET LOG_CHECKPOINTS_TO_ALERT = TRUE SCOPE=BOTH;在用户UDUMP目录下的文件中产生监控用户执行信息:方法1、监控自己的操作。
在自己的session中设置参数,这样就能在用户udump目录下生成执行的SQL语句信息SQL>ALTER SESSION SET SQL_TRACE=TRUE;在pl/sql或者sqlplus中,打开一个sql_window。
(1)先运行:alter session set sql_trace=true;(2)再运行你那个返回结果不正确的SQL(3)再运行:alter session set sql_trace=false;(4)马上登陆到机器上,到$ORACLE_BASE/admin/sid/udump目录下。
(5)找到刚生成的.trc文件(假设文件名是 xxx.trc),执行命令转储跟踪文件:tkprof xxx.trc aa.txt。
查看aa.txt文件。
这个文件里面有执行计划。
看看执行计划每一步返回的结果集记录数是不是正确。
方法2、SYS用户监控别的用户执行情况方法3、对所有SESSION进行监控SQL>ALTER SESSION SET SQL_TRACE=TURE;安装STATSPACK一、创建表空间,最少100M二、安装在安装时默认创建了一个用户PERFSTAT,所以密码也可以输入这个选择要将快照存放于哪个表空间使用STATSPACK手动执行生成一次快照,间隔一般为10几分钟为益,中间不要有停机。
oracle性能优化面试题一、概述Oracle性能优化是数据库管理中的重要环节,通过合理的调整和优化,可以提升数据库的运行效率和响应速度,提高系统的稳定性和可用性。
在面试中,常常会涉及到Oracle性能优化相关的问题,下面是一些常见的Oracle性能优化面试题。
二、索引优化1. 请说明什么是索引?索引是一种特殊的数据库对象,它能够加快数据库的查询速度。
索引由一个或多个列组成,它们的值会按照一定的顺序进行排序,并建立索引数据结构以支持快速查找。
2. 如何确定何时创建索引?创建索引需要权衡查询的速度和更新的效率。
一般来说,当查询的频率远远大于更新的频率时,可以考虑创建索引。
同时也需要考虑查询的字段是否经常被使用,以及查询的覆盖度等因素。
3. 请说明常见的索引类型?常见的索引类型包括唯一索引、非唯一索引、主键索引、聚簇索引和非聚簇索引等。
4. 如何选择合适的索引?选择合适的索引需要考虑查询的频率、更新的频率、查询的覆盖度等因素。
同时还需要考虑索引的大小以及对于查询的影响。
三、SQL优化1. 请说明常见的SQL调优手段?常见的SQL调优手段包括使用合适的索引、优化SQL语句的写法、使用合适的连接方式、减少数据库的访问次数等。
2. 如何使用执行计划进行SQL优化?执行计划是Oracle数据库为了优化查询语句而生成的查询执行计划,其中包含了查询的操作步骤、连接方式、访问路径等信息。
可以通过查看执行计划来判断查询是否需要进行优化,并通过优化查询的方式来提升性能。
3. 如何优化大表查询?优化大表查询可以通过分页查询、增加条件过滤、创建合适的索引等方式来进行。
同时也可以考虑对大表进行分区或者分表的方式来提高查询效率。
四、资源优化1. 如何优化内存资源?优化内存资源可以通过调整SGA和PGA的大小来实现。
SGA包括共享池、数据库缓存和重做日志缓冲等,可以通过调整参数来合理分配内存。
PGA是为每个会话分配的私有内存区域,可以通过调整PGA_AGGREGATE_TARGET参数来优化。
常见Oracle数据库优化策略与方法
Oracle数据库优化是提高数据库性能的关键步骤,可以采取多种策略。
以下是一些常见的Oracle数据库优化策略:
1.硬件优化:这是最基本的优化方式。
通过升级硬件,比如增加RAM、使用
更快的磁盘、使用更强大的CPU等,可以极大地提升Oracle数据库的性能。
2.网络优化:通过优化网络连接,减少网络延迟,可以提高远程查询的效率。
3.查询优化:对SQL查询进行优化,使其更快地执行。
这包括使用更有效的
查询计划,减少全表扫描,以及使用索引等。
4.表分区:对大表进行分区可以提高查询效率。
分区可以将一个大表分成多
个小表,每个小表可以单独存储和查询。
5.数据库参数优化:调整Oracle数据库的参数设置,使其适应工作负载,可
以提高性能。
例如,调整内存分配,可以提升缓存性能。
6.数据库设计优化:例如,规范化可以减少数据冗余,而反规范化则可以提
升查询性能。
7.索引优化:创建和维护索引是提高查询性能的重要手段。
但过多的索引可
能会降低写操作的性能,因此需要权衡。
8.并行处理:对于大型查询和批量操作,可以使用并行处理来提高性能。
9.日志文件优化:适当调整日志文件的配置,可以提高恢复速度和性能。
10.监控和调优:使用Oracle提供的工具和技术监控数据库性能,定期进行性
能检查和调优。
请注意,这些策略并非一成不变,需要根据实际情况进行调整。
在进行优化时,务必先备份数据和配置,以防万一。
一,Oracle数据库架构概述Oracle的基本架构由两块结构组合而成:内存结构(Instance)和实体结构(Database)内存结构:指的是在计算机上的一块内存空间,用于用户进行实体结构上的数据存取或数据交换,由于这块空间位于内存中,因此会随着数据库的打开而创建;当数据库关闭时,内存结构也就随之消失。
实体结构:在Oracle里指的是数据实际存放的地方,不论数据库处于打开还是关闭的状态,它永远都会存在于操作系统上。
简单来说,内存结构是暂时的,而实体结构则是永久存在的。
实体结构和内存结构的定义,如图1-1所示。
二,Oracle的内存结构Oracle的内存结构由Oracle实例与其他进程共同组成。
每一个运行的Oracle数据库都与一个数据库实例相联系,实例是我们访问数据库的手段。
实例在操作系统中用ORACLE_SID来标识,在Oracle中用参数INSTANCE_NAME来标识,它们两个的值是相同的。
数据库启动时,系统首先在内存中分配系统全局区(SGA),构成了Oracle的内存结构,然后启动若干个常驻内存的操作系统进程,即组成了Oracle的进程结构,内存区域和后台进程合称为一个Oracle实例。
数据库与实例之间是1对1/n的关系,在非并行的数据库系统中每个Oracle数据库与一个实例相对应;在并行的数据库系统中,一个数据库会对应多个实例,同一时间用户只与一个实例相联系,当某一个实例出现故障时,其他实例自动服务,保证数据库正常运行。
在任何情况下,每个实例都只可以对应一个数据库。
三,Oracle 10g动态内存管理内存是影响数据库性能的重要因素,Oracle8i使用静态内存管理,Oracle 10g使用动态内存管理。
所谓静态内存管理,就是在数据库系统中,无论是否有用户连接,也无论并发用量大小,只要数据库服务在运行,就会分配固定大小的内存;动态内存管理允许在数据库服务运行时对内存的大小进行修改,读取大数据块时使用大内存,小数据块时使用小内存,读取标准内存块时使用标准内存设置。
按照系统对内存使用方法的不同,Oracle数据库的内存可以分为以下几个部分:•系统全局区:SGA(System Global Area)•程序全局区:PGA(Programe Global Area)•排序池:(Sort Area)四,系统全局区SGA(System Global Area)SGA是一组为系统分配的共享的内存结构,可以包含一个数据库实例的数据或控制信息。
如果多个用户连接到同一个数据库实例,在实例的SGA中,数据可以被多个用户共享。
当数据库实例启动时,SGA的内存被自动分配;当数据库实例关闭时,SGA内存被回收。
SGA是占用内存最大的一个区域,同时也是影响数据库性能的重要因素。
SGA主要包括了以下的数据结构:∙数据缓冲(Buffer Cache)∙重做日志缓冲(Redo Log Buffer)∙共享池(Shared Pool)∙Java池(Java Pool)∙大池(Large Pool)∙流池(Streams Pool --- 10g以后才有)∙数据字典缓存(Data Dictionary Cache)∙其他信息(如数据库和实例的状态信息)查看SGA各部分SQL> select * from v$sga;NAME VALUE-------------------- ----------Fixed Size 1375792Variable Size 377487824Database Buffers 679477248Redo Buffers 12992512Fixed Size:oracle 的不同平台和不同版本下可能不一样,但对于确定环境是一个固定的值,里面存储了SGA 各部分组件的信息(数据字典缓存,如数据库和实例的状态信息),可以看作引导建立SGA 的区域。
这部分区域的大小一般小于100K。
Variable Size :包含了共享池、Java池、大池,流池等内存设置Database Buffers :包含数据缓冲。
Redo Buffers :指日志缓冲区,log_buffer。
SGA的重要参数和特性在设置SGA时,有一些很重要的参数,它们设置正确与否,会直接影响到系统的整体性能。
可以通过下面的语句查询SQL> show parameter sga;NAME TYPE VALUE------------------------------------ ----------- -------lock_sga boolean FALSEpre_page_sga boolean FALSEsga_max_size big integer 1Gsga_target big integer 800MSGA_MAX_SIZE:SGA区包括了各种缓冲区和内存池,而大部分都可以通过特定的参数来指定他们的大小。
但是,作为一个昂贵的资源,一个系统的物理内存大小是有限。
尽管对于CPU的内存寻址来说,是无需关系实际的物理内存大小的(关于这一点,后面会做详细的介绍),但是过多的使用虚拟内存导致page in/out,会大大影响系统的性能,甚至可能会导致系统crash。
所以需要有一个参数来控制SGA使用虚拟内存的最大大小,这个参数就是SGA_MAX_SIZE。
当实例启动后,各个内存区只分配实例所需要的最小大小,在随后的运行过程中,再根据需要扩展他们的大小,而他们的总和大小受到了SGA_MAX_SIZE 的限制。
当试图增加一个内存的大小,并且如果这个值导致所有内存区大小总和大于SGA_MAX_SIZE时,oracle会提示错误,不允许修改。
SGA所分配的是虚拟内存,但是,在我们配置SGA时,一定要使整个SGA区都在物理内存中,否则,会导致SGA频繁的页入/页出,会极大影响系统性能。
对于OLTP系统,参考:Oracle 9i引入pga_aggregate_target,可以自动对PGA进行调整;Oracle 10g引入sga_target,可以自动对SGA进行调整;Oracle 11g则对这两部分进行综合,引入memory_target,可以自动调整所有的内存,这就是新引入的自动内存管理特性。
SQL>alter system set memory_target=2G scope=spfile;SQL> alter system set sga_max_size=1G scope=spfile;PRE_PAGE_SGA:oracle实例启动时,会只载入各个内存区最小的大小。
而其他SGA内存只作为虚拟内存分配,只有当进程touch到相应的页时,才会置换到物理内存中。
但我们也许希望实例一启动后,所有SGA都分配到物理内存。
这时就可以通过设置PRE_PAGE_SGA参数来达到目的了。
这个参数的默认值为FALSE,即不将全部SGA置入物理内存中。
当设置为TRUE 时,实例启动会将全部SGA置入物理内存中。
它可以使实例启动达到它的最大性能状态,但是,启动时间也会更长(因为为了使所有SGA都置入物理内存中,oracle进程需要touch所有的SGA页)。
将PRE_PAGE_SGA修改为TRUE,重启实例:SQL>alter system set pre_page_sga=true scope=spfile;再观察启动后Oracle的内存分配情况当参数设置为TRUE时,不仅在实例启动时,需要touch所有的SGA页,并且由于每个oracle进程都会访问SGA区,所以每当一个新进程启动时(在Dedicated Server方式中,每个会话都会启动一个Oracle进程),都会touch 一遍该进程需要访问的所有页。
因此,每个进程的启动时间页增长了。
所以,这个参数的设置需要根据系统的应用情况来设定。
但是,要记住一点:PRE_PAGA_SGA只是在启动时将物理内存分配给SGA,但并不能保证系统在以后的运行过程不会将SGA中的某些页置换到虚拟内存中,也就是说,尽管设置了这个参数,还是可能出现Page In/Out。
如果需要保障SGA不被换出,就需要由另外一个参数LOCK_SGA来控制了LOCK_SGA:上面提到,为了保证SGA都被锁定在物理内存中,而不必页入/页出,可以通过参数LOCK_SGA来控制。
这个参数默认值为FALSE,当指定为TRUE时,可以将全部SGA都锁定在物理内存中。
当然,有些系统不支持内存锁定,这个参数也就无效了。
SGA_TARGET:这里要介绍的时Oracle10g中引入的一个非常重要的参数。
在10g之前,SGA 的各个内存区的大小都需要通过各自的参数指定,并且都无法超过参数指定大小的值,尽管他们之和可能并没有达到SGA的最大限制。
此外,一旦分配后,各个区的内存只能给本区使用,相互之间是不能共享的。
拿SGA中两个最重要的内存区Buffer Cache和Shared Pool来说,它们两个对实例的性能影响最大,但是就有这样的矛盾存在:在内存资源有限的情况下,某些时候数据被cache的需求非常大,为了提高buffer hit,就需要增加Buffer Cache,但由于SGA有限,只能从其他区“抢”过来——如缩小Shared Pool,增加Buffer Cache;而有时又有大块的PLSQL代码被解析驻入内存中,导致Shared Pool不足,甚至出现4031错误,又需要扩大Shared Pool,这时可能又需要人为干预,从Buffer Cache中将内存夺回来。
有了这个新的特性后,SGA中的这种内存矛盾就迎刃而解了。
这一特性被称为自动共享内存管理(Automatic Shared Memory Management ASMM)。
而控制这一特性的,也就仅仅是这一个参数SGA_TARGE。
设置这个参数后,你就不需要为每个内存区来指定大小了。
SGA_TARGET指定了SGA可以使用的最大内存大小,而SGA中各个内存的大小由Oracle自行控制,不需要人为指定。
Oracle可以随时调节各个区域的大小,使之达到系统性能最佳状态的个最合理大小,并且控制他们之和在SGA_TARGET指定的值之内。
一旦给SGA_TARGET指定值后(默认为0,即没有启动ASMM),就自动启动了ASMM 特性。
设置了SGA_TARGET后,以下的SGA内存区就可以由ASMM来自动调整:共享池(Shared Pool)Java池(Java Pool)大池(Large Pool)数据缓存区(Buffer Cache)流池(Streams Pool)对于SGA_TARGET的限制,它的大小是不能超过SGA_MAX_SIZE的大小的。