Oracle8数据库系统改进表的存取性能-索引与数据簇分区选件-分区表与分区索引并行选件-SQL语句并行处理新的数据类型(多媒体数据类型)索引索引在数据库应用中,性能主要取决于存取表中数据的速度。索引可以快速找到待定的表记录。索引维护与应用:索引对用户透明当有索引且能提高应用的性能时,Oracle自动使用索引。Oracle自动更新索引以使其与表同步。索引类型B树索引(系统自动为主码和唯一完整性约束建立)位图索引索引表,分区索引,反向键值索引…。SMITHALLENWARDJONESMARTINBLAKECLARKSCOTTKINGTURNERADAMSJAMESFORDMILLERB树索引createindex索引名on表名(列名)ADAMSALLENBLAKECLARKFORDJAMESJONESKINGMARTINMILLERSCOTTSMITHTURNERWARDMILLERTURNERBLAKEJAMESKINGROWID对于索引列的每一个可能的值,都有独立的位图项。在位图项中的每一位代表一个可能的ROWID,为1意味着该行包含关键值。例如:LOC列(3种取值)北京(010011)天津(100000)上海(001100)第二个记录第一个记录位图函数可以将位的位置转换为实际的ROWID。通过位图索引的合并简化查询条件,从而过滤被访问的数据集合。位图索引d01合资d02合资d03合资d04外企d05国企d06合资dnotype天津北京上海上海北京北京locselectdnofromdepwheretype=‘合资’andlocin(‘北京’,‘上海’);合资北京上海10001101d021011d030AND0OR1=001001101d06位图索引的例子位图索引建立位图索引;createbitmapindexdep_indexondep(type);createbitmapindexdep_indexondep(doc);位图索引适用于列的值取值不多的情况、索引列含有越多的值,位图项就越多,需要存储索引的空间也越大。由于Oracle必须展开一个位图索引的方式,所以不适于经常插入或更新数据的应用。位图索引典型地用于决策系统与数据仓库应用中查询数据。簇(聚集)索引当cluster建立后,必须建立簇索引后,被聚集的表才能访问。系统不会自动为簇建索引。例:createclusertdep_emp(depnochar(3));createtabledep(dno..,dname..,…)clusterdep_emp(dno);createtableemp(emp…,…dno...)clusterdep_emp(dno);createindexdep_emp_idxonclusterdep_emp;簇(聚集)索引簇索引表的存储e01王山男d01佳月公司8200e02张丽女d01e10孙军男d02运通公司2034d03安合物业6800来自emp来自depclusterkey分区选件分区选件分区的原因表和索引迅速膨胀数据仓库和决策支持的需要什么是分区大的表或索引可以拆分为小的易于管理的数据片断,例如将销售表按销售日期拆分成一系列数据片断其中每一个片断称为一个分区(partition)被分区的表称为分区表。数据仓库的概念数据仓库就是面向主题的、集成的、稳定的、不同时间的数据集合,用以支持经营管理中的决策制定过程。主题是一个在较高层次将数据归类的标准,每一个主题对应一个宏观的分析领域数据仓库的集成特性是指在数据进入数据仓库之前,必须经过数据加工和集成,统一原始数据中的矛盾之处,将原始数据结构做一个从面向应用向面向主题的转变。数据仓库的稳定性是指数据仓库反映的是历史数据的内容,而不是日常事务处理产生的数据,进入数据仓库后是极少或根本不修改的数据仓库的概念数据仓库最根本的特点是物理地存放数据。这些数据并不是最新的、专有的,而是来源于其它数据库的。数据仓库的建立并不是要取代数据库,它要建立在一个较全面和完善的信息应用的基础上,用于支持高层决策分析。而事务处理数据库在企业的信息环境中承担的是日常操作性的的任务。数据仓库是数据库技术的一种新的应用,而且到目前为止,数据仓库还是用数据库管理系统来管理其中的数据。分区只有表和索引可以分区。分区对于应用人员和用户是透明的。分区可以控制数据的存储地点:将数据分散存储在多个磁盘上。将经常使用的数据放在快速的磁盘上。分区可以有不同的物理属性:分区可以有不同的存储参数(tablespace,pctfree,pctused,等等)分区表或索引可以跨表空间存储,分区不可以。同一模式对象的所有分区必须具有相同的逻辑属性:相同的列,数据类型,约束。分区的作用增加了数据的可用性不同的分区可以跨表空间存储,可以进行分区级的备份和恢复。不同的分区可以跨表空间存储,降低了磁盘损坏带来的数据不可用性。不可用的分区不会影响到对其它分区的查询和维护提高了系统性能服务器可以进行智能的分区检测跳过与查询无关的分区访问跳过不在线的分区在物理设备上负载均衡将数据分散存储在多个磁盘上,实现并行存取分区关键字分区关键字决定了划分分区的依据只能是标准数据类型:Number,Date,Character(VARCHAR2,CHAR)可以是多至16个的列的联合对关键字的修改不能导致记录在分区之间的移动分区的数据范围LESSTHAN子句指定每个分区的上限值。除第一个分区外,每一个分区都有一个隐含的下限值(即前一个分区的上限值)。最后一个分区的上限值可以设定为MAXVALUE必须按照升序排列来声明分区。建立分区表例1CREATETABLEsales97(acct_nonumber(5),product_idnumber(12),qtynumber(8),sales_datedate)PARTITIONBYRANGE(sales_date)(PARTITIONp1VALUESLESSTHAN(to_date('01-4月-1997','dd-mon-yyyy'))TABLESPACEp1_space,PARTITIONp2VALUESLESSTHAN(to_date('01-7月-1997','dd-mon-yyyy'))TABLESPACEp2_space,PARTITIONp3VALUESLESSTHAN(to_date('01-10月-1997','dd-mon-yyyy'))TABLESPACEp3_space,PARTITIONp4VALUESLESSTHAN(MAXVALUE));建立分区表例2CREATETABLEstu_score(stu_numNUMBER(5),scorenumbernotnull,test_yearnumbernotnull,test_monthnumbernotnull,test_daynumbernotnull)PARTITIONBYRANGE(test_year,test_month,test_day)(PARTITIONscore_q1VALUESLESSTHAN(1997,07,01)TABLESPACEeducation1,PARTITIONscore_q2VALUESLESSTHAN(1998,02,01)TABLESPACEeducation2)查看分区情况查分区表分区数selectpartition_countfromuser_part_tableswheretable_name='SALES97'PARTITION_COUNT----------------------------4查分区表分区划分情况情况selectpartition_name,tablespace_name,partition_position,high_valuefromuser_tab_partitionswheretable_name='STU_SCORE’;--------------------------------------------------------------------SCORE_Q1EDUCATION111997,07,01SCORE_Q2EDUCACION221998,02,01建立分区注意事项设置分区的界限VALUESLESSTHAN定义了分区的上界VALUESLESSTHAN必须取值Number,Character,DateMAXVALUE定义分区的最上界任何合法的存储子句均可用于分区(tablespace,pctfree...)没有为单独的分区设置存储子句时,使用基表的存储子句在分区表中不能包含LONG类型的列。系统为每一分区设置一个隐含的CHECK约束(分区的最高限制是MAXVALUE时除外)。聚集表不能分区分区表的访问分区对表名的扩展:[模式名.]表名[PARTITION(分区名)]例:SELECT*FROMsales97WHEREqty1000ANDsales_dateBETWEEN‘01-4月-97’AND‘30-6月-97’;指定分区SELECT*FROMsales97PARTITION(p2)WHEREqty1000;INSERTINTOsales97PARTITION(p4)SELECT*FROMlastest_data;注意:分区表名的不兼容性分区表的访问分区值的检查insertintostu_scorevalues(98007,50,1998,2,1);错误位于第1行:ORA-14400:插入的分区键超出最高的合法分区键。使用别名select*fromstu_scorepartition(score_q1)q1whereq1.score85建立视图createviewsco_q1asselect*fromstu_scorepartition(score_q1);分区索引一般索引(非分区索引)CREATEINDEXsales97_idxONsales97(sales_date);分区索引—索引分区只有当索引本身足够大且适于分区时,索引分区才是有意义的。索引分区可提高可用性,提供并行索引扫描,提高性能。选择分区索引的主列(索引列)与选择非分区索引主列没有区别(根据where子句的应用)。分区索引策略一旦决定为表创建一个分区索引,必须决定如何组织、划分该索引的分区。两种选择:全局分区索引(GLOBAL):按自定的索引关键字来分区,对等分区索引,也称局部索引(LOCAL):创建与分区表的各分区一一对应的索引分区GLOBAL分区表分区表非分区表LOCAL分区索引对等分区索引非分区索引对等分区对象定义:下列属性完全一样的两个模式对象有相同的分区关键字相同数量的分区相同的分区界限使用对等分区的优点:对等分区对象是主、细表。全部对应的主细记录在相应的数据分区中,可很快完成两个表的连接。在这种情况下,磁盘存取的减少类似于使用数据簇(聚集)来“予连接”主细表。对等分区的对象是表和索引::当查询时,特定索引分区中的全部键值只引用相应表分区中的记录。当一个分区不可用时只有相应的分区索引不可用,不影响其他分区及分区索引,因此提高数据可用性。当更新一个表分区的数据时,只须调整相应的分区索引。分区表与对等分区索引建分区表CREATETABLEsales97(acct_noNUMBER(5),product_idNUMBER(12),qtyNUMBER(8),sales_dateDATE)PARTITIONBYRANGE(sales_date)(PARTITIONq1VALUESLESSTHAN…,PARTITIONq2VALUESLESSTHAN…,PARTITIONq3VALUESLESSTHAN…,PARTITIONq4VALUESLESSTHAN….);建分区索