oracle脚本,oracle开发常用脚本(三)1

4. ORACLE8i与系统管理有关的新特性Oracle8i引入了几项崭新的特性,可简化对ORDBMS的管理,并使其更易*作和使用。4.1本地化管理表空间 在Oracle8I以前,表空间的使用状况都是通过数据字典来完成的,称为Dictionary-Managed Tablespace.在Oracle8I推出以前,这一直都是唯一的表空间管理方式。自从Oracle8I以后,Oracle又增加了一种新的表空间管理方式:Locally ManagedTablespace(本地化管理的表空间)。 在传统的数据字典管理的表空间里,Oracle在数据字典的表里面记录了每个表空间的每个区的使用状况:每当一个区被使用或被释放时,Oracle都在数据字典里面更新相应的信息,并产生相应的redo信息。在Oracle8I里,这仍然是默认的表空间管理方式。 在Oracle8I的版本中,Oracle推出了一种全新的表空间管理方式:本地化管理的表空间。所谓本地化管理,就是指Oracle不再利用数据字典的表来记录Oracle表空间里面的区的使用状况,而是在每个表空间的数据文件的头部加入了一个记录块,在其中记录每个区的使用状况。每当一个区被使用,或者被释放以供重新使用时,Oracle都会更新数据文件头部的这个记录,反映这个变化。 本地化管理的表空间的创建过程: 语法:CREATE TABLESPACE表空间名字 DATAFILE 数据文件详细信息 [EXTENT MANAGEMENT { DICTIONARY | LOCAL {AUTOALLOCATE | UNIFORM. [SIZE INTETER [K|M] ] } } ] 解释:关键字EXTENT MANAGEMENT LOCAL指定这是一个本地化管理的表空间。对于系统表空间,只能在创建数据库的时候指定EXTENT MANGEMENT LOCAL,因为它是数据库创建时建立的第一个表空间。 若为DICTIONARY,则表明这是一个传统的数据字典管理的表空间,这是个默认选项。当选择了LOCAL关键字,即表明这是这是一个本地化管理的表空间后,还可以继续选择更细的管理方式:是AUTOALLOCATE还是UNIFORM.。若为AUTOALLOCATE,则表明让Oracle决定区块的使用办法;若选择了UNIFORM,则还可以详细指定每个区块的大小,若不加指定,则为每个区使用1M大小。 是本地化管理的表空间还是创建数据字典管理的表空间只能在创建表空间的时候指定。在表空间已经创建以后,则不能再把本地化管理的表空间和数据字典管理的表空间再相互转换。在创建临时表空间时,也可以在CREATE TEMPORARY TABLESPACE中指定EXTENT MANAGEMENT LOCAL来指定这是一个本地化管理的表空间。 本地化管理表空间的优点: 1.本地化管理的表空间避免了递归的空间管理*作。而这种情况在数据字典管理的表空间是经常出现的,当表空间里的区的使用状况发生改变时,数据字典的表的信息发生改变,从而同时也使用了在系统表空间里的回滚段。 2.本地化管理的表空间避免了在数据字典相应表里面写入空闲块、已使用块的信息,从而减少了数据字典表的竞争。 3.区的本地化管理自动跟踪表空间里的空闲块,减少了手工合并自由空间的需要。 4.表空间里的区的大小可以选择由Oracle系统来决定,或者由数据库管理员指定一个统一的大小。 5.从由数据字典来管理空闲块改为由数据文件的头部记录来管理空闲块,这样避免产生回滚信息,不再使用系统表空间里的回滚段。因为由数据字典来管理的话,它会把相关信息记在数据字典的表里,从而产生回滚信息。由于这种表空间的以上特性,所以它支持在一个表空间里边进行更多的并发*作,并减少了对数据字典的依赖。当然本地化管理的表空间也不是对所有的数据库和数据库对象都是适用的。首先,它不能指定存储特性,无STORAGE子句可供使用。其次,它不适用于存储较小的数据库对象。 总的来说,oracle8I提供了这种全新的表空间管理方式,给了我们更多的选择。对于用来存储大对象的表空间和临时表空间来说,用本地化管理的表空间组织方式不失为一个较好的选择。 4.2 FBI索引 Oracle8i的很重要的一个新特性就是增加了function-based index这种索引类型(后面简称为FBI)。有了这个特性后,Oracle DBA就可以在索引中使用函数或者表达式了。这些函数可以使Oracle自己的函数,也可以使用户自己的PL/SQL函数等。DBA在SQL语句调优的过程中遇到的一个很常见的问题就是,如何优化那些在WHERE子句中使用了函数的语句。因为在以前,在WHERE子句中使用函数会使在这个表上创建的索引没法利用,从而难以提高这个语句的性能。例子:使用基于成本的优化器,索引为标准的B树索引,建立在SURNAME列上。SQL>create index non_fbi _disibledevent=> Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT ptimizer=CHOOSE (Cost=3 Card=1 Bytes=17) 1 0 SORT (AGGREGATE) 2 1 TABLE ACCESS (FULL) OF SALES_CONTACTS (Cost=3 Card=16Bytes=272) 从SQL*PLUS的autotrace产生的执行路径可以看到,虽然我们在WHERE子句中用到的SURNAME列上创建了索引,但是仍然执行的是全表扫描。如果这张表很大的话,这回消耗大量的时间。 现在我们试着建立一个FBI索引: SQL>create index fbi _disibledevent=>ELLISON ; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=1 Bytes=17) 1 0 SORT (AGGREGATE) 2 1 INDEX (RANGE SCAN) OF FBI (NON-UNIQUE) (Cost=2 Card=381Bytes=6477) 从SQL*Plus返回的执行计划我们可以看到,这次,Oracle对表不再全表扫描,而是先扫描索引,因为优化器可以知道FBI索引得存在。 使用FBI索引所能够带来的性能提升取决于表的大小、表中重复记录的量、在WHERE子句中使用的列等因素。 有一点需要清楚,FBI索引并不真正在索引里边存储了表达式的结果,而是使用了一个"表达树"(expression tree)。 由优化器来对SQL语句中的表达式进行解析,并且和FBI索引上面的表达式进行对比。这里,SQL函数的大小写时敏感的。因此要求SQL语句中使用的函数和创建FBI索引得时候的那个SQL函数的大小写一致,否则无法利用这个FBI索引。因此,在编程的时候要有一个良好的编程风格。 Init.ora里边需要修改的参数 下面这几个参数必须在init.ora里边指定: QUERY_REWRITE_INTEGRITY = TRUSTED QUERY_REWRITE_ENABLED = TRUE COMPATIBLE = 8.1.0.0.0 (or higher) 授权: 要使一个用户能够创建FBI索引,他必须被授予以下权限:CREATE INDEX和QUERYREWRITE,或者CREATE ANY INDEX和GLOBAL QUERY REWRITE这两个权限。 索引的使用者必须能够有那个FBI索引上使用的那个函数的执行权限。如果没有相应的权限,那么这个FBI索引得状态将变成DISABLED(DBA_INDEXES)。 如果那个FBI索引得状态是DISABLED,那么DBA可以这样来处理: A:删除并重建 B:ALTER INDEX index_name ENABLED。这个Enabled只能对FBI索引使用。 C:ALTER INDEX UNUSABLE; 注意:如果一个查询中使用到了这个索引,但是这个FBI索引的状态是DISABLED,但是优化器选择了使用这个索引,那么将会返回一个Oracle错误。 例子: ORA error: ERROR at line 1: ORA-30554: function-based index MYUSER.FBI is disabled. 而且,一旦这个FBI索引的状态是Disabled,那么这张表上所有涉及索引列的DML*作也将失败。除非这个索引得状态变成UNUSABLE,而且在初始化参数里边指定SKIP_UNUSABLE_INDEXES为TRUE。 一些例子: SQL>CREATE INDEX expression_ndx ON mytable ((mycola + mycolc) * mycolb); SQL>SELECT mycolc FROM mytable WHERE (mycola + mycolc) * mycolb <= 256; 复合索引的例子: SQL>CREATE INDEX example_ndx ON myexample (mycola, UPPER(mycolb), mycolc); SQL>SELECT mycolc FROM myexample WHERE mycola = 55 AND UPPER(mycolb) = JONES ; 限制和规则总结: 对于下面这些限制,不能创建FBI索引: a) LOB列 b) REF c) Nested table列 d)包含上面数据类型的对象 FBI索引必须遵守下面的规则: a)必须使用基于成本的优化器,而且创建后必须对索引进行分析 b)不能存储NULL值。因为任何函数在任何情况下都不能返回NULL值。 c)如果一个用户定义的PL/SQL例程失效了,而且这个例程被FBI索引用到了,那么相应的这个FBI索引会变成DISABLED d)创建FBI索引得函数必须是确定性的。即,对于指定的输入,总是会返回确定的结果。 e)索引的属主如果没有了在FBI索引里面使用的函数的执行权限,那么这个FBI索引会变成DISABLED. f)在创建索引得函数里面不能使用SUM等总计函数。 g)要把一个DISABLED了的索引重新变成ENABLED,这个函数必须首先是ENABLED的才可以。
Tags: 

延伸阅读

最新评论

发表评论