版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章管理Oracle对象管理表概览
表是最基本的数据库对象,它用于存储用户数据,关系数据库的所有操作最终都是围绕用户表进行的。在Oracle数据库中,按照存储方式的不同,表可以分为普通表、分区表、索引组织表以及簇表等四种表。
1.表结构
表是Oracle数据库数据存储的基本单元,在表中是通过行和列来组织数据的。一张表一般都具有多个列,或者称为字段,每个字段都具有特定的属性,包括字段名、字段数据类型、字段长度、约束、默认值等,这些属性在表创建时即被确定。而表的每一行存放一条信息。2.基本的数据类型
当建立表时,不仅要指定表名、列名,而且要根据情况为列选择合适的数据类型以及长度。下面介绍一些常用的Oracle数据类型:
CHAR(N)该数据类型用于定义固定长度的字符串,其最大长度为2000字节。假定定义COLA列为CHAR(100),并且该列的数据为“ACCESS”,这时虽“ACCESS”只有六个字符,但COLA列仍将占用100字节的空间。
VARCHAR2(N)该数据类型用于定义可变长度的字符串,其最大长度为4000字节。假定定义COLA列为VARCHAR2(100),并且该列的数据为“ACCESS”,那么COLA列将占用6字节的空间。所以使用VARCHAR2类型可以节省空间,但CHAR类型存取速度更快。
NUMBER(P,S)该数据类型用于定义数字类型的数据,其中P是精度,表示数字的总位数,而S是刻度范围,表示小数点后的位数。精度和刻度范围都是可选的,但若指定了刻度范围,那么必须指定精度。假定定义SAL列为NUMBER(4,3),若该列的数据为123.4567,则存储错误,因为超出了精度范围;若该列的数据为1.234567,则实际存储的数据为1.235,因为当被指派值超出了刻度范围时,存储值按照刻度范围指定的数字位的位数进行舍入。另外,定义整数还可以直接使用INT数据类型。
DATE该数据类型用于定义日期时间数据,其长度为7个字节。RAW(N)该数据类型用于定义二进制数据,其最大长度为2000字节。通常用来存储小型二进制数据。
存储大对象的数据类型Oracle为存储大对象(LOB)提供了六种数据类型Long,longrawLob(CLOB、BLOB.BFILE、NCLOB)
一个表只能有一个LONG或LONGRAW列一个表上可以有多个LOB列最多2gb最多4gbSelect返回数据Select返回定位器与其他列数据存放在一起小于4000:与其他列存放在一起大于4000:存放到LOB段无对象类型支持支持对象类型顺序访问随机访问
其中:CLOB和LONG用于存储大型的、固定宽度字符数据;BLOB和LONGRAW用于存储非结构化数据,如二进制图象;NCLOB用于存储大型的、固定宽度字符集数据;BFILE用于存储操作系统文件中的非结构化数据。
3.数据的存储方式当创建表时,Oracle会自动从指定的表空间中为新建的表创建一个数据段,而该表的所有数据都会存放到相应的表段中。
表的行数据存储在数据块中,如果一个块的大小足够容纳一条记录,Oracle就将一条记录完整的存储在一个数据块中。一般情况,记录按列定义顺序来存放,但若使用LONG或LONGRAW类型,那么它们的数据总是放在记录的尾部。如果表中某字段允许为NULL,若NULL值字段位于非NULL值字段的中间,则需使用1字节的空间来存储NULL值字段的长度;若NULL值字段位于一条记录的末尾,将不需要任何存储空间来存储NULL值。因此,在定义表时候,应当将可能包含NULL值的字段放在字段列表的末尾,这样可以节省存储空间。
4.ROWIDROWID用于惟一标识表行。当执行INSERT操作时,服务器进程会将数据插人到表段的相应数据块中,并且Oracle会生成惟一的ROWID对应于该行数据。ROWID间接地给出了表行的物理存放位置,它是定位表行最快速的方式。ROWID占用10个字节的存储空间,而显示结果为18个字符,具体格式如下:
OOOOOOFFFBBBBBBRRR数据对象号
相对文件号
数据块号
行号
数据对象号:表的惟一对象标识号。当建立表时,Oracle会为该表分配惟一的数据对象号。相对文件号:表空间内数据文件的惟一标识号。块号:行所在数据块的位置。
行号:行在块内的位置。
因为创建了一个表就创建了一个段,而一个段只能驻留在一个表空间中,所以使用数据对象编号,Oracle服务器可以确定表所在的表空间;又因为表空间的数据都存放在数据文件中,使用相对文件编号Oracle可以确定存放表数据的数据文件;数据文件用数据块来存储数据,使用数据块编号可知表的某一行数据存放在哪个数据块中;而一个数据块可能存放多行数据,利用行号就可以定位表中的任一行了。
ROWID是表的伪列,用户在查看表的结构时不会看到ROWID字段,但和其它字段一样,可以在执行SELECT操作时直接引用。但是因为用户无法直接读懂ROWID内容,所以在引用ROWID时通常使用DBMS_ROWID将其转变为可读取的内容。
selectdeptno,dbms_rowid.rowid_relative_fno(rowid)||'.'||dbms_rowid.rowid_block_number(rowid)||'.'||dbms_rowid.rowid_row_number(rowid)行位置fromdept;7.1.2建表建表是使用createtable命令完成的,,执行该命令令要求用户必必须具有createtable系统权限;如如果要在其他他用户模式中中建表,则要要求用户必须须具有createanytable系统权限。当当建立表时,,Oracle会为该表分配配相应的表段段,因为表段段所需空间是是从表空间上上分配的,所所以要求表的的所有者必须须要在表空间间上具有相应应的空间配额额或具有unlimitedtablespace系统权限。1.建立普通表普通表是存储储用户数据最最常用的方式式。当建立普普通表时,Oracle会自动为该表表建立相应的的段,并且段段的名称与表表名完全相同同,而且段的的数据只能存存放在一个表表空间中。创创建普通表的的语法如下::CREATETABLE[schema.]table(columndatatype[,columndatatype]…)[TABLESPACEtablespace][PCTFREEinteger][PCTUSEDinteger][INITRANSinteger][MAXTRANSinteger][STORAGEstorage-clause][LOGGING|NOLOGGING][CACHE|NOCACHE]现对命令中各各参数说明如如下:TABLESPACE:标识要在其中中创建表的表表空间。如果果创建表时没没有显式的指指定表所处的的表空间,则则表被创建在在当前用户的的默认表空间间中。PCTFREE和PCTUSED:PCTFREE参数用于指定定块中必须保保留的最小空空闲空间比例例,PCTUSED参数用于指定定当数据块达达到PCTFREE参数的限制之之后(这时数数据块被标记记为不可用)),数据块能能够被再次使使用前,已占占用的存储空空间必须低于于的比例。INITRANS和MAXTRANS:INITRANS与MAXTRANS参数用于指定定针对同一个个块所允许的的并发事务数数目。每当一一个DML事务访问表中中的一个数据据块时,该事事务会在数据据块的块头部部(BlockHeader)中保存一个个条目,用于于标记该事务务正在使用这这个数据块。。当该事务结结束时,它所所对应的条目目被删除。在创建表时,,Oracle将在表中每个个数据块的头头部空间中分分配可以存储储INITRANS个事务条目的的空间。这部部分存储空间间是永久性的的,只能用来来存储事务条条目。当一个个DML事务访问这个个数据块时,,Oracle首先将该事务务的条目存储储在块头部空空间中。当块块头部空间已已经存储了INITRANS个事务条目后后,再没有多多余的空闲空空间来存储其其他的事务条条目了。这时时若还有别的的事务要访问问这个数据块块,Oracle将在数据块的的空闲空间中中为事务条目目分配存储空空间(如果在在块中还有空空闲空间的话话)。这部分分空闲空间是是动态分配的的,回收以后后可以用于存存储其他数据据。能够在空空闲空间中存存储的事务条条目数量等于于MAXTRANS参数值减去INITRANS参数的值。STORAGE:用于指指定段的存储储参数,若不不指定存储参参数,那么Oracle会使用表空空间的默认存存储参数。在STORAGE子句中中可以设置下下面6个存储参数:INITIAL:为表的数据据段分配的第第一个区的大大小。NEXT:为表的数据据段分配的第第二个区的大大小。PCTINCREASE:指定从第二二个区开始,,为表的数据据段分配的区区的大小增加加比例。即每每个区的大小小等于前一个个区的大小乘乘以(1+PCTINCREASE/100))。如果表处处于本地管理理方式的表空空间中,则该该参数被忽略略。MINEXTENTS:允许为表的的数据段分配配的最小区数数目。MAXEXTENTS:允许为表的的数据段分配配的最大区数数目。如果表表处于本地管管理方式的表表空间中,则则该参数被忽忽略。BUFFER_POOL:指定表的数数据块的缓存存池。LOGGING和NOLOGGING:使用了LOGGING,则表的创建建操作(包括括通过查询创创建表时的插插入记录操作作)都将记录录到重做日志志中,若用NOLOGGING,则表的创建建操作不会被被记录到重做做日志中。默默认情况将使使用LOGGING子句。NOLOGGING子句适合于通通过查询创建建表的情况。。CACHE和NOCACHE:在创建表时时默认使用NOCACHE子句。但对于于比较小又经经常查询的表表,可以使用用CACHE子句。下面是一个在在data表空间上建立立employee表的例子。createtableemployee(idnumber(7),last_namevarchar2(25),dept_idnumber(7))pctfree20pctused50storage(initial200knext200kpctincrease0maxextents50)tablespacedata;2.复制表使用CREATETABLE命令不仅可以以建立表结构构,而且还可可以将已存在在表的结构和和数据复制到到另一张新表表中。另外为为了尽快复制制表的数据,,复制表时可可以指定PARALLEL选项和NOLOGGlNG选项,示例如如下:createtablenew_empparallel2nologgingasselect*fromscott.emp;其中,paralleldegree用于指指定执行并行行操作,parallel2表示示由两个并行行服务器进程程执行数据加加载操作。另另外使用Nologging,在重重做日志中没没有记录下创创建表的操作作3.建立临时表通过createtable语句创建的表表是永久性的的表,即其中中的记录可以以一直保存下下来。与之对对应,在Oracle中还可以创建建临时表(TemporaryTable)。与普通表不同同,临时表中中的数据在使使用完毕后自自动删除。““使用完毕””有两种情况况:事务结束束和会话结束束。在创建临时表表时若使用了了oncommitdeleterows子句,则说明明临时表是事事务级别的。。这时Oracle将在每次提交交事务时对临临时表进行删删减操作,即即删除表中的的所有数据。。若使用了oncommitpreserverows子句,则说明明临时表是会会话级别的。。这时Oracle将直到会话终终止时才对临临时表进行删删减操作。下面语句就建建立了名称为为employee_temp的临时表,该该临时表将在在每次事务提提交时进行删删减操作:createglobaltemporarytableemployee_temponcommitdeleterowsasselect*fromscott.emp;4.建立索引组织织表一般情况下,,表与索引数数据分别存放放在表段和索索引段中。但但索引组织表表(IOT)比较特殊,,它将表的数数据和索引数数据存储在一一起,即以B树索引的方式式来组织表中中的数据。非键列键列行头普通表及其索索引索引组织表要创建索引组组织表,必须须在CREATETABLE语句中显式地地指定organizationindex关键字。另外外,在索引组组织表中必须须建立一个primarykey主码约束。下下面语句就创创建了一个索索引组织表employees。createtableemployees(empnonumber(5)primarykey,enamevarchar2(15)notnull,salnumber(7,2),jobvarchar2(10))organizationindextablespaceusers;在索引组织表表中,如果要要获得对常用用字段更快的的访问速度,,可以应用““溢出”存储储功能,将表表中的不常访访问的非主码码不再存储在在B树的叶节点中中,而是存储储在一个具有有堆组织方式式的溢出存储储区中。对于于大型的索引引组织表,使使用溢出存储储能够大大减减少索引组织织表所占用的的存储空间,,同时又可提提高对常用字字段的查询效效率。如果要启用溢溢出存储功能能,必须在创创建索引组织织表时指定OVERFLOW子句,此外还还需使用INCLUDING子句或PCTTHRESHOLD子句来设置溢溢出存储的方方式。如下所所示:createtablesales_info(idnumber(6)primarykey,customer_namevarchar(30),sales_amountnumber(10,2),sales_datedate,remarkvarchar2(200))organizationindexpctthreshold20includingremarkoverflowtablespaceusers;其中中,,PCTTHRESHOLD指定定在在数数据据块块中中为为主主键键列列和和部部分分非非主主键键列列所所预预留留空空间间的的百百分分比比。。如如上上例例所所示示,,假假定定数数据据块块剩剩余余空空间间已已经经低低于于20%,,那那么么Oracle会将将INCLUDING子句句后后所所有有列列的的数数据据存存放放到到溢溢出出段段。。而INCLUDINGremark则指如果果数据块块剩余空空间低于于PCTTHRESHOLD,那么Oracle会将该子子句列remark后的所有有列数据据存放到到溢出段段,OVERFLOWTABLESPACE指定了溢溢出段所所在的表表空间。。5.建立分区区表分区是指指将一张张大表的的数据进进行物理理划分,,并最终终将其数数据放到到几个相相对较小小的表分分区段中中。当执执行SQL语句访问问分区表表时,系系统可以以直接访访问某个个表分区区段,而而不需要要访问整整张表的的所有数数据,从从而降低低磁盘I/O,提高系系统性能能。Oracle提供了范范围分区区、散列列分区、、列表分分区以及及组合分分区四种种分区方方法。范围分区区范围分区区是按照照分区字字段中值值的范围围来对表表进行分分区,是是最常用用的分区区类型。。范围分分区通常常用于分分区字段段是日期期类型的的表。假定一张张销售表表年数据据总量达达到10GB,每个季季度平均均2.5GB,如果使使用普通通表存储储数据,,那么10G数据会存存放到一一个表段段SALES中,那么么在统计计一季度度销售数数据时需需要扫描描10GB数据;而而如果使使用表分分区段,,那么可可以将一一、二、、三、四四季度数数据分别别存放到到不同表表分区段段中,此此时统计计一季度度销售数数据只需需要扫描描2.5GB数据。显显然,使使用表分分区段可可以大大大降低I/O次数,并并提高I/O性能。下下面以建建立SALES表为例,,说明使使用范围围分区建建立分区区表的方方法,示示例如下下:createtablesales(customer_idnumber(3),sales_amountnumber(10,2),sales_datedate)partitionbyrange(sales_date)(partitionplvalueslessthan('01-APR-2001'),partitionp2valueslessthan('01-JUL-2001'),partitionp3valueslessthan('01-OCT-2001'),partitionp4valueslessthan('01-JAN-2002'));当在分区区表上执执行INSERT操作时,,系统会会自动按按照sales_date值的范围围将数据据插入到到相应的的分区段段上。例例如:insertintosalesvalues(1,28500,'25-JAN-2001');insertintomalesvalues(2,30500,'25-MAY-2001');当执行了了上述INSERT语句之后后,会将将第一条条数据插插入到分分区P1上,而第第二条数数据被插插入到分分区P2上。当执执行SELECT、UPDATE、DELETE操作时,,如果在在WHERE子句中引引用了分分区列,,那么Oracle会自动在在相应分分区上执执行操作作,从而而降低I/O操作的次次数,进进而提高高性能。。列表分区区如果分区区字段的的值并不不能划分分范围((非数字字或日期期数据类类型),,同时分分区字段段的取值值范围只只是一个个包含少少数值的的集合,,那么可可以对表表进行列列表分区区。在进进行列表表分区时时,需要要为每个个分区指指定一个个取值列列表,分分区字段段值处于于同一个个取值列列表中的的记录被被存储在在同一个个分区中中。列表分区区适用于于那些分分区字段段是一些些无序的的或者无无关的取取值集合合的表。。下面以以建立sales_by_region表表为例,,说明使使用列表表分区建建立分区区表的方方法,示示例如下下:createtablesales_by_region(deptnonumber,dnamevarchar2(20),quarterly_salesnumber(10,2),cityvarchar2(10))partitionbylist(city)(partitionplvalues('北京','上海'),partitionp2values('重重庆','广广州'),partitionp3values('南京','武汉'));其中,PARTITIONBYLIST(column)指定分区区方法为为列表分分区,column指定分区区列名。。当执行了了上述命命令之后后,Oracle会为表sales_by_region建立三个个分区段段。当在在分区表表上执行行INSERT操作时,,系统会会自动按按照city列的值将将数据插插入到相相应的分分区段上上,例如如:insertintosales_by_regionvalues(10,'SALES',20800,'上海');insertintosales_by_regionvalues(10,'SALES',24800,'重庆庆');insertintosales_by_regionvalues(10,‘‘SALES’,28800,‘‘武汉’);当执行了了上述INSERT语句之后后,会将将第一条条数据插插入到分分区P1上,第二二条数据据则会被被插入到到分区P2上,而第第三条数数据则会会被插入入到分区区P3上。当执执行SELECT、UPDATE、DELETE操作时,,如果WHERE子句引用用了分区区列,那那么Oracle会自动在在相应分分区上执执行操作作,从而而降低I/O操作的次次数,进进而提高高性能。。散列分区区在进行范范围分区区或列表表分区的的时候,,有时由由于用户户无法对对各个分分区中可可能具有有的记录录数目进进行预测测,可能能会产生生某个分分区中记记录很多多,而某某个分区区中记录录很少的的不平衡衡分区情情况。这这时应创创建散列列分区。。散列分区区是指按按照Oracle所提供的的散列(HASH)函数来计计算列值值数据,,并最终终按照函函数结果果来分区区数据。。下面以以建立分分区表PRODUCT为例,说说明使用用散列分分区建立立分区表表的方法法,示例例如下::createtableproduct(product_idnumber(6),descriptionvarchar2(30))partitionbyhash(product_id)(partitionpltablespacelocall,partitionp2tablespacelocal2);其中,PARTITIONBYHASH(column)指定分区区方法为为散列分分区,column指定分区区列名。。当在散散列分区区表上插插入数据据时,系系统会自自动在分分区列PRODUCT_ID上使用用散列函函数进行行运算,,并根据据运算结结果将数数据均匀匀地放置置到不同同分区。。组合分区顾名思义,组组合分区实际际上组合了范范围分区和散散列分区,它它首先按照列列值范围从逻逻辑上进行范范围分区,然然后在每个范范围分区的基基础上再按照照散列函数进进行散列分区区。当不同范范围的数据分分布比较均匀匀时,Oracle建议直接使用用范围分区。。对于某些表表来说,尽管管数据是按照照一定范围分分布的,但因因为不同范围围的数据分布布不均匀,所所以此时可以以使用组合分分区来有效地地分布表的数数据。createtablesales_order(order_idnumber,order_datedate,product_idnumber,quantitynumber)partitionbyrange(order_date)subpartitionbyhash(product_id)subpartitions2storein(users,userl)(partitionp1valueslessthan('01-APR-2001'),partitionp2valueslessthan('01-JUL-2001'),partitionp3valueslessthan('01-OCT-2001'),partitionp4valueslessthan('01-JAN-2002'));其中,STOREIN用于指定散列列分区所在表表空间。在执行了上述述命令之后,,首先按照ORDER_DATE列值进行范围围分区,此时时建立四个逻逻辑上的范围围分区。然后后按照PRODUCT_ID列值进行散列列分区,并将将逻辑上的四四个范围分区区最终转化成成8个物理上的散散列分区段。。当给该组合分分区表插入数数据时,首先先按照order_date列值区逻辑确确定其所在区区,然后用散散列函数计算算product_id的散列值,最最终确定数据据应该放到哪哪个分区中。。6.建立簇表一般情况下,,建立表时Oracle会为该表分配配相应的表段段。例如,当当建立表DEPT和EMP时,Oracle会分别为这两两张表分配表表段DEPT、EMP。并且它们的的数据会分别别存放到这两两个表段中。DEPTNODNAMELOC10ACCOUNTINGNEWYORK20RESEARCHDALLAS30SALESCHICAGO40OPERATIONSBOSTONDEPTDEPTNODNAMESAL20SMITH80030ALLEN160030WARD124020SCOTT200030DEVE1800EMPDEPTEMP表DEPT的所有数据存存放在表段DEPT中,而EMP表的所有数据据则存放在表表段EMP中。假定用户户经常需要执执行类似于““SELECTdname,ename,salFROMdept,empWHEREdept.deptno=emp.deptnoANDdept.deptno=10”的连接查询询语句来检索索部门及其雇雇员的相关信信息,那么至至少需要2次的I/O操作,因为表表DEPT和EMP的数据分别存存放在两个表表段中。这时时,为了降低低硬盘I/O操作的开销,,可以把这两两张表的数据据组织到簇中中。簇是一种用于于存储表中数数据的可选方方法。在一个个簇中,Oracle将多个表的相相关字段聚簇簇在相同的数数据块中。比比如,EMP表和DEPT表都具有DEPTNO字段,DEPTNO字段就是这两两个表的相关关字段(簇键键)。如果将将EMP表和DEPT表聚簇在一起起,那么Oracle会按照部门的的DEPTNO在物理上存储储两个表的所所有记录。簇DEPT_EMP(DEPT、EMP)簇键(deptno)10ACCOUNTINGNEWYORKCLARK2450KING500020RESEARCHDALLASSMITH800SCOTT2000DEPT_EMP创建簇使用CREATECLUSTER语句,执行该该命令要求用用户要有CREATECLUSTER系统权限;如如果要在其他他用户模式中中建立簇,则则要有CREATEANYCLUSTER系统权限。当当建立簇时,,Oracle会为该簇分配配相应的簇段段,因为簇段段所需空间是是从表空间上上分配的,所所以要求簇所所有者必须要要在表空间上上具有相应的的空间配额或或具有UNLIMITEDTABLESPACE系统权限。示示例如下:createclusterdept_emp(deptnonumber(3))pctfree20pctused60size500tablespaceusersstorage(initial200Knext200Kminextents3pctincrease0maxextents50);创建簇后,还还要建簇表。。建立簇表要要求用户必须须具有CREATETABLE系统权限,如如果要在其他他用户模式中中建立簇表,,则必须具有有CREATEANYTABLE系统权权限。。另外外,因因为簇簇表数数据是是放在在簇段段中的的,所所以用用户不不需要要任何何表空空间配配额或或UNLIMITEDTABLESPACE系统权权限。。为了了将表表组织织到簇簇中,,在建建表时时必须须指定定CLUSTER子句。。建立立簇表表的示示例如如下::createtabledept(deptnonumber(3)primarykey,dnamevarchar2(14),locvarchar2(13))clusterdept_emp(deptno);当执行行了上上述命命令后后,将将表DEPT增加到到簇DEPT_EMP中了。。需要要注意意的是是,当当建立立簇表表时不不能指指定STORAGE子句和和块空空间使使用参参数。。当建立立了簇簇和簇簇表之之后,,在插插入数数据之之前必必须首首先建建立簇簇索引引,否否则会会显示示错误误信息息。createindexdept_emp_idxonclusterdept_emptablespaceindxstorage(initial20Knext20Kpctincrease0);7.1.3修改表表1.增增加和和删除除字段段如果目目前的的字段段不能能够完完整地地标识识表的的所有有属性性,那那么通通过增增加字字段可可以间间接地地增加加表的的属性性。使使用ALTERTABLE命令可可以给给表增增加字字段,,示例例如下下:altertabledepartmentaddphonevarchar2(10);altertabledepartmentaddmanagervarchar2(10);使用ALTERTABLE…DROP语句能能够删删除删删除表表中不不再需需要使使用的的字段段。但但是注注意不不能删删除表表中所所有的的字段段,也也不能能删除除SYS模式中中任何何表中中的字字段。。如果果仅需需要删删除一一个字字段,,必须须在字字段名名之前前指定定COLUMN关键字字。比比如,,下列列语句句将删删除EMPLOYEES表中的的AGE字段::altertableemployeesdropcolumnage;如果要要在一一条语语句中中删除除多个个字段段,则则需要要将删删除的的字段段名放放在括括号中中,相相互间间用逗逗号隔隔开,,并且且不能能用COLUMN关键字字。比比如::altertableemployeesdrop(age,sal);当删除除字段段时,,如果果该表表包含含了大大量数数据,,那么么删除除列的的时间间就会会很长长。如如果时时间因因素必必须考考虑,,而字字段也也不再再需要要,那那么你你可以以先将将字段段标记记为UNUSED列,然然后在在适当当时机机删除除该列列的所所有数数据。。标记记列为为UNUSED的方法法如下下:altertableempsetunusedcolumncomm.;当将列列标记记为UNUSED之后,,会从从数据据字典典中删删除该该列的的信息息,并并且在在查看看表结结构时时也不不会看看到该该列的的信息息。但但是该该列的的数据据仍然然存在在,如如果要要删除除UNUSED列的数数据,,则必必须执执行如如下语语句::altertableempdropunusedcolumnscheckpoint1000;其中CHECKPOINTl000用于指指定每每删除除1000行发出出一次次检查查点,,以节节省回回滚段段的空空间使使用。。2.修改表表的参参数设设置在表创创建之之后,,可以以使用用ALTERTABLE语句来来改变变表的的块参参数设设置和和部分分存储储参数数设置置。语语法如如下::ALTERTABLE[schema.]table[storage-clause][PCTFREEinteger][PCTUSEDinteger][INITRANSinteger][MAXTRANSinteger]如,利利用下下面的的语句句可以以为EMPLOYEES表重新新设置置PCTFREE和PCTUSED参数::altertableemployeespctfree30pctused60;在表创创建之之后,,不能能再对对INITIAL存储参参数进进行修修改,,但是是可以以修改改其他他的存存储参参数。。altertableemployeesstorage(next512Kpctincrease0maxextentsunlimited);3.重建表表如果发发现一一个表表的数数据段段具有有不合合理的的区分分配方方式,,但是是又不不能通通过别别的方方法来来调整整(改改变存存储参参数不不会影影响到到已经经分配配的区区),,可以以考虑虑将该该表移移到一一个新新的数数据段段中。。用户户可以以为新新的数数据段段重新新设置置存储储参数数,以以便符符合表表的存存储需需求。。比如,,利用用下面面的语语句可可以将将EMPLOYEES表移动动到同同一个个表空空间的的新数数据段段中::altertableemployeesmovestorage(initial20Knext40Kminextents2maxextents20pctincrease0);新的数数据段段可以以在原原来的的表空空间中中,也也可以以在其其他的的表空空间。。比如如,利利用下下面的的语句句可以以将EMPLOYEES表移动动到表表空间间USERS02的新数数据段段中::altertableemployeesmovetablespaceusers02storage(initial20Knext40Kminextents2maxextents20pctincrease0);4.手工分配和和释放空间间默认情况下下,Oracle会根据存储储参数设置置自动为表表分配区并并计算大小小。若需要要指定大小小的区,则则可使用ALTERTABLEALLOCATEEXTENT语句以手工工方式为表表分配存储储空间。通过手工分分配区,你你可指定区区的大小,,也可控制制将区分布布到哪个数数据文件上上。另外当当执行SQL*loader装载数据时时,如果表表段的空间间不足,则则会导致Oracle为表段动态态分配空间间,这样会会降低数据据装载速度度。为了避避免区的动动态分配,,应该在执执行数据装装载操作前前手工为表表增加足够够大的区。。示例如下下:altertabledepartmentallocateextent(size500Kdatafile'e:\test\users2.dbf');使用ALTERTABLE命令不仅可可以为表段段分配空间间,也可以以释放表上上多余的空空间。如果果表段实际际占用空间间多于所需需空间时,,你可以释释放其所占占用的多余余空间。语语法如下::ALTERTABLE[schema.]tableDEALLOCATEUNUSED[KEEPinteger[K|M]]KEEP指定在高水水位标记((已经使用用的存储空空间和未使使用的存储储空间之间间的分界线线)以上应应该保留的的字节数。。如果使用上上述命令时时没有KEEP子句句,Oracle将将回收高水水位标记以以上所有未未使用空间间。如果高高水位标记记所在的区区小于MINEXTENTS的值,则则Oracle释放放MINEXTENTS以上上的区,既既默认情况况下释放剩剩余空间后后表段的区区个数不会会低于MINEXTENTS,而如果果要释放MINEXTENTS下面的的剩余空间间,需要带带有KEEP0选选项。示例例如下:altertabledepartmentdeallocateunused;5.分析表在Oracle中,,利用ANALYZE语句可可以对表、、索引和簇簇进行分析析,通过分分析可以获获得关于指指定对象的的状态和统统计信息,,并且能够够对指定对对象的存储储格式进行行验证。验证表的存存储结构在ANALYZE语句中使用用VALIDATESTRUCTURE子句,可以以在分析过过程中对表表的存储结结构的完整整性进行验验证。通过过存储结构构的验证,,用户可以以知道表中中是否存在在损坏的数数据块。如如果有损坏坏的数据块块,则需删删除该表并并重建它。。在验证表的的存储结构构时,Oracle会把表中中包含损坏坏数据块的的记录的ROWID插入到一一个名为INVALID_ROWS的的表中。对对EMPLOYEES表进行行结构验证证分析示例例如下:analyzetableemployeesvalidatestructure;然后可查询询INVALID_ROWS表看是否否有损坏的的数据块。。收集表的统统计信息在ANALYZE语句中使用用COMPUTESTATISTICS子句或ESTIMATESTATISTICS子句可以收收集关于表表的物理存存储结构和和特性的统统计信息,,如表中记记录的总数数和记录链链接的总数数,已使用用的数据块块总数,未未使用的数数据块总数数,所有记记录的平均均长度等。。比如,下下面语句对对EMPLOYEES表进行精确确统计信息息:analyzetableemployeescomputestatistics;而利用下列列语句将通通过对200条记录的分分析,获得得对EMPLOYEES表的近似统统计信息::analyzetableemployeesestimatestatics;统计完后,,可查询USER_TABLE、ALL_TABLE和DBA_TABLE数据字典视视图来获得得分析后的的统计信息息。查找表中的的链接记录录和迁移记记录在ANALYZE语句中使用LISTCHAINED_ROWS子句,可以找找出表中的链链接记录和迁迁移记录。Oracle将把表中所有有链接记录和和迁移记录的的ROWID保存到一个名名为CHAINED_ROWS的表中。比如如,下面语句句对EMPLOYEES表进行链接记记录分析:analyzetableemployeeslistchained_rows;6.重命名表如果要修改表表的名称,可可以使用RENAME语句对表进行行重命名。用用户只能对属属于自己模式式中的表进行行重命名。renameemployeestoemp;7.1.4删删减表1.使用DELETE语句deletefromemployees;但是,用DELETE删除记录后,,Oracle不会回收为表表分配的存储储空间,也无无法手工回收收,甚至高水水位标记也都都不会改变。。DELETE通常只来删除除表中指定的的记录,如果果删除表中的的全部记录,,一般用TRUNCATE或DROP语句。2.使用DROP语句DROP语句不仅删除除了表中所有有的记录,还还删除了表结结构。删除表表一般是由表表的所有者来来完成的,如如果要以其他他用户身份删删除表,则要要求该用户必必须具有DROPANYTABLE系统权限,示示例如下:droptableemployeescascadeconstraints;其中,CASCADECONSTRAINTS选项用于指定定级联删除。。当表与其他他表具有主外外键关系时,,删除主表时时必须带有该该选项。3.使用TRUNCATE语句当表结构必须须保留,但表表数据不再需需要时,可以以使用TRUNCATETABLE命令截断表。。当执行该命命令时,会删删除表的所有有数据,并释释放表所占用用的空间,但但会保留表的的结构,具体体命令如下::truncatetableemployees;7.1.5显示表的信息息1.显示用户所包包含的表通过查询数据据字典DBA_TABLES、USER_TABLES可以取得表的的信息,其中中DBA_TABLES可用于显示所所有用户表的的信息,而USER_TABLES则可以显示当当前用户表的的信息,示例例如下:selecttable_namefromdba_tableswhereowner='DEVEP';2.显示表的存储储参数设置当建立表时,,可以指定表表段的存储参参数、块空间间使用参数、、并行度、日日志属性以及及CACHE属性等。通过过查询数据字字典USER_TABLES,可以取得相相应属性信息息,示例如下下:selectpct_free,pct_used,degree,cachefromuser_tableswheretable_name='EMPLOYEES';3.显示表段所在在表空间及尺尺寸当建立表时,,Oracle会自动为表分分配相应的表表段,表段的的名称与表的的名称完全一一致,并且该该表的所有数数据都会存放放在相应表段段中。那么如如何取得段信信息呢?通过查询数据据字典DBA_SEGMENTS或USER_SEGMENTS可以取得段信信息,其中DBA_SEGMENTS用于显示数据据库所有段的的信息,而USER_SEGMENTS则用于显示当当前用户段的的信息,示例例如下:selecttablespace_name,bytesfromuser_segmentswheresegment_name='DEPARTMENT';4.显示表数据占占用的实际空空间以及剩余余空间当建立表时,,Oracle会为表分配相相应的表段。。当在表上执执行INSERT操作时,Oracle会将数据放到到表段的相应应数据块上。。那么如何取取得表数据占占用的实际空空间以及剩余余空间呢?通过查询数据据字典USER_TABLES可以取得这些些信息,但查查询之前必须须首先收集统统计。示例如如下:analyzetableempcomputestatics;selectblocks,empty_blocksfromuser_tableswheretable_name=‘‘EMP’;其中BLOCKS对应于数据据已占用的的实际块个个数,而EMPTY_BLOCKS则对应于剩剩余块个数数。5.显示区信息息当建立表时时,Oracle会为表建立立相应的表表段。段逻逻辑上又是是由一个或或多个区组组成的,而而区又是由由相邻的数数据块所组组成的,那那么如何确确定段包含含哪些区,,以及区的的位置及尺尺寸呢?通过查询数数据字典DBA_EXTENTS,可以显示示区的详细细信息,示示例如下::selectextent_id,file_id,block_id,blocksfromdba_extentswhereowner='DEVEP'andsegment_name='DEPT';其中,extent_id为区编号,,file_id为区所在文文件号,block_id为区的初始始数据块号号,blocks为区所包含含的数据块块个数。6.显示行所在在的实际位位置执行INSERT操作时,服服务器进程程会将数据据插入到表表段的相应应数据块中中,并且Oracle会生成惟一一的ROWID对应于该行行数据。但但用户无法法直接读懂懂ROWID,通过使用用DBMS_ROWID包可以显示示行所在数数据文件、、数据块位位置以及行行位置,如如下所示::selectdeptno,dname,dbms_rowid.rowid_relative_fno(ROWID)file#,dbms_rowid.rowid_block_number(ROWID)block#,dbms_rowid.rowid_row_number(ROWID)row#fromdept;7.2管理索引索引的作用用索引是与表表和簇相关关的一种数数据库对象象,它的作作用类似于于书中的目目录。在没没有目录的的情况下,,要在书中中查找指定定的内容必必须通读全全书,而有有了目录之之后,只需需要通过目目录就可以以快速地找找到包含所所需内容的的页。合理理地使用索索引可以降降低磁盘I/O操作作次次数数,,从从而而提提高高表表的的访访问问性性能能。。ROWID在empno列列上上无无索索引引在empno列列上上存存在在索索引引select*fromempwhereempno=7788假定定表表EMP数据据占占用用了了1000个数数据据块块,,如如果果在在EMPNO列上上不不存存在在索索引引,,那那么么当当执执行行““select*fromempwhereempno=7788”时时需需要要扫扫描描表表的的所所有有数数据据块块,,也也就就是是说说需需要要1000次I/O操作作;;如如果果在在EMPNO列上上存存在在索索引引,,并并假假定定索索引引层层次次为为2,那那么么当当执执行行““select*fromempwhereempno=7788”时时,,在在检检索索了了3个索索引引块块后后就就可可以以定定位位到到行行所所在在的的ROWID,然然后后根根据据ROWID可以以直直接接定定位位到到该该行行数数据据,,也也就就是是说说只只需需要要4次I/O操作作。。显显然然,,使使用用索索引引可可以以大大大大提提高高查查询询速速度度。。2.索引引存存储储方方式式索引引与与表表一一样样,,不不仅仅需需要要在在数数据据字字典典中中保保存存索索引引的的定定义义,,还还需需要要在在表表空空间间中中为为它它分分配配实实际际的的存存储储空空间间。。当当创创建建索索引引时时,,Oracle会自自动动在在用用户户的的默默认认表表空空间间中中或或指指定定的的表表空空间间中中创创建建一一个个索索引引段段,,为为索索引引数数据据提提供供存存储储空空间间。。与与创创建建表表类类似似,,在在创创建建索索引引时时也也可可以以为为它它设设置置存存储储参参数数。。在创创建建索索引引时时,,Oracle首先先对对将将要要建建立立索索引引的的字字段段进进行行排排序序,,然然后后将将排排序序后后的的字字段段值值和和对对应应记记录录的的ROWID存储储在在索索引引段段中中((ROWID是数数据据库库的的伪伪列列,,用用于于存存储储一一个个行行标标识识符符))。。例例如如,,假假设设为为EMPLOYEES表中中的的ENAME字段段创创建建了了索索引引::createindexemp_enameonemployees(ename);则Oracle将先在在EMPLOYEES表中按按照ENAME字段进进行排排序((默认认为升升序排排序)),然然后按按照排排序后后的顺顺序将将ENAME字段值和和对应的的ROWID逐个保存存在索引引中。在索引创创建之后后,如果果执行如如下的一一条查询询语句,,即在WHERE子句中引引用ENAME字段:selectename,salfromemployeeswhereename='JONES';那么Oracle将首先对对索引中中ENAME字段进行行一次快快速搜索索,找到到符合条条件的ENAME字段值所所对应的的ROWID,然后再再利用ROWID到EMPLOYEES表中提取取相应的的记录。。7.2.2建立索引引建立索引引使用CREATEINDEX命令。执执行该命命令的用用户必须须具有CREATEINDEX系统权限限。如果果要在其其他用户户模式中中创建索索引,则则必须具具有CREATEANYINDEX系统权限限。常用的索索引类型型有B*树索引引、位图图索引、、反向索索引、函函数索引引等。1.建立B*树索引B*树索引是是最常用用的索引引,在使使用CREATEINDEX语句创建建索引时时,默认认方式下下将建立立B*树索引。。B*树索引是是以根块块、分支支块、叶叶块来组组织和存存放索引引数据的的,在B*树的叶节节点中存存储索引引字段的的值与ROWID。根块<KINGKING分支块块块KINGMILLERTURNER<BLAKEBLAKEJAMES叶块TURNERWARDMILLERSCOTTSMITHKINGMARTENJAMESJONESBLAKECLARKFORDADAMSALLENBLAKEROWIDCLARKROWIDFORDROWIDB*树索引适适用于那那些具有有高基数数的字段段,即大大部分值值都不相相同的字字段。创创建B*树索引引的语法法如下::CREATE[UNIQUE]INDEX[schema.]indexON[schema.]table(column[ASC|DESC][,column[ASC|DESC]]…)[TABLESPACEtablespace][PCTFREEinteger][INITRANSinteger][MAXTRANSinteger][storage-clause][LOGGING|NOLOGGING][NOSORT]TABLESPACE:用于于指定索索引段所所在表空空间。PCTFREE:用于于指定为为将来INSERT操操作所预预留的百百分比。。若指定定PCTFREE为0,则则可能会会导致索索引数据据占满某某些索引引叶块。。INITRANS:指指定每个个块中预预先分配配的事务务项的数数目。MAXTRANS:限限制分配配给每块块的事务务项的数数目。storage-clause:用用于指定定索引段段存储参参数。LOGGING、NOLOGGING:是是否在重重做日志志中记录录创建索索引的操操作和在在索引上上进行的的后续操操作。NOSORT:指定行行按升序序存储在在数据库库中,这这样,Oracle在创建索索引时就就不必对对行进行行排序。。注意:创创建索引引的时候候,不能能使用pctused参数,因因为删除除索引时时,只是是逻辑删删除,其其物理空空间没有有释放。。如果在WHERE子句中经常常要引用某某列,那么么你可以基基于该列建建立B*树索引。例例如,如果果在应用中中经常要执执行类似于于“SELECT*FROMempWHEREename=‘SCOTT’’”查询语句句,那么你你可以基于于ENAME列建立B*树索引。建建立B*树索引的示示例如下::createindexind_enameonemp(ename)pctfree30storage(initial100Knext100Kpctincrease0minextents2maxextents50)tablespaceindx;当建立了B*树索引之后后,如果在在WHERE子句中包含含有索引列列,如:SELECT*FROMempWHEREename='SCOTT',那么Oracle会自动使用用索引定位位行数据,,从而降低低I/O操作次数,,最终提高高数据访问问速度。2.建立位图索索引位图索引不不同于B*树索引,它它不是以((索引字段段值,ROWID)的方式来来存储索引引信息的,,而是为每每个唯一的的索引字段段值建立一一个位图,,在这个位位图中使用用一个位元元(Bit,取值为0或1)来对应一一条记录的的ROWID。如果该位位元为1,说明与该该位元对应应的ROWID是一条包含含该位图的的索引字段段值的记录录。位元到到ROWID的对应关系系通过位图图索引中的的映射函数数来完成。。创建位图索索引的语法法如下:CREATEBITMAPINDEX[schema.]indexON[schema.]table(column[ASC|DESC][,column[ASC|DESC]]…)[TABLESPACEtablespace][PCTFREEinteger][INITRANSinteger][MAXTRANSinteger][storage-clause][LOGGING|NOLOGGING][NOSORT]假定表CUSTOMER包含有1000万条记录,,该表使用用REGION列表示客户户所在方位位,并且将将来经常需需要引用REGION列进行数据据统计。CUSTOMER表的部分内内容如下所所示:CUSTOMER_IDMARITAL_STATUSREGIONGENDERSALARY101SingleEastMale1000102MarriedCentralFemale1200103MarriedWestFemale8500104DivorcedWestMale1200105SingleCentralFemale750
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 身体护理用化妆制剂市场发展现状调查及供需格局分析预测报告
- 2024年度建筑工程爆破作业专用承包合同
- 茶包托市场发展预测和趋势分析
- 04版瓷砖铺贴工程项目管理合同
- 2024年度幼儿园环境布置合同
- 英式橄榄球市场发展现状调查及供需格局分析预测报告
- 2024年度大连二手房买卖合同(含物业费)
- 空气净化器用过滤器市场需求与消费特点分析
- 2024年度环保产业园区污水处理工程合同
- 2024年度原材料采购供应合同
- 职业暴露后处理流程图
- 血透患者的健康宣教ppt
- ul2464电线线径标准
- NB/T 11123-2023煤矿安全双重预防机制规范
- 国开学习网电大数据库应用技术第四次形考作业实验答案
- 哲学与人生PPT中职全套教学课件全套教学课件
- 区块链技术与应用学习通课后章节答案期末考试题库2023年
- 手术室专科护士培训计划范文(2篇)
- 教师教育科研培训总结(6篇)
- 大学生心理健康教育(高职)PPT全套完整教学课件
- 幼儿园卫生保健知识试题答案,幼儿园卫生保健知识测试题答案
评论
0/150
提交评论