OCP认证考试资料及工具分享
由于上传权限不高,所以把pdf分成4个包了.
OCP/OCA认证考试指南全册 ORACLE 11G(1Z0-051,1Z0-052,1Z0-053 第一部分
OCP/OCA认证考试指南全册 ORACLE 11G(1Z0-051,1Z0-052,1Z0-053 第二部分
OCP/OCA认证考试指南全册 ORACLE 11G(1Z0-051,1Z0-052,1Z0-053 第三部分
OCP/OCA认证考试指南全册 ORACLE 11G(1Z0-051,1Z0-052,1Z0-053 第四部分
MasterExam模拟考试引擎
序列像表、视图一样,被称为数据库对象,它可以产生1、2、3、4……等等顺序增加的有序数。当然,也可以是1,3,5,7……,也可以由大到小。只要是有序数列,都可以有序列产生。下面我们看一下序列的创建和使用。
二、序列的创建
序列的创建语法如下:
CREATE SEQUENCE 序列名
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];
INCREMENT BY n :序列增量,这里的n取值是一个整数。如果n为2,序列将已2为单位自增,比如1,3,5,7……。如果省略此子句,默认的自增量将是1。
START WITH n :序列的起始值。默认为1。
MAXVALUE n | NOMAXVALUE :MAXVALUE n是序列的最大值。NOMAXVALUE是系统自定最大值,通常升序的最大值ORACLE将会设为10的27次方,降序的最大值是-1。
MINVALUE n | NOMINVALUE : MINVALUE n序列的最小值。NOMINVALUE和上面的选项一样,是系统自定最小值。升序的最小值是1。降序的是负的10的26次方,即-(10的26次方)。
CYCLE | NOCYCLE :在序列到“头”后,也就是达到最大值、或最小值后,是否又回到序列的起始值。
CACHE n | NOCACHE :CACHE n 的作用是ORACLE事先生成n个序列数,保存在内存中,等用户需要时取用。NOCACHE不在内存中事先生成序列数,每次用户使用到序列的下一个数时,当场为用户生成。这样的速度不如CACHE n快。CACHE n是按序列的顺序,一次生成多个数,放在内存中,等待用户取用。NOCACHE是用一个生成一个。ORACLE的默认值,是CACHE 20。也就是在缓存中一次生成20个序列数供用户取用。
以上就是序列的创建语法,下面我们创建一个从5开始,每次增加1,最大值是 20的序列:
gyj@OCM> create sequence seq_prepay
2 minvalue 3
3 maxvalue 20
4 start with 5
5 increment by 1
6 nocycle;
Sequence created.
有一个数据字典视图,可以显示用户创建的序列信息:
gyj@OCM> select sequence_name,min_value,max_value, increment_by,last_number from user_sequences;
SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY LAST_NUMBER
------------------------------ ---------- ---------- ------------ -----------
SEQ_PREPAY 3 20 1 5
这些列的意义都非常简单。注意序列名,无论你创建时对象名是小写还是大写,ORACLE统统都会转换为大写。LAST_NUMBER列我们暂时还没有用到,一会儿再说这个列的意义。
三、序列使用
序列已经创建好了,如何从序列中生成顺序的数呢?
序列名.NEXTVAL ,让序列自增,并取得自增后的值。
序列名.CURRVAL ,序列不自增,仅取得序列的当前值。
注意在序列刚刚建成后,在数据库仅存有序列的定义,还没有生成任何序列数,这时不能调用CURRVAL,例如,我的seq_prepay刚刚建成:
gyj@OCM> select seq_prepay.currval from dual;
select seq_prepay.currval from dual
*
ERROR at line 1:
ORA-08002: sequence SEQ_PREPAY.CURRVAL is not yet defined in this session
这个错误的意思就是序列的值还没有生成。下面我调用NEXTVAL一次:
gyj@OCM> select seq_prepay.nextval from dual;
NEXTVAL
----------
5
序列已经有了第5个值,再调用CURRVAL也可以有结果了:
gyj@OCM> select seq_prepay.currval from dual;
CURRVAL
----------
5
CURRVAL你无论调用多少次,不会引起序列的自增,我可以再显示一次CURRVAL,显示的结果还是5。但是,每调用一次NEXTVAL,序列都会自增一次,并返回自增结果,seq_prepay序列当前是5,我再次调用NEXTVAL,序列的值将变为6:
gyj@OCM> select seq_prepay.nextval from dual;
NEXTVAL
----------
6
每次自增1。这时再调用CURRVAL,值将变为6。seq_prepay序列是NOCYCLE,即当达到最大值后不绕回,下面我们多调用NEXTVAL几次,seq_prepay的最大值是20,当达到序值为20后,再次调用NEXTVAL将会报出如下错误:
gyj@OCM> select seq_prepay.nextval from dual;
select seq_prepay.nextval from dual
*
ERROR at line 1:
ORA-08004: sequence SEQ_PREPAY.NEXTVAL exceeds MAXVALUE and cannot be instantiated
如果序列设置为CYCLE,此时序列的值将会又变回1,这就是绕回,不会报出错误。
我们已经看到了序列的使用,那么,序列都可以用在什么地方呢?我们可以把序列的NEXTVAL或CURRVAL放在INSERT的VALUES中,把序列值插入进表,也可以放在UPDATE set后,用序列值更新表。序列也就是可以放在这些地方了。能够使用序列的地方并不多,在WHERE中,在创建表的DEFAULT中,等等,除了上面我们所提到的,其他地方都不能使用序列。
四、修改序列
Oracle中所有修改元数据的命令,都是以ALTER开头,序列也不例外。修改序列的命令是:
ALTER SEQUENCE 序列名 各选项 。
除了START WITH不能修改外,创建序列时,其他所有的选项都可以修改。例如,我将seq_prepay序列改为可绕回:
gyj@OCM> alter sequence seq_prepay cycle nocache;
Sequence altered.
再调用NEXTVAL,已经绕回到最小值3,而不是起始值5了:
gyj@OCM> select seq_prepay.nextval from dual;
NEXTVAL
----------
3
在修改序列定义时,对序列自增的改变,只会对新产生的值生效,对已经产生过的值无效。
五、序列的空隙
序列通常都是按顺序生成,比如上面的seq_prepay,按5、6、7,…… 的顺序,通常不会将谁跳过去。但有种情况下,可能会出现你本次调用NEXTVAL时,序列值是6,下一次再调用NEXTVAL时,却变为10了。7、8、9、都被跳了过去,这就是序列中的空隙。
空隙的原因,很大程度是上CACHE引起的。
假设刚刚将CACHE 设为4 ,序列当前值是5,下一次调用NEXTVAL时,返回值是6,但同时,ORACLE会自动的沿着序列的顺序,生成7、8、9 、10三个序列值。并将这4个值放进缓存中。5已经被调取了,下一次调用NEXTVAL时,将到缓存中把6取出,再下一次到缓存中取7。7之后再调用NEXTVAL,。。。一直调到10将再次生成4个值,存进缓存中。这样做的目的,是为了加快序列生成顺序数的效率,但这可能会生成空隙。比如说现在序列值是6,在缓存中有6、7、8、9四个序列值,这四个值已经生成了。如果此时停电了,内存中的数据被清空了。再次启动数据库后,调用NEXTVAL将返回10,因为7、8、9这3个值刚才已经生成过了。下面我们试一下:
步1:确认当前序列值是5
gyj@OCM> select seq_prepay.nextval from dual;
NEXTVAL
----------
5
步2:将CACHE设为4
gyj@OCM> alter sequence seq_prepay cache 4;
Sequence altered.
步3:再次调用NEXTVAL
gyj@OCM> select seq_prepay.nextval from dual;
NEXTVAL
----------
6
虽然NEXTVAL显示当前序列的值为6,但我们可以通过USER_SEQUENCES中的last_number列,看到序列的下一个值应该是什么:
gyj@OCM> select sequence_name,min_value,max_value, increment_by,last_number from user_sequences;
SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY LAST_NUMBER
------------------------------ ---------- ---------- ------------ -----------
SEQ_PREPAY 3 20 1 10
应该是10了。这就是CACHE在起的作用。也就是说序列的当前值已经是10了。缓存了6、7、8、9四个
步4:登录具有特殊权限的用户,以最突然的方式关闭数据库,再打开数据库。
sys@OCM> conn / as sysdba
Connected.
sys@OCM> shutdown abort;
ORACLE instance shut down.
sys@OCM> startup
ORACLE instance started.
Total System Global Area 1071333376 bytes
Fixed Size
忘了说明:本系列文章出自《Microsoft SQL Server 2012 Performance Tuning Cookbook》,将会陆续推出译文,但是由于工作需要,没有按顺序贴出来。
本系列文章包含三部分:
1、 使用系统统计函数(system statistical functions)来监控系统健康程度。
2、 使用系统存储过程来监控SQLServer进程和会话。
3、 使用DBCC SQLPERF命令来监控日志空间使用情况。
前言:
SQLServer提供了一些系统函数、系统存储过程和DBCC命令来分析SQLServer性能相关的问题,不过绝大部分这些工具所获得的信息都可以通过DMVs和DMFs来获得。很多人依旧使用本文的工具的原因是因为他们长期使用这些工具来监控SQLServer,已经成为了一个习惯,所以为了向后兼容,微软依旧保留这些工具,但是建议新入门的人尽可能从DMO(DMVs和DMFs的统称)中获取信息。
性能监控有很多工具,SQL Profiler、扩展事件、DMO及本系列文章提供的工具等,来获取信息,对于简单的性能问题,使用某一种即可,但是对于复杂的性能问题,往往需要多个工具协同使用。
下面先介绍使用系统统计函数来监控SQLServer的健康程度。
使用系统统计函数来监控SQLServer
SQLServer提供了一些列非常有用的系统统计函数来监控当前SQLServer的状态。这些函数用于检查和监控服务器的健康状态非常有效。
现在假设一个情况,在你的数据库环境中,一个web应用程序对数据集的操作是一行一行的。为了读取每一行,应用程序会在数据库中往返访问,导致经常需要开启新的连接。为了处理这个问题,需要经常监控SQLServer的连接数,下面将演示如何操作。
准备工作:
SQLServer提供了下面这些有用的系统函数:
@@CONNECTIONS @@TIMETICKS @@CPU_BUSY @@IDLE @@IO_BUSY @@PACK_RECEIVED @@PACK_SENT @@PACKET_ERRORS @@TOTAL_READ @@TOTAL_WRITE @@TOTAL_ERRORS
本例子中将使用这些函数,并创建脚本来获取信息。
环境准备:
使用SQLServer2008企业版(本机只有企业版)和示例数据库AdventureWorks。
步骤:
1、 打开SQLServer(这里使用SQLServer Management Studio后面简称SSMS),然后新开一个查询窗口(ctrl+m)。
2、 在窗口上输入一下脚本:
--创建一个表来存储统计信息 IF OBJECT_ID('[dbo].[tbl_ServerHealthStatistics]') IS NULL BEGIN CREATE TABLE [dbo].[tbl_ServerHealthStatistics] ( ID INT IDENTITY(1, 1) , StatDateTime DATETIME DEFAULT GETDATE() , TotalConnections INT , TimeTicks INT , TotalCPUBusyTime INT , TotalCPUIdleTime INT , TotalIOBusyTime INT , TotalReceivedPackets INT , TotalSentPackets INT , TotalErrorsInNetworkPackets INT , TotalPhysicalReadOperations INT , TotalWriteOperations INT , TotalReadWriteErrors INT ) END GO --收集信息到表中 INSERT INTO [dbo].[tbl_ServerHealthStatistics] ( TotalConnections , TimeTicks , TotalCPUBusyTime , TotalCPUIdleTime , TotalIOBusyTime , TotalReceivedPackets , TotalSentPackets , TotalErrorsInNetworkPackets , TotalPhysicalReadOperations , TotalWriteOperations , TotalReadWriteErrors ) SELECT @@CONNECTIONS TotalConnections , @@TIMETICKS TimeTicks , @@CPU_BUSY TotalCPUBusyTime , @@IDLE TotalCPUIdleTime , @@IO_BUSY TotalIOBusyTime , @@PACK_RECEIVED TotalReceivedPackets , @@PACK_SENT TotalSentPackets , @@PACKET_ERRORS TotalErrorsInNetworkPackets , @@TOTAL_READ TotalPhysicalReadOperations , @@TOTAL_WRITE TotalWriteOperations , @@TOTAL_ERRORS TotalReadWriteErrors
3、运行下面脚本,显示收集的服务器信息:
WITH cteStatistics AS ( SELECT * FROM [dbo].[tbl_ServerHealthStatistics] ) SELECT Cur.TotalConnections AS CurrentConnections , Cur.StatDateTime AS CurrentStatDateTime , Prev.TotalConnections AS PreviousConnections , Prev.StatDateTime AS Previous_StatDateTime , Cur.TotalConnections - Prev.TotalConnections AS ConnectionsIncreamentedBy , DATEDIFF(millisecond, Prev.StatDateTime, Cur.StatDateTime) AS ConnectionsIncreamentedIn FROM cteStatistics AS Cur LEFT JOIN cteStatistics AS Prev ON Cur.ID = Prev.ID + 1
上面例子中,先创建一个表[dbo].[tbl_ServerHealthStatistics],在创建之前,使用OBJECT_ID()函数来检查是否存在该表,如果存在则不创建,这是一个良好的编程习惯,建议在创建表(无论是实体表还是临时表)时使用。可以确保脚本可重复执行。
步骤2的脚本中,通过INSERT..SELECT语句来收集数据并插入到表中。
步骤3中,由于需要对比两行之间的数据,所以使用CTE(2005之前可以使用临时表)来暂时存放数据然后与目前数据做对比。
扩展信息:
下面是这些系统统计函数的简介,这些函数