oracle 笔试(通用7篇)
一个半小时的PAC考试,分10个section,从头到尾都是单选,总体上看时间比较紧,主要内容包括编程原理(程序流程)、数理运算能力、数字敏感度、信息技术常识和英文。
虽说有点不利于非技术类考生,但实际上它的编程原理并不是针对某种特定程序语言的,其实就是考逻辑,不需要任何编程知识,
信息技术常识就是计算机三级信息技术的内容,只有一点点题,随便猜猜吧。毕竟人家招的是Graduate Trainee,包括技术类和非技术类,偶是学会计的,觉得还可以做。
英语分三部分,第一部分考词法超简单,最后一部分考阅读,中间一部分考反义词的`偶做得最快,因为纯粹考单词量,那些单词偶基本都不认识所以涂得最快。
写这个笔经是因为下周末还有一场笔试,一样的形式。没申请的同学这周抓紧了。
安装Oracle 10g 数据库
步骤:
1、先装虚拟机
2、在虚拟机中装一个windows xp 操作系统
3、安装数据库Oracle 10g 在windows xp 中(注意安装时的细节)
注释:由于Oracle 10g 数据库卸载比较麻烦,所以我们选择在虚拟机中安装 虚拟机的安装:
从官网上下载一个虚拟机,然后进行安装,根据提示一步一步的安装,最后完成。Windows xp 的安装:
在虚拟机中找到windows 镜像的路径,点击确定。然后运行,进行安装。分配空间时,不能分的太小,不然Oracle 会跑步起来,硬盘分配不能低于10G,内存不能少于256MB。系统安装完毕以后,在安装一个小工具,就是Vmare Tools 工具,装上这个工具就可以从我们的电脑上拷贝数据了。Oracle 10g 安装:
先把数据库安装文件拷贝到虚拟机中,然后在进行安装。安装时会遇到很多问题,一定要仔细对待。本数据库安装会默认三个用户:sys(默认密码change_on_install)、system(默认密码manager)、scott(默认密码tiger)。默认数据库orcl 在密码设置的时候,首字母必须是英文字母,不能为数字。路径的设置也要注意。安装完成以后,进行测试一下,点击sqlplus,进入这个界面,出现一个登录界面,输入用户名System,你自己设置的密码 ******,主机字符串就不用管了,因为现在你就有一个数据库。进入以后若出现连接成功就说明Oracle 安装成功。心得体会:
终于把 OCP DBA 的课程都考完了,累啊!总的来说ORACLE的认证值得考,本人有CCNP、MCSE证书,但通过DBA的考试,觉得不仅加深了对现代数据库的了解,还丰富了计算机科学的知识结构。我觉得,从某种角度来说,ORACLE数据库甚至具备一些操作系统的功能。
??ORACLE的考试,要记住的东西相当多,考试要求基本上是以原始的命令行方式,而不是图形界面操作,因此表的名字,以及相应的scripts相当多是要求记住的,整个DBA考试,光书中提到的table就有数百个之多,我想这主要是因为过去ORACLE主要是在UNIX系统上运行的,可供使用的图形界面软件不多!这也相应地增加了考试的难度!整个考试重点在于对概念的理解,对细节考得不是太多,我想国外的考试都是这样吧!例如问lock contention 的原因是什么?然而,oracle的概念可是五花八门,数不胜数!
??最初一门SQL是基础。这门不难,只要多点上机实践,一般都没问题,但是pl/sql的许多概念,例如触发器等,要弄清楚。如果有数据库开发的基础,这门课是小菜一碟!
??第二门,《数据库管理》。可算上是ORACLE的基础课了,也是核心课程,课程中提到了许多在以后的课程中反复使用的概念与方法。例如,instance及相应的进程(pmon,smon,arc0,dbw0,等)。数据库的物理结构由dbf文件,控制文件,redo log文件,archive文件等,
数据库的逻辑构成由tablespace,segment,extent,block等。需要理解的是ORACLE的基本运行过程,oracle读取parameter file 的设置在physical memory中构造instance, 通过dbwr进程将SGA的database buffer中的数据定期或不定期地写入datafile,同时也将sql指令由lgwr进程记录在redolog文件中,系统定期将redolog文件copy成为archive文件,系统为了transactional的需要,提供了rollback segment ,这样保证了read consistence。
??这一门的概念相当多,令人觉得oracle的存储概念相当细,例如对segment 的block还分了pctfree 和 pctuse,顺便也提到了row migrate 与row chain的概念,可见oracle对逻辑及物理对象的管理能够非常细致!再有,scn不仅储存在control file 中,还在datafile的header中,scn的引入是为了保证系统各文件之间的`协调与连惯。本门许多命令的可选参数基本是不用记的,太多了!也不怎么考,这些参数在《性能调整》一门中则作了详细介绍!大家只要记住最基本的语句就行了!
1、先点击Cancel进入kettle主界面
依次FILE--NEW--JOB OR TRANSFORMATION,在transformation页面下,点击左边的【Main Tree】【主对象树】,双击【DB连接】,进行
数据库连接配置 插播我的kettle配置: 我的版本是kettle4.4 环境变量设置:KETTLE_HOME F:ToolsKettle4.4data-integration
Path % KETTLE_HOME% 首先找到
Kettle 的主程序启动方式:运行 data-integrationSpoon.bat。
Kettle 默认不带 Oracle 驱动。于是我把 Oracle 的 JDBC 驱动 ojdbc14.jar/ojdbc14_g/ojdbc14dms/ojdbc14dms_g.jar 放到了 Kettle 的目录data-integrationlibextJDBC
我遇到的连接错误:
错误连接数据库 [orcl] : org.pentaho.di.core.exception.KettleDatabaseException: Error occured while trying to connect to the database
Error connecting to database:(using class oracle.jdbc.driver.OracleDriver)Io 异常: The Network Adapter could not establish the connection
org.pentaho.di.core.exception.KettleDatabaseException: Error occured while trying to connect to the database
Error connecting to database:(using class oracle.jdbc.driver.OracleDriver)Io 异常: The Network Adapter could not establish the connection
3、原因:
--
1、connection name:orcl【这个是我的数据库名,连接时我也用这个名字,DB名字也是这个】
--
2、Host-name:说实话,我重装系统之后还真没注意主机名是什么,我是在
Oracle的优化器共有3种:
a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性),
设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS 。你当然也在SQL句级或是会话(session)级对其进行覆盖。
为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性。
如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关。如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器。
在缺省情况下,Oracle采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan), 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。
2. 访问Table的方式
Oracle 采用两种访问表中记录的方式:
a. 全表扫描:
全表扫描就是顺序地访问表中每条记录。Oracle采用一次读入多个数据块(database block)的方式优化全表扫描。
b. 通过ROWID访问表:
你可以采用基于ROWID的访问方式情况,提高访问表的效率, ROWID包含了表中记录的物理位置信息。Oracle采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系。通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高。
3. 共享SQL语句
为了不重复解析相同的SQL语句,在第一次解析之后, Oracle将SQL语句存放在内存中.这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, Oracle就能很快获得已经被解析的语句以及最好的执行路径。Oracle的这个功能大大地提高了SQL的执行性能并节省了内存的使用。
可惜的是Oracle只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询,
数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了。当你向Oracle 提交一个SQL语句,Oracle会首先在这块内存中查找相同的语句。
这里需要注明的是,Oracle对两者采取的是一种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等)。
共享的语句必须满足三个条件:
A. 字符级的比较:
当前被执行的语句和共享池中的语句必须完全相同。
例如:
SELECT * FROM EMP;
和下列每一个都不同:
SELECT * from EMP;
Select * From Emp;
SELECT * FROM EMP;
B. 两个语句所指的对象必须完全相同:
例如:
用户 对象名 如何访问
Jack sal_limit private synonym
Work_city public synonym
Plant_detail public synonym
Jill sal_limit private synonym
Work_city public synonym
Plant_detail table owner
考虑一下下列SQL语句能否在这两个用户之间共享。
C. 两个SQL语句中必须使用相同的名字的绑定变量(bind variables):
例如:
第一组的两个SQL语句是相同的(可以共享),而第二组中的两个语句是不同的(即使在运行时,赋于不同的绑定变量相同的值)。
a.
select pin , name from people where pin = :blk1.pin;
select pin , name from people where pin = :blk1.pin;
b.
select pin , name from people where pin = :blk1.ot_ind;
一个好的程序,必然联系着一个庞大的数据库网路...今年我们学习了 oracle数据库这门课程,起初的我,对这个字眼是要多陌生有多陌生,后来上课的时候听一会老师讲课,偶尔再跟上上机课,渐渐的学会了不少东西,但我感觉,我学到的仍是一些皮毛而已,怀着疑惑和求知的心态,我在网上搜索了关于 oracle数据库的一些知识。
1.ORACLE的特点: 可移植性 ORACLE采用C语言开发而成,故产品与硬件和操作系统具有很强的独立性。从大型机到微机上都可运行ORACLE的产品。可在UNIX、DOS、Windows等操作系统上运行。可兼容性 由于采用了国际标准的数据查询语言SQL,与IBM的SQL/DS、DB2等均兼容。并提供读取其它数据库文件的间接方法。
可联结性 对于不同通信协议,不同机型及不同操作系统组成的网络也可以运行ORAˉCLE数据库产品。
2.ORACLE的总体结构
(1)ORACLE的文件结构 一个ORACLE数据库系统包括以下5类文件:ORACLE RDBMS的代码文件。
数据文件 一个数据库可有一个或多个数据文件,每个数据文件可以存有一个或多个表、视图、索引等信息。
日志文件 须有两个或两个以上,用来记录所有数据库的变化,用于数据库的恢复。控制文件 可以有备份,采用多个备份控制文件是为了防止控制文件的损坏。参数文件 含有数据库例程起时所需的配置参数。
(2)ORACLE的内存结构 一个ORACLE例程拥有一个系统全程区(SGA)和一组程序全程区(PGA)。
SGA(System Global Area)包括数据库缓冲区、日志缓冲区及共享区域。
PGA(Program Global Area)是每一个Server进程有一个。一个Server进程起动时,就为其分配一个PGA区,以存放数据及控制信息。
(3)ORACLE的进程结构ORACLE包括三类进程: ①用户进程 用来执行用户应用程序的。
②服务进程 处理与之相连的一组用户进程的请求。
③后台进程 ORACLE为每一个数据库例程创建一组后台进程,它为所有的用户进程服务,其中包括: DBWR(Database Writer)进程,负责把已修改的数据块从数据库缓冲区写到数据库中。LGWR(Log Writer)进程,负责把日志从SGA中的缓冲区中写到日志文件中。
SMON(System Moniter)进程,该进程有规律地扫描SAG进程信息,注销失败的数据库例程,回收不再使用的内存空间。PMON(Process Moniter)进程,当一用户进程异常结束时,该进程负责恢复未完成的事务,注销失败的用户进程,释放用户进程占用的资源。ARCH(ARCHIVER)进程。每当联机日志文件写满时,该进程将其拷贝到归档存储设备上。另外还包括分布式DB中事务恢复进程RECO和对服务进程与用户进程进行匹配的Dnnn进程等。
3.ORACLE的逻辑结构
构成ORACLE的数据库的逻辑结构包括:(1)表空间
(2)5种类型的段(segment)
①数据段;②索引段;③回滚(rollbock)段;④临时段;⑤自举(bootstrap)段。
段的分配单位叫范围(Extent)
表空间(Tablespace)一个数据库划分成的若干逻辑部分称为表空间。一个数据库可以有一个或多个表空间,初始的表空间命名为SYSTEM,每一个逻辑表空间对应于一个或多个物理文件。DBA使用表空间做以下工作: 控制数据库对象,如表、索引和临时段的空间分配。为数据库用户设置空间配额。
利用个别表空间的在线或离线,控制数据的可用性。后备或恢复数据。
通过分配空间,以改进性能。
在每个数据库中都存在SYSTEM表空间,它在建立数据库时自动建立。在该表空间中,包含数据库的数据字典,其中存储全部数据库对象的名字和位置。SYSTEM表空间总是在线的,像其它表空间一样,可以通过增加新的数据库文件来扩大。一个表空间可包含许多表和索引。但一个表和索引不能跨越表空间,可跨越组成表空间的文件。在DB的打开的情况下,DBA利用ALTER TABLESPACE语句,可以实施表空间的在线或离线。SYSTEM表空间必须在线。表空间离线有下列原因: 一般为了使部分数据库不能使用,而允许正常存取数据库其余部分。执行表空间离线备份。
一个离线的表空间,不能被应用用户读或编辑。
可以增加数据文件扩大已有的表空间,也可增加新的表空间使数据库容量增大,或分配空间给某个应用。使用ALFER TABLESPACE ADD FILE语句将另一个数据文件加入到已存在表空间中。使用CREATE TABLESPACE语句可建立一个新的表空间。段(segment)表空间中的全部数据存储在以段划分的数据库空间中。一个段是分配给数据库用于数据存储的范围的集合。数据可以是表、索引或RDBMS所需要的临时数据。段是表空间的下一个逻辑存储的级别。一个段不能跨越一个表空间,但可跨越表空间内的文件。一个数据库最多需要五种段类型: 数据段 一个包含一个表(或聚集)的全部数据,一个表(或聚集)总有一个单个数据段。
索引段 一个索引段包含对一个表(或聚集)建立的一个索引的全部索引数据。一个表可以有一个、多个或者没有索引段,取决于它所拥有的索引个数。一个聚集必须至少有一个索引段,即在聚集码上建立聚集索引。
回滚段 每个DB有一个或多个回滚段。一个回滚段是DB的一部分,它记录在某一情况下被撤消的动作。回滚段用于事务控制和恢复。
临时段 在处理查询时,ORACLE需要临时工作空间,用于存储语句处理的中间结果,这个区称为临时段。
自举段 自举段在SYSTEM表空间中,在数据库建立时建立。它包括数据字典定义,在数据库打开时装入。
4.用户数据库对象
由用户建立的对象驻留在表空间中,含有真正的数据。数据库对象有表、视图、聚集、索引、伪列和序号生成器。
(1)聚集(Cluster)聚集是存储数据的一种可选择的方法。聚集包括存储在一起的一组表,它们共享公共列并经常一起使用。由于内容相关并且物理地存储在一起,存取时间得到改进,存储空间可以减少。聚集是一种优化措施。
聚集对性能的改进,依赖于数据的分布和SQL操作的内容。特别是使用聚集对连接非常有利。可以明显地提高连接的速度。建立聚集命令的基本格式: SQL>CREATE CLUSTER〈聚集名〉(列定义[,…]);利用聚集建立表命令基本格式: SQL>CREATE TABLE〈新表名〉(列定义[,…]CLUSTER〈聚集名〉(聚集列);在聚集码上必须建立一个聚集索引,对于每一数据块上每个聚集码值有一索引项。这个索引必须在DML语句对聚集表操作前建立。建立索引的语句是:CREATE INDEX索引名ON CLUSTER聚集名;(2)序号生成器 序号(SEQUENCE)生成器为表中的单列或多列生成顺序号。利用序号可自动地生成唯一主码。使用SQL语句定义序号,给出一些信息(如序号名、是升序或降序、每个序号间的间隔和其它信息)。所有序号存储在数据字典表中。
所有序号定义存储在数据字典的SEQUENCE表中。用户可以通过字典视图
USER-SE-QUENCES、ALL-SEQUENCES
和DBA-SEQUENCES查询和存取。建立序号生成器的语句是: CREATE SEQUENCE序号生成器名 其它选项。
一旦序号生成器S被定义。可用S.Currval来引用S序号生成器的当前值。用S.nextval产生下一个新的序号并加以引用。
(3)伪列 伪列的行为像表的一列,但不真正存在于表中,在查询时可引用伪列,但伪列不能插入、删除或修改。
5.数据字典
数据字典ORACLE RDBMS最重要的部分之一。数据字典含有一组系统定义的表,只能读,是关于数据库的引用指南。它可提供以下信息:ORACLE用户的用户名;每个用户被授予的权限和角色;实体的名字和定义;完整性约束 为数据库实体分配的空间;通用的数据库结构;审计信息;触发子程序等的存储。数据字典是以表和视图构成的,像其它数据库数据一样,可用SQL语言查询数据字典。
数据字典在DB建立时建立。每当DB进入操作,数据字典就由ORACLE RDBMS负责修改。数据库建立时有两个默认DBA用户:SYS、SYSTEM。SYS持有基本表中的数据。数据字典包含一组基表和相关的视图,可分为以下几类: 类
描 述
DBA-××× 只有DBA可存取的视图,给出数据库中定义的任何实体的信息
USER-××× 对任何用户可用的视图,给出他们自己的实体的信息
ALL-×××
对任何用户可用的视图,给出用户可存取的所有实体的信息
其中×××代表表名或视图名
下面列出的是一些常用的表或视图的名称。(1)DTAB 描述了组或数据字典的所有表。(2)TAB 用户建的所有基本表、视图和同义词。(3)COL 用户创建基本表的所有列的信息。
(4)SYNONYMS 用户可存取的同义名词、专用名和公用名。(5)CATALOG 用户可存取的表、视图、同义词、序列。(6)CONSTRAINTS 用户可存取的约束。(7)INDEXES 用户可存取的表和聚集的序列。(8)OBJECTS 用户可存取的对象。(9)TABLES 用户可存取的表。(10)USERS 查看当前全部用户。(11)VIEWS 查看用户可存取的视图。
(12)SYSTABAUTH 用户对数据对象的使用权限。可以用SQL>SELECT*FROM〈字典表名或视图名〉WHERE〈条件〉来读取有关信息。
可以用SQL>DESCRIBE〈表名〉来查看表的结构定义。但是数据库字典的结构不可改。用DESCRIBE命令还可以查看视图及过程的定义。
6.ORACLE的SQL、PL/SQL与SQL*PLUS 作为ORACLE数据库核心的SQL语言是ANSI和ISO的标准SQL的扩充。用来存储、检索和维护数据库中的信息,并控制对数据库的存取事务。由于RDBMS执行SQL语句时,是一次只执行一条语句,它是非过程化的。这就使得单条的SQL语句使用方便,功能强大。用户只需说明操作目的,不必关心具体操作的实现方法。
但在实际数据库应用开发中,往往要依据前一步对数据库操作的结果或上一个事务提交的情况来确定下一步的操作。故ORACLE推出了一种PL/SQL工具,它扩充了SQL语句,使之具有可进行过程化编程的能力,如循环、分支功能。PL/SQL可支持变量和常量的使用。例如在SELECT查询语句的where子句中可以使用变量来书写条件表达式。SQL*PLUS是ORACLE用来存储、查询、操纵、控制和报告数据库中信息的一个交互式工具。它是一种集编辑、调试、运行于一体的开发环境。在SQL*PLUS的这种运行环境下,既可以使用SQL命令、PL/SQL语句、及SQL*PLUS自己提供的命令,又可以运行由上述三类命令(或语句)编辑而成的命令文件。SQL*PLUS提供的附加命令主要用来编辑、运行上述三类命令及命令文件和对查询结果进行格式化输出等功能。
7.数据库系统的管理
ORACLE作为一个大型的数据系统,通常包含很多用户的数据。在应用开发过程中,有许许多多的各类人员进行开发和应用。所以必须要求有人对数据库系统进行临时管理,并进行数据的备份等工作。这种人被称为数据库管理员(Data Base Administrator)。他们必须理解数据库系统管理,清楚数据库包含的数据内容、运行状况等。
一般说来,DBA不是指具体的人,而是指对数据库可以行使DBA特权的用户。DBA具有如下责任:(1)ORACLE服务器和客户工作站软件的安装和升级;(2)创建基本的数据库存储结构(表空间);(3)创建基本的数据库客体(表、视图、索引);(4)修改数据库结构;(5)给用户授权,维护系统安全;(6)控制和管理用户对数据库的访问;(7)监视和优化数据库的性能;(8)计算数据库信息的后备和恢复;(9)后备和恢复数据库;(10)构造ORACLE服务器,如创建数据库链、客体同义词等。而应用开发人员须完成:(1)应用程序设计;(2)应用的数据库结构设计和修改;(3)为DBA提供必要的信息;(4)完成应用程序的开发。
看了许多关于ORACLE的知识论坛,总算是对ORACLE有个整体的认识,不仅仅是拘泥于课堂上学习的知识而已,虽然自己对ORACLE学习并不是多么的透彻,但是总归多接触点新的东西总是好的。
可以稳定的运行,
oracle数据库优化的根本是
1.尽量减少资源消耗,例如优化sql,减少sql本身的资源消耗
2.如果无法进一步减少资源的消耗,那就让数据尽量靠近cpu,也就是把数据从硬盘转移到内存(内存的读写速度快)
或者换更快的磁盘
本文就简单总结下如何缓存数据和数据库对象(也就是把数据移向内存,提高内存的命中率,以提高整体io速度)
1.缓存数据
2.缓存数据对象的定义,例如package,procedure,pl/sql和sql(也就是cursor)等
上面说的这两种数据就存在oracle最重要的两个部件中share pool和buffer pool中,提高这两个pool的命中率也提高了
io速度,而io又是当今技术发展最慢,系统的最大的瓶颈。
1. 缓存数据
这里说的oracle数据是占大量存储空间的,不是存在数据库字典里的数据;oracle的数据的类型一般为:
SQL>select se.segment_type from dba_segments se group by se.segment_type;
SEGMENT_TYPE
------------------
LOBINDEX
INDEX PARTITION
TABLE PARTITION
NESTED TABLE
ROLLBACK
LOB PARTITION
LOBSEGMENT
INDEX
TABLE
CLUSTER
TYPE2 UNDO
11 rows selected
SQL>
在大部分时候,把这些数据放到内存里,会很大的提升系统的性能
buffer pool分为三个子pool,这三个pool都主要使用LRU算法管理的
default buffer pool:默认所有的数据块都存在这,并遵循本pool的LRU算法
keep buffer pool:如果指定数据块缓存到keep区的,数据块就不太可能因为执行其他一些操作被其他数据块交换出,即使较长时间没使用了,只遵循本pool的LRU
recycle buffer pool:设置recycle是因为有时会有一些大的又教少使用的表的操作,如果不设置单独的缓存区,那么缺省的缓存区中的数据块就被这些偶尔使用的数据换出,它的空间比较小,所以说一般使用完就释放掉了,它也只遵守本pool的LRU算法
以table为例:
修改table的缓存空间
alter table a_user storage(buffer_pool keep) cache/nocache; ---把表a_user缓存到keep buffer pool中最热端/把表a_user从keep buffer pool立刻释放出去
alter table a_user cache/nocache ---把表a_user缓存到default buffer pool中最热端/把表a_user从default buffer pool立刻释放出去
eg:
1)
SQL>alter table a_user storage(buffer_pool keep) cache;
Table altered
2)
SQL>select t.table_name,t.cache,t.buffer_pool from user_tables t where t.table_name=upper(a_user);
TABLE_NAME CACHE BUFFER_POOL
------------------------------ -------------------- -----------
a_user Y KEEP
说明:
user_tables.cache:这个表一旦被读入buffer cache,就会放在链表的热端~ 尽量不被挤出buffer cache
user_tables.buffer_pool:把这个表放入特殊的buffer cache中,这些特殊的buffer cache是独立的
而视图v$db_object_cache.kept:告知是否对象常驻shared pool(yes/no),有赖于这个对象是否已经利用PL/SQL 过程
DBMS_SHARED_POOL.KEEP“保持”(永久固定在内存中)
eg:
SQL>Select oc.NAME,oc.TYPE,oc.KEPT from v$db_object_cache oc where oc.TYPE=TABLE AND OC.OWNER=HPO;
NAME TYPE KEPT
-------------------------------------------------------------------------------- ---------------------------- ----
A_USER TABLE YES
这个v$db_object_cache视图提供对象在library cache(shared pool)中对象统计,提供比v$librarycache更多的细节,并且常用于找出shared pool中的活动对象。
所以你没有使用过对象时,是不存在这个视图里的,使用时用了,才会在这个视图里出现
可以参看三思的动态性能视图介绍: space.itpub.net/7607759/viewspace-22241
例如修改索引的buffer pool
alter index IDX_ORG_TYPE storage(buffer_pool keep) cache;
分区表和分区索引好像不能把每个分区放在不同的buffer pool中,反正我测试通过
2.缓存数据对象的定义,例如package,procedure,pl/sql和sql(也就是cursor)等
上面介绍了把数据尽量缓存在buffer pool中,提高数据在内存的命中率,避免从磁盘读写数据,间接提高系统io能力;
buffer pool缓存的数据是用户最终的目标数据,而把这些用户最终目标数据要传达给用户,就需要oracle用另外一些
动作来完成,而这些动作主要是在share pool中完成的,大概功能有:缓存语句文本,分析代码,执行计划,数据字典
中的表和列的权限定义等;share pool主要也用LRU算法,所以怎样尽量缓存这些数据就是下面要说的
oracle分为sql引擎和pl/sql引擎,分别完成sql和pl/sql的解析等工作,而这里解析又是很耗资源的,所以就要想办法
尽量少解析,使代码重用以提高效率
A。代码的重用
确定是否需要对语句进行(硬)解析时,是先比较语句的哈希值,下面的两种方法有助于获得相同的哈希值,从而可以实现重用代码,提高命中率:
1)开发组的所有成员都使用相同的编码规范(包括大小写,空格,换行等);
2)使用绑定变量(提高命中率的同时可能会产生不够好的执行计划,因为优化器不知道变量的确定值,在有栏位的柱状图统计数据时也不能够利用)。
调整相关初始化参数:
OPEN_CURSOR
这个参数指定每个用户会话能打开的游标最大数量;增大这个值可以减少重新解析会话曾打开的语句的机会,提高命中率,但需要更大的共享池空间。要确保该值足够,增加该值不会对内存造成太大的影响
cursor_space_for_time
缺省是FALSE,如果设置为TRUE,那么SHARED SQL AREA当CURSOR打开的时候,是PIN在共享池里的,不允许被换出(AGEOUT),这样提高了SQL的执行效率,另外PGA中的CURSOR的私有内存部分,执行完SQL后也不关闭,下次执行的时候可以直接使用,节省了内存分配和释放的时间。对于同一个SQL反复被执行的情况,这种设置有助于提高 SQL执行的效率。但是这个参数设置会增加共享池的使用。如果共享池出现不足,或者碎片很严重的情况,使用这个参数会加剧问题, 所以,一般在共享池足够大的情况下才能考虑设为true,设为true时可以减少重解析,提高命中率,加快游标的执行(空间换时间)。
这个参数一般情况不需要打开,一般情况下打开对于系统性能的提升不会很大,对于parse很频繁,而且SQL执行很频繁,共享池碎片较为严重的情况,建议不要使用。当然特殊情况有特殊的用途,否则这个参数也没必要存在了。
session_cached_cursors
缺省是0,也就是不CACHE CURSOR,如果设置了SESSION_CACHED_CURSORS,某个CURSOR被频繁调用,那么当第三次被调用的时候会被CACHE,一个被 CACHE的CURSOR下次再被调用的时候,可以省去PARSE的过程,提高SQL执行的效率,这些缓存也是用LRU算法来管理的。应该注意 SESSION_CACHED_CURSORS的值不能超过OPEN_CURSORS的值。在设置SESSION_CACHED_CURSORS参数之前,首先要确定共享池的大小是否足以支持缓冲这些SQL。因为SESSION_CACHED_CURSORS是针对每个SESSION的,对于拥有几百,甚至上千个SESSION的OLTP系统,设置SESSION_CACHED_CURSORS的时候要十分注意,设置大的 SESSION_CACHED_CURSORS参数,需要比较大的共享池来支持,如果调整了这个参数后出现共享池空间不足的情况,调整共享池的大小或者减少SESSION_CACHED_CURSORS参数就是DBA应该进行的操作
cursor_sharing
定义CURSOR共享的模式,EXCAT(精确),FORCE(强制),SIMILAR(类似),如果采用缺省的(精确),那么系统不自动合并和共享CURSOR,只有书写完全一致的CURSOR才能共享。如果设置为SIMILAR,那么SQL PARSE的时候会做PEEKING,如果觉得是可以共享的,那么就共享这个SQL,Oracle自动会将非绑定变量转换为绑定变量。要注意的是,如果某个WHERE条件里的字段存在柱状图,那么PEEKING过程会认为这个SQL的共享是不安全的,那么将不共享这个SQL,此时这个CURSOR会产生一个子CURSOR,形成一个新的版本。这种情况下,只有非绑定变量的值是相同的,PARSER才认为共享是安全的,不产生新的VERSION。如果设置为 FORCE,和SIMILAR类似,会将非绑定变量转为绑定变量,和SIMILAR不同的是,PARSER强行认为共享是安全的,因此不会理会柱状图的信息,直接共享该CURSOR。
CURSOR_SHARING的设置,最佳建议是用精确,在开发过程中,该用绑定变量的地方用绑定变量,不该用的地方不用(什么时候不该用呢?),实在不行,用SIMILAR,但是使用非缺省值的情况,需要查找是否存在BUG,尽早打补丁,另外要测试应用,某些SQL在某些版本使用绑定变量的情况下会出错(不是BUG),FORCE的BUG比较多,更要做好测试。
SQL语句分析分为软分析和硬分析两种。减少软分析和硬分析,特别是减少硬分析,对于降低CPU的使用率有着十分关键的作用
SQL执行的时候,如果某个语句已经被缓冲了,那么这个SQL就不需要进行分析,可以直接执行,因此保证SQL能够在缓冲区中长
时间存在将可以减少SQL分析的发生。有2个参数可以控制SQL在SESSION缓冲池中的时间长短:OPEN_CURSORS和SESSION_CACHED_CURSORS。
那怎样来调整这两个参数呢?检查目前SESSION_CACHED_CURSORS和OPEN_CURSORS的使用率情况
select session_cached_cursors parameter,
lpad(value, 5) value,
decode(value, 0, n/a, to_char(100 * used / value, 990) || %) usage
from (select max(s.value) used
from v$statname n, v$sesstat s
where n.name = session cursor cache count
and s.statistic# = n.statistic#),
(select value from v$parameter where name = session_cached_cursors)
union all
select open_cursors parameter,
lpad(value, 5) value,
to_char(100 * used / value, 990) || % usage
from (select max(sum(s.value)) used
from v$statname n, v$sesstat s
where n.name in
(opened cursors current, session cursor cache count)
and s.statistic# = n.statistic#
group by s.sid),
(select value from v$parameter where name = open_cursors);
查看系统级cursor的命中率,软分析和硬分析的比率
select
to_char(100 * sess / calls, 9999990.00) || % cursor_cache_hits,
to_char(100 * (calls - sess - hard) / calls, 999990.00) || % soft_parses,
to_char(100 * hard / calls, 999990.00) || % hard_parses
from
( select value calls from v$sysstat where name = parse count (total) ),
( select value hard from v$sysstat where name = parse count (hard) ),
( select value sess from v$sysstat where name = session cursor cache hits );
如果返回SESSION_CACHED_CURSORS缓冲区的使用率是100%,那么说明SESSION_CACHED_CURSORS参数还不够大,如果共享池的大小足够,可以调整该参数,直到使用率低于100%为止,
对于没有使用绑定变量的系统,如果CURSOR_SHARING设置为EXACT的时候,如果设置SESSION_CACHED_CURSORS的时候要十分注意,由于应用原因,CURSOR的重用率十分低,如果设置过高的SESSION_CACHED_CURSORS,会导致共享池空间被大量占用,在系统负载较高的时候会出现共享池的性能问题。
B。保留大型对象
加载大型对象是造成共享池碎片的主要原因;由于大量的小型对象需要从共享池释放以腾出空间,会影响响应时间
为了避免这样情况发生,我们就把大型的,经常使用的对象keep在共享池中,哪些对象需要keep呢?
1)经常用到的大型对象,如standard等程序包,使用共享内存超过阀值的对象
2)经常在常用表中执行的触发器
3)序列,因为当序列从共享池中释放时,序列号就丢失了
使用命令 alter system flush shared_pool命令刷新共享池,但不刷新保留对象
例如用下面的sql查出长度大于500个字符,共享内存大于10000个字节的对象
select *
from v$db_object_cache oc
where length(oc.NAME) >500
and oc.TYPE in (PACKAGE, PROCEDURE, FUNCTION, PACKAGE BODY)
and oc.KEPT=NO
and oc.SHARABLE_MEM>10000
查看长度超过500字符,共享内存大于0个字节的匿名pl/sql
select *
from v$sqlarea sq
where sq.COMMAND_TYPE = 47
and length(sq.SQL_TEXT) >500
and sq.SHARABLE_MEM>20000
把这些对象要keep在共享池中要用dbms_shared_pool.keep,系统默认是没有安装这个包的,需要运行dbmspool.sql这个脚本
@/home/oracle/10.2.0/db_1/rdbms/admin/dbmspool.sql“>SYS@skatedb>@/home/oracle/10.2.0/db_1/rdbms/admin/dbmspool.sql
Package created.
Grant succeeded.
View created.
Package body created.
SYS@skatedb >
SQL>desc dbms_shared_pool
Element Type
------------------------- ---------
SIZES PROCEDURE
KEEP PROCEDURE
UNKEEP PROCEDURE
ABORTED_REQUEST_THRESHOLD PROCEDURE
SQL>desc dbms_shared_pool.keep
Parameter Type Mode Default?
--------- -------- ---- --------
NAME VARCHAR2 IN
FLAG CHAR IN Y
SQL>desc dbms_shared_pool.unkeep
Parameter Type Mode Default?
--------- -------- ---- --------
NAME VARCHAR2 IN
FLAG CHAR IN Y
ABORTED_REQUEST_THRESHOLD(threshold_size NUMBER): 这个方法可以设定一个界限,保证如果要进入SHARED POOL的对象太大,那么可以设置一个阀值,超过这个阀值的直接报错,而不是经过LRU查找和内存交换之后发现SHARED POOL不够了再报错,可以防
止超大对象过度占用SHARED POOL空间。
UNKEEP 就是KEEP 的反操作
SIZES (minsize NUMBER): 这个是列出SHARED POOL中所有大于minsize的对象,对于查找SHARED POOL中大对象并设置合理
的ABORTED_REQUEST_THRESHOLD很有用。
说明 flag:
Value Kind of Object to keep
-- ----- ----------------------
-- P package/procedure/function
-- Q sequence
-- R trigger
-- T type
-- JS java source
-- JC java class
-- JR java resource
-- JD java shared data
-- C cursor
如果这个flag是空,那么他的默认值是P
保留package
sql>exec dbms_shared_pool.keep(package_name,P);
保留squence(避免sequence跳号)
sql>exec dbms_shared_pool.keep(sequence_name,Q);
保留匿名块
SQL>select address,hash_value
2 from v$sqlarea sq
3 where sq.COMMAND_TYPE = 47
4 and length(sq.SQL_TEXT) >500
5 and sq.SHARABLE_MEM>20000
6 ;
ADDRESS HASH_VALUE
---------------- ----------
00000000A78655E8 1599878706
sql>exec dbms_shared_pool.keep(address,hash_value,C);
注意:查看47是什么命令
SQL>select * from audit_actions where action=47;
ACTION NAME
---------- ----------------------------
47 PL/SQL EXECUTE
eg:
查看需要keep的匿名块
SQL>select address,hash_value
2 from v$sqlarea sq
3 where sq.COMMAND_TYPE = 47
4 and length(sq.SQL_TEXT) >500
5 and sq.SHARABLE_MEM>20000
6 ;
ADDRESS HASH_VALUE
---------------- ----------
000000008E8532A8 97348712
1 rows selected
确认当前匿名块是否被keep
SQL>select oc.KEPT,sq.ADDRESS,sq.HASH_VALUE
2 from v$db_object_cache oc,
3 v$sqlarea sq
4 where sq.SQL_TEXT=oc.NAME
5 and sq.HASH_VALUE=97348712
6 ;
KEPT ADDRESS HASH_VALUE
---- ---------------- ----------
NO 000000008E8532A8 97348712
SQL>
keep住匿名块
SQL>exec dbms_shared_pool.keep(000000008E8532A8,97348712);
begin dbms_shared_pool.keep(000000008E8532A8,97348712); end;
ORA-01426: 数字溢出
ORA-06512: 在 ”SYS.DBMS_UTILITY“, line 114
ORA-06512: 在 ”SYS.DBMS_SHARED_POOL“, line 45
ORA-06512: 在 ”SYS.DBMS_SHARED_POOL", line 53
ORA-06512: 在 line 1
SQL>exec dbms_shared_pool.keep(000000008E8532A8,97348712,C);
PL/SQL procedure successfully completed
SQL>
检查是否被keep住
SQL>select oc.KEPT,sq.ADDRESS,sq.HASH_VALUE
2 from v$db_object_cache oc,
3 v$sqlarea sq
4 where sq.SQL_TEXT=oc.NAME
5 and sq.HASH_VALUE=97348712
6 ;
KEPT ADDRESS HASH_VALUE
---- ---------------- ----------
YES 000000008E8532A8 97348712
SQL>
取消对象的keep
SQL>exec dbms_shared_pool.unkeep(000000008E8532A8,97348712,C);
PL/SQL procedure successfully completed
SQL>
确认当前匿名块是否被取消keep
SQL>select oc.KEPT,sq.ADDRESS,sq.HASH_VALUE
2 from v$db_object_cache oc,
3 v$sqlarea sq
4 where sq.SQL_TEXT=oc.NAME
5 and sq.HASH_VALUE=97348712
6 ;
KEPT ADDRESS HASH_VALUE
---- ---------------- ----------
NO 000000008E8532A8 97348712
SQL>
剩下keep住package和sequnce就都类似了
共享池碎片问题
绑定变量问题
-----end-----
【oracle 笔试】推荐阅读:
经典oracle语句09-30
oracle学习总结11-20
oracle数据库总结06-03
oracle数据库常用操作06-07
笔试题库06-20
迅雷招聘笔试06-26
工行笔试经验07-08
汉王笔试题目07-23
出纳笔试试题09-21
笔试综合题10-06