Oracle作为一种大型数据库,广泛应用于金融、邮电、电力、民航等数据吞吐量巨大,计算机网络广泛普及的重要部门。对于系统管理员来讲,如何保*网络稳定运行,如何提高数据库*能,使其更加安全高效,就显得尤为重要。作为影响数据库*能的一大因素--数据库碎片,应当引起DBA的足够重视,及时发现并整理碎片乃是DBA一项基本维护内容。
1、碎片是如何产生的
当生成一个数据库时,它会分成称为表空间(Tablespace)的多个逻辑段(Segment),如系统(System)表空间,临时(Temporary)表空间等。一个表空间可以包含多个数据范围(Extent)和一个或多个自由范围块,即自由空间(FreeSpace)。
表空间、段、范围、自由空间的逻辑关系如下:
当表空间中生成一个段时,将从表空间有效自由空间中为这个段的初始范围分配空间。在这些初始范围充满数据时,段会请求增加另一个范围。这样的扩展过程会一直继续下去,直到达到最大的范围值,或者在表空间中已经没有自由空间用于下一个范围。最理想的状态就是一个段的数据可被存在单一的一个范围中。这样,所有的数据存储时靠近段内其它数据,并且寻找数据可少用一些指针。但是一个段包含多个范围的情况是大量存在的,没有任何措施可以保*这些范围是相邻存储的,如图〈1〉。当要满足一个空间要求时,数据库不再合并相邻的自由范围(除非别无选择),而是寻找表空间中最大的自由范围来使用。这样将逐渐形成越来越多的离散的、分隔的、较小的自由空间,即碎片。例如:
ORACLE数据库碎片整理
2、碎片对系统的影响
随着时间推移,基于数据库的应用系统的广泛使用,产生的碎片会越来越多,将对数据库有以下两点主要影响:
1)导致系统*能减弱
如上所述,当要满足一个空间要求时,数据库将首先查找当前最大的自由范围,而"最大"自由范围逐渐变小,要找到一个足够大的自由范围已变得越来越困难,从而导致表空间中的速度障碍,使数据库的空间分配愈发远离理想状态;
2)浪费大量的表空间
尽管有一部分自由范围(如表空间的pctincrease为非0)将会被SMON(系统*)后台进程周期*地合并,但始终有一部分自由范围无法得以自动合并,浪费了大量的表空间。
3、自由范围的碎片计算
由于自由空间碎片是由几部分组成,如范围数量、最大范围尺寸等,我们可用FSFI--FreeSpaceFragmentationIndex(自由空间碎片索引)值来直观体现:
FSFI=100*SQRT(max(extent)/sum(extents))*1/SQRT(SQRT(count(extents)))
可以看出,FSFI的最大可能值为100(一个理想的单文件表空间)。随着范围的增加,FSFI值缓慢下降,而随着最大范围尺寸的减少,FSFI值会迅速下降。
下面的脚本可以用来计算FSFI值:
remFSFIValueCompute
remfsfi.sql
columnFSFIformat999,99
selecttablespace_name,sqrt(max(blocks)/sum(blocks))*
(100/sqrt(sqrt(count(blocks))))FSFI
fromdba_free_space
groupbytablespace_nameorderby1;
spoolfsfi.rep;
/
spooloff;
比如,在某数据库运行脚本fsfi.sql,得到以下FSFI值:
TABLESPACE_NAMEFSFI
-------------------------------------
RBS74.06
SYSTEM100.00
TEMP22.82
TOOLS75.79
USERS100.00
USER_TOOLS100.00
YDCX_DATA47.34
YDCX_IDX57.19
YDJF_DATA33.80
YDJF_IDX75.55
----统计出了数据库的FSFI值,就可以把它作为一个可比参数。在一个有着足够有效自由空间,且FSFI值超过30的表空间中,很少会遇见有效自由空间的问题。当一个空间将要接近可比参数时,就需要做碎片整理了。
4、自由范围的碎片整理
1)表空间的pctincrease值为非0
可以将表空间的缺省存储参数pctincrease改为非0。一般将其设为1,如:
altertablespacetemp
defaultstorage(pctincrease1);
这样SMON便会将自由范围自动合并。也可以手工合并自由范围:
altertablespacetempcoalesce;
5、段的碎片整理
我们知道,段由范围组成。在有些情况下,有必要对段的碎片进行整理。要查看段的有关信息,可查看数据字典dba_segments,范围的信息可查看数据字典dba_extents。如果段的碎片过多,将其数据压缩到一个范围的最简单方法便是用正确的存储参数将这个段重建,然后将旧表中的数据*入到新表,同时删除旧表。这个过程可以用Import/Export(输入/输出)工具来完成。
Export()命令有一个(压缩)标志,这个标志在读表时会引发Export确定该表所分配的物理空间量,它会向输出转储文件写入一个新的初始化存储参数--等于全部所分配空间。若这个表关闭,则使用Import()工具重新生成。这样,它的数据会放入一个新的、较大的初始段中。例如:
expuser/passwordfile=exp.dmppress=Ygrants=Yindexes=Y
tables=(table1,table2);
若输出成功,则从库中删除已输出的表,然后从输出转储文件中输入表:
impuser/passwordfile=exp.dmpmit=Ybuffer=64000full=Y
这种方法可用于整个数据库。
以上简单分析了Oracle数据库碎片的产生、计算方法及整理,仅供参考。数据库的*能优化是一项技术含量高,同时又需要有足够耐心、认真细致的工作。对数据库碎片的一点探讨,
下面是一种如何自动处理表空间碎片的代码,希望对上大家看上文有用
CoalesceTablespaceAutomatically
ThistechniqueesfromSandeepNaik,adatabaseadministrator
forGSXXI,Inc.inNewYorkCity,NewYork
Hereisahandyscriptwhichcanbescheduledtoautomaticallyrun
andcoalescesthetablespaces.
ThisscriptisdesignedtoruninNTbutcanberuninanyoperatingsystem
byslightmodificationsinthepathwherethefilespools
fromtheSQLPLUSenvironment.Itassumesthattheuserwhorunsthescript
haspriviledgestoviewthedatadictionary.
Startofcode
--------------------------------------
sqlplus/
promptthisscriptwillcoalescethetablespaceautomatically
setverifyoff;
settermoutoff;
setheadoff;
spoolc:empcoalesce.log
selectaltertablespace||TABLESPACE_NAME||coalesce;
fromDBA_FREE_SPACE_COALESCEDwherePERCENT_EXTENTS_COALESCED<100
orPERCENT_BLOCKS_COALESCED<100;
spooloff;
@c:empcoalesce.log
setheadon;
settermouton;
setverifyon;
promptTablespacesarecoalescedsuccessfully
第2篇:PHP数据库Oracle数据完整*
学习是艰苦的,只要熬过学习期就会有大大的收获。以下是百分网小编精心为大家整理的PHP的相关学习内容Oracle数据完整*,希望对大家学习有所帮助!更多内容请关注应届毕业生网!
一、数据完整*
数据完整*要求数据库中的数据具有准确*。准确*是通过数据库表的设计和约束来实现的。为了实现数据完整*,数据库需要做两方面的工作:
确保每行的数据符合要求。
去报没咧的数据符合要求。
为了实现以上要求,Oracle提供了一下4种类型的约束(Constraint)。
1、实体完整*约束
实体完整*要求表中的每一行数据都反映不同的实体,不能存在相同的数据行。通过主键约束,唯一约束来实现实体完整*。
(1)主键约束:
表中的一列或者纪略组合的值能用来唯一的表示表中的每一行,这样的一列或者多列的组合叫做表的主键。
主键自带唯一*,并且不能为空,一个表只能有一个主键,主键确保了表中数据行的唯一,同一张表中,可以使用多个列共同作为主键。在选择主键时,应遵循两个原则,最少*和稳定*。
(2)唯一约束:
保*数据行中的某一列的数据是唯一的,不重复的。这样可以添加唯一约束。
唯一约束和主键的区别:
主键不能为空,唯一可以为空,但只允许有一个空值。
主键一张表中只有一个,而唯一可以有多个。
主键可以由多个表来组成,唯一只能是单列。
主键可以作为其他表的外键,唯一不可以。
2、域完整*:
与完整*是指给定咧的输入的有效*。通过数据类型、检查约束、输入格式、外键约束、默认值、非空约束等方法来实现。
3、引用完整*:
引用完整*是指为两个表中存在一定的联系,从而保*数据的完整*。例如:班级和学生,学生所在班级一定是在班级表中所存在的,不然就会出现不准确。引用完整*我们可以通过外键约束来实现。
4、自定义完整*:
用户自己定义约束规则。主要通过存储过程和触发器对象来实现。
二、添加约束
在创建表时,我们可以再字段后添加各种约束。这里分为列级定义和表级定义:
1、列级定义
列级定义是指在定义列的同时定义定义约束。
如在t_class表定义主键和唯一约束
说明:在列级定义时,加不加constraintpk_department都是可以的,区别是不加的话,系统会自动分配一个主键约束名称,可读*差。
2、表级定义
表级定义是指在定义了所有列后,再定义约束。需要注意:notnull只能在列级上定义。
以在建立学生和班级表时定义主键约束和外键约束为例:
3、创建表后,我们也可以在已经建好的表上添加约束,需要使用ALTERTABLE语句。
语法:ALTERTABLEADDCONSTRAINT约束名约束类型具体的约束说明。
三、删除约束
语法:ALTERTABLEDROPCONSTRAINT约束名
四、查看约束
查看T_STUDENT表中所有的约束。注意:这里的表明必须全大写否则查不到结果。
第3篇:ORACLE数据库的部分试题
1怎样查看数据库引擎的报错
解答:alertlog.
2 比较truncate和delete命令
解答:两者都可以用来删除表中所有的记录。区别在于:truncate是DDL*作,它移动HWK,不需要rollbacksegment.而Delete是DML*作,需要rollbacksegment且花费较长时间.
3 使用索引的理由
解答:快速访问表中的datablock
4.给出在STARSCHEMA中的两种表及它们分别含有的数据
解答:Facttables和dimensiontables.facttable包含大量的主要的信息而dimensiontables存放对facttable某些属*描述的信息
10.FACTTable上需要建立何种索引?
解答:位图索引(bitmapindex)