Oracle数据库开发与性能优化.ppt
- 文档编号:1130066
- 上传时间:2022-10-17
- 格式:PPT
- 页数:43
- 大小:1.12MB
Oracle数据库开发与性能优化.ppt
《Oracle数据库开发与性能优化.ppt》由会员分享,可在线阅读,更多相关《Oracle数据库开发与性能优化.ppt(43页珍藏版)》请在冰豆网上搜索。
2022/10/17,Oracle基础培训,目录,Oracle基础培训Oracle基本结构Oracle数据字典我们能做到的性能优化,Page3,Oracle基本结构-表空间,Page4,Oracle基本结构-内存,db_block_size,db_cache_sizeOracle9之前都是通过参数里面进行指定,oracle10以后可以自动分配sga大小select*fromV$SGAINFO;Showparametersga_target;,Page5,Oracle基本结构-文件,控制文件数据文件日志文件归档日志文件参数文件,Page6,总体结构,Database,Instance,SGA,Redologbuffer,Databuffercache,PMON,DBW0,SMON,LGWR,CKPT,Others,Userprocess,Serverprocess,PGA,Controlfiles,Datafiles,Redologfiles,Archivedlogfiles,Parameterfile,Passwordfile,Page7,Oracle基本结构-程序,DatabaseWriter(DBW0)负责将数据的更改由databasebuffercache写到datafiles。
LogWriter(LGWR)负责将数据更改记录由redologbuffer写到redologfiles.SystemMonitor(SMON)检查数据库的一致性,必要的情况下,在数据库打开时执行恢复。
ProcessMonitor(PMON)用户进程失败时,进程监控程序实现进程恢复。
TheCheckpointProcess(CKPT)负责更新数据库的控制文件(controlfiles)中的状态信息。
在数据缓存永久写入数据库时。
),Page8,数据字典,数据字典是Oracle存放有关数据库信息的地方,其用途是用来描述数据的。
比如一个表的创建者信息,创建时间信息,所属表空间信息,用户访问权限信息等。
当用户在对数据库中的数据进行操作时遇到困难就可以访问数据字典来查看详细的信息。
Oracle中的数据字典有静态和动态之分。
静态数据字典主要是在用户访问数据字典时不会发生改变的,但动态数据字典是依赖数据库运行的性能的,反映数据库运行的一些内在信息,所以在访问这类数据字典时往往不是一成不变的。
以下分别就这两类数据字典来论述。
Page9,静态数据字典,这类数据字典主要是由表和视图组成,应该注意的是,数据字典中的表是不能直接被访问的,但是可以访问数据字典中的视图。
静态数据字典中的视图分为三类,它们分别由三个前缀够成:
user_*、all_*、dba_*。
它们包含了数据库所有对象的定义(表,视图,索引,簇,同义词,序列,过程,函数,程序包,触发器,等等)user_*该视图存储了关于当前用户所拥有的对象的信息。
(即所有在该用户模式下的对象)all_*该试图存储了当前用户能够访问的对象的信息。
(与user_*相比,all_*并不需要拥有该对象,只需要具有访问该对象的权限即可)dba_*该视图存储了数据库中所有对象的信息。
(前提是当前用户具有访问这些数据库的权限,一般来说必须具有管理员权限),Page10,静态数据字典-常用,Dba_tablespacesDba_data_filesDba_tablesDba_usersDba_viewsDba_indexesDba_db_linksDba_free_spaceDba_ind_columnsDba_jobsDba_objectsDba_rollback_segsDba_segmentsDba_sequencesDba_snappshotsDba_synonymsDba_tab_columnsDba_triggersDba_constraintsDba_cons_columns,Page11,动态数据字典,Oracle包含了一些潜在的由系统管理员如SYS维护的表和视图,由于当数据库运行的时候它们会不断进行更新,所以称它们为动态数据字典(或者是动态性能视图)。
这些视图提供了关于内存和磁盘的运行情况,所以我们只能对其进行只读访问而不能修改它们。
Oracle中这些动态性能视图都是以v$开头的视图,比如v$access。
下面就几个主要的动态性能视图进行介绍。
v$access该视图显示数据库中锁定的数据库对象以及访问这些对象的会话对象(session对象)。
Page12,动态数据字典-常用,select*fromv$session;select*fromv$datafile;select*fromv$dbfile;select*fromv$logfile;select*fromv$controlfile;select*fromv$system_parameter;select*fromv$sqlarea;select*fromv$sql_plan;select*fromv$sqltext;select*fromv$process;select*fromv$sysstat;select*fromv$session_wait;-v$session_waitselectsql_textfromv$sqlareawhereaddressin(selectsql_addressfromv$sessionwherepaddrin(selectaddrfromv$processwherespid=:
spid)statspack,Page13,数据库性能设计规范,数据库性能设计规范,Page14,1:
恰当控制事务大小,commit不要过于频繁,说明要根据具体业务合理控制事务的大小,在需要提交时才提交事务,不要无目的减小事务;事务过小,频繁commit会带来以下影响:
程序性能降低,执行时间长,因为需要花费大量时间来等待logfilesync事件;产生的总的redo、undo数量变大;系统总的栓锁数量变大,造成并发能力减弱;由于已commit的undo信息可以被覆盖,因此容易造成ORA-01555错误。
事务过大,会带来以下影响:
长时间占有锁,对其他相关事务造成等待;产生大量undo,造成undo表空间严重扩张或不足。
Page15,2:
在OLTP系统中一定要注意使用绑定变量,不建议的写法:
declaretypetcur_refisrefcursor;cur_objtcur_ref;i_l_startnumberdefaultdbms_utility.get_time;str_l_dummyall_objects.object_name%type;beginforiin1.1000loopopencur_objforselectobject_namefromall_objectswhereobject_id=|i;-未使用绑定变量fetchcur_objintostr_l_dummy;closecur_obj;endloop;dbms_output.put_line(round(dbms_utility.get_time-i_l_start)/100,2)|seconds.);end;,Page16,推荐写法:
declaretypetcur_refisrefcursor;cur_objtcur_ref;i_l_startnumberdefaultdbms_utility.get_time;str_l_dummyall_objects.object_name%type;beginforiin1.1000loopopencur_objforselectobject_namefromall_objectswhereobject_id=:
xusingi;-使用了绑定变量fetchcur_objintostr_l_dummy;closecur_obj;endloop;dbms_output.put_line(round(dbms_utility.get_time-i_l_start)/100,2)|seconds.);end;,Page17,说明OLTP系统的特点是同一个SQL语句的执行频繁度高,因此,减少分析时间和减少消耗在分析上的资源是非常重要的。
不使用绑定变量会引起下面的问题:
严重降低系统的并发能力。
不绑定变量会造成过多的硬分析,过多的硬分析会导致共享池的栓锁争用,而过多的栓锁争用会严重降低系统的并发能力。
容易引起ORA-04031错误。
数据仓库系统的特点是同一SQL语句的执行频繁度低,因此,分析时间和分析所消耗的资源可以忽略,使SQL语句根据实际的数据分布获得一个最佳的执行计划才是最重要的。
因此,数据仓库系统中是否绑定变量并不重要,而且由于OraclePeeking机制的问题,绑定变量可能会引起软分析的SQL语句执行计划不合理的问题。
Page18,3:
谨用或尽量不要使用in/exists、notin/notexists方式,而应该使用直接连接方式替换,【示例】不建议的写法:
-NOTIN方式写法,假设t_tablename2.column1不返回空值:
selectcount(*)fromt_tablename1wherecolumn1notin(selectcolumn1fromt_tablename2);-NOTEXISTS方式写法:
selectcount(*)fromt_tablename1awherenotexists(selectnullfromt_tablename2bwhereb.column1=a.column1);,Page19,推荐写法:
-直接外连接方式写法:
selectcount(*)fromt_tablename1a,t_tablename2bwherea.column1=b.column1(+)andb.column1isnull;,Page20,【示例】如下代码不符合规范:
-IN方式写法:
selectcount(*)fromt_tablename1wherecolumn1in(selectcolumn1fromt_tablename2);-EXISTS方式写法:
selectcount(*)fromt_tablename1awhereexists(selectnullfromt_tablename2bwherea.column1=b.column1);应编写如下:
-直接连接方式写法:
selectcount(*)fromt_tablename1a,t_tablename2bwherea.column1=b.column1;,Page21,说明使用in/exists/notin/notexists方式,要求开发人员必须正确理解其处理机制,并且需要对语句进行细致的测试和优化工作,如果不假思索的拿来使用往往会造成严重的性能问题。
因此,我们通常建议使用直接连接方式进行替换。
Page22,4:
嵌套循环连接中非常大的表作内表(被驱动表)时,其连接字段上需建有索引,说明嵌套循环连接在内表较大时,如果其连接字段无索引,那么每次循环都会对内表进行全表扫描,这样会产生大量的逻辑I/O,语句性能严重下降,在内表连接字段建立索引的目的是为了减少逻辑I/O。
Page23,5:
在返回的结果集大于1万行时,不建议使用嵌套循环连接,应考虑使用哈希连接或排序合并连接进行替换。
说明返回大量结果集时嵌套循环连接的成本较高、效率很低,此时应考虑变换连接方式,特别在使用RBO优化器时,嵌套循环连接的优先级较高,通常需要用“提示”来强制改变连接方式。
Page24,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle 数据库 开发 性能 优化