3/16/2009

DBMS常用包介绍

首先介绍:dbms_rowid
DBMS_ROWID包主要是用来获得数据库块的block number,object number等信息
常用的选项有下:
ROWID_BLOCK_NUMBER Function
Returns the block number of a ROWID
根据ROWID获取数据块的NUMBER
SQL> select * from T4 2 ;
ID NAME———- ——————– 1 seagull80 2 liguohua80
SQL> select dbms_rowid.rowid_block_number(rowid) from T4;
DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)———————————— 1514 1514
这个常用来DUMP数据块号,分析
ROWID_CREATE Function
Creates a ROWID, for testing only
用来创建ROWID,一般用来测试
格式如下:
BMS_ROWID.ROWID_CREATE ( rowid_type IN NUMBER, object_number IN NUMBER, relative_fno IN NUMBER, block_number IN NUMBER, row_number IN NUMBER) RETURN ROWID;
ROWID_RELATIVE_FNO Function
Returns the file number of a ROWID
返回ROWID所在文件号
SQL> select dbms_rowid.rowid_relative_fno(rowid) from T4;
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID)———————————— 6 6
SQL> select dbms_rowid.rowid_relative_fno(rowid), dbms_rowid.rowid_block_number(rowid) from T4;
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)———————————— ———————————— 6 1514 6 1514
ROWID_ROW_NUMBER Function
Returns the row number
返回行号
还有如下几个,大家可以参照官方文档
ROWID_TO_ABSOLUTE_FNO Function
Returns the absolute file number associated with the ROWID for a row in a specific table
ROWID_TO_EXTENDED Function
Converts a ROWID from restricted format to extended
ROWID_TO_RESTRICTED Function
Converts an extended ROWID to restricted format
ROWID_TYPE Function
Returns the ROWID type: 0 is restricted, 1 is extended
ROWID_VERIFY Function
Checks if a ROWID can be correctly extended by the ROWID_TO_EXTENDED function
ROWID_INFO Procedure
Returns the type and components of a ROWID
ROWID_OBJECT Function
Returns the object number of the extended ROWID
第2个包:dbms_utility
可以用来将数据块地址转换为块的地址和文件块号
比如我们在分析索引接受时就可以用到
SQL> create index ind_dbms on T4(id);
索引已创建。
SQL> select object_id from dba_objects where object_name=’IND_DBMS’;
OBJECT_ID———- 54147
SQL> alter session set events ‘immediate trace name treedump level 54147′;
会话已更改。
—– begin tree dumpleaf: 0×1000b74 16780148 (0: nrow: 2 rrow: 2)—– end tree dump
我们可以将叶块地址16780148转换为叶块所在文件和块号
SQL> select dbms_utility.data_block_address_file(16780148) “file”, 2 dbms_utility.data_block_address_block(16780148) “block” from dual;
file block———- ———- 4 2932
当然相应我们可以夸大表结构然后重建索引,可以DUMP索引结果的分支快啥的
从汪海BLOG看到如下信息:
unique index和non-unique index它的构造是不一样的。对于unique index,它的branch block里面只保存key value和leaf block的address,因为根据这2个值就可以定位当新值插入时会选择哪个leaf block进行插入,leaf block里面的值也没必要按照rowid的顺序排列了,只需要按照key value排序就行了。但是如果是non-unique index,branch block里面必须保存key value,leaf block的address,和rowid。在leaf block里面如果key value相同的话要按照rowid做升序排列,我个人觉得这样做会有2个好处,一个是可以提高相同一个leaf block内相同key value能尽量关联到相同的data block。第2个好处是当插入新的相同key value时能很容易定位插入到哪个block。为了能做到这些,non-unique index必须在branch block里面放入rowid
功能模块有如下:
ACTIVE_INSTANCES Procedure
Returns the active instance
ANALYZE_DATABASE Procedure
Analyzes all the tables, clusters, and indexes in a database [see alsoDeprecated Subprograms]
ANALYZE_PART_OBJECT Procedure
Analyzes the given tables and indexes
ANALYZE_SCHEMA Procedure
Analyzes all the tables, clusters, and indexes in a schema [see also Deprecated Subprograms]
CANONICALIZE Procedure
Canonicalizes a given string
COMMA_TO_TABLE Procedures
Converts a comma-delimited list of names into a PL/SQL table of names
COMPILE_SCHEMA Procedure
Compiles all procedures, functions, packages, and triggers in the specified schema
CREATE_ALTER_TYPE_ERROR_TABLE Procedure
Creates an error table to be used in the EXCEPTION clause of the ALTER TYPE statement
CURRENT_INSTANCE Function
Returns the current connected instance number
DATA_BLOCK_ADDRESS_BLOCK Function
Gets the block number part of a data block address
DATA_BLOCK_ADDRESS_FILE Function
Gets the file number part of a data block address
DB_VERSION Procedure
Returns version information for the database
EXEC_DDL_STATEMENT Procedure
Executes the DDL statement in parse_string
FORMAT_CALL_STACK Function
Formats the current call stack
FORMAT_ERROR_BACKTRACE Function
Formats the backtrace from the point of the current error to the exception handler where the error has been caught
FORMAT_ERROR_STACK Function
Formats the current error stack
GET_CPU_TIME Function
Returns the current CPU time in 100th’s of a second
GET_DEPENDENCY Procedure
Shows the dependencies on the object passed in.
GET_HASH_VALUE Function
Computes a hash value for the given string
GET_PARAMETER_VALUE Function
Gets the value of specified init.ora parameter
GET_TIME Function
Finds out the current time in 100th’s of a second
INVALIDATE Procedure
Invalidates a database object and (optionally) modifies its PL/SQL compiler parameter settings
IS_CLUSTER_DATABASE Function
Finds out if this database is running in cluster database mode
MAKE_DATA_BLOCK_ADDRESS Function
Creates a data block address given a file number and a block number
NAME_RESOLVE Procedure
Resolves the given name
NAME_RESOLVE Procedure
Calls the parser to parse the given name
PORT_STRING Function
Returns a string that uniquely identifies the version of Oracle and the operating system
TABLE_TO_COMMA Procedures
Converts a PL/SQL table of names into a comma-delimited list of names
VALIDATE Procedure
Converts a PL/SQL table of names into a comma-delimited list of names
这些东西了解下OK,具体用的时候可以看下
第三个dbms_stats
用来收集对象信息比如表 索引,这些信息对于CBO下产生计划有着重要的影响
统计信息包括下面几类:
表统计:包括记录数、block数和记录平均长度。
列统计:列中不同值的数量(NVD)、空值的数量和数据分布(HISTOGRAM)。
索引统计:索引叶块的数量、索引的层数和聚集因子(CLUSTERING FACTOR)。
系统统计:I/O性能和利用率和CPU性能和利用率。
生成统计信息:
统计信息生成技术包括三种:
基于数据采样的估计方式;
精确计算方式;
用户自定义的统计信息收集方式;
其中采用估算方式可以指定总记录数的估算百分比或者总块数的估算百分比。
分区表的统计信息分为几级:分区表的整体信息、分区的统计信息和子分区的统计信息。
最常用的收集统计信息的方式包括:DBMS_STATS包和ANALYZE语句,Oracle推荐使用DBMS_STATS包来收集统计信息。
dbms_stats.gather_database_stats:收集数据库中所有对象的统计信息;在CREATE INDEX和ALTER INDEX REBUILD时可以指定COMPUTE STATISTICS语句,对于非分区表重建索引时会收集表、列和索引的统计信息。对于分区表,只收集索引信息,不会收集表和列信息。
可以在将METHOD_OPT参数设置为“FOR ALL HIDDEN COLUMNS SIZE N”来收集函数索引的索引表达式信息。Oracle根据下列条件来决定使用哪些索引:
索引中的记录数;
索引中不同键值的数量;
索引的层数;
索引中的叶块数;
聚集因子;
每个键值平均叶块数;
如果两个索引的选择性、查询代价和集势都相同,那么优化器会根据索引名称的字母顺序选
常用的有如下:
DBMS_STATS包中用于收集统计信息的过程包括:
dbms_stats.gather_table_stats 收集表、列和索引的统计信息; dbms_stats.gather_schema_stats 收集SCHEMA下所有对象的统计信息; dbms_stats.gather_index_stats 收集索引的统计信息; dbms_stats.gather_system_stats 收集系统统计信息。 dbms_stats.delete_table_stats 删除表的统计信息
dbms_stats.delete_index_stats 删除索引的统计信息 dbms_stats.export_table_stats 输出表的统计信息 dbms_stats.create_state_table dbms_stats.set_table_stats 设置 表的统计 dbms_stats.auto_sample_size
要注意的是,在删除统计信息前最好做个备份以免删除后发生问题用来恢复。
导出 导入 收集、删除统计信息可以:按数据库 数据字典 用户 表 索引来进行
其他可以作为了解
ALTER_DATABASE_TAB_MONITORING ProcedureALTER_SCHEMA_TAB_MONITORING ProcedureALTER_STATS_HISTORY_RETENTION ProcedureCONVERT_RAW_VALUE ProceduresCONVERT_RAW_VALUE_NVARCHAR ProcedureCONVERT_RAW_VALUE_ROWID ProcedureCREATE_STAT_TABLE ProcedureDELETE_COLUMN_STATS ProcedureDELETE_DATABASE_STATS ProcedureDELETE_DICTIONARY_STATS ProcedureDELETE_FIXED_OBJECTS_STATS ProcedureDELETE_INDEX_STATS ProcedureDELETE_SCHEMA_STATS ProcedureDELETE_SYSTEM_STATS ProcedureDELETE_TABLE_STATS ProcedureDROP_STAT_TABLE ProcedureEXPORT_COLUMN_STATS ProcedureEXPORT_DATABASE_STATS ProcedureEXPORT_DICTIONARY_STATS ProcedureEXPORT_FIXED_OBJECTS_STATS ProcedureEXPORT_INDEX_STATS ProcedureEXPORT_SCHEMA_STATS ProcedureEXPORT_SYSTEM_STATS ProcedureEXPORT_TABLE_STATS ProcedureFLUSH_DATABASE_MONITORING_INFO ProcedureGATHER_DATABASE_STATS ProceduresGATHER_DICTIONARY_STATS ProcedureGATHER_FIXED_OBJECTS_STATS ProcedureGATHER_INDEX_STATS ProcedureGATHER_SCHEMA_STATS ProceduresGATHER_SYSTEM_STATS ProcedureGATHER_TABLE_STATS ProcedureGENERATE_STATS ProcedureGET_COLUMN_STATS ProceduresGET_INDEX_STATS ProceduresGET_PARAM FunctionGET_STATS_HISTORY_AVAILABILITY FunctionGET_STATS_HISTORY_RETENTION FunctionGET_SYSTEM_STATS ProcedureGET_TABLE_STATS ProcedureIMPORT_COLUMN_STATS ProcedureIMPORT_DATABASE_STATS ProcedureIMPORT_DICTIONARY_STATS ProcedureIMPORT_FIXED_OBJECTS_STATS ProcedureIMPORT_INDEX_STATS ProcedureIMPORT_SCHEMA_STATS ProcedureIMPORT_SYSTEM_STATS ProcedureIMPORT_TABLE_STATS ProcedureLOCK_SCHEMA_STATS ProcedureLOCK_TABLE_STATS ProcedurePREPARE_COLUMN_VALUES ProceduresPREPARE_COLUMN_VALUES_NVARCHAR2 ProcedurePREPARE_COLUMN_VALUES_ROWID ProcedurePURGE_STATS ProcedureRESET_PARAM_DEFAULTS ProcedureRESTORE_DATABASE_STATS ProcedureRESTORE_DICTIONARY_STATS ProcedureRESTORE_FIXED_OBJECTS_STATS ProcedureRESTORE_SCHEMA_STATS ProcedureRESTORE_SYSTEM_STATS ProcedureRESTORE_TABLE_STATS ProcedureSET_COLUMN_STATS ProceduresSET_INDEX_STATS ProceduresSET_PARAM ProcedureSET_SYSTEM_STATS ProcedureSET_TABLE_STATS ProcedureUNLOCK_SCHEMA_STATS ProcedureUNLOCK_TABLE_STATS ProcedureUPGRADE_STAT_TABLE Procedure以DBMS_STATS.GATHER_SCHEMA_SATTS为例
exec dbms_stats.gather_schema_stats( -ownname => ‘SCOTT’, -options => ‘GATHER AUTO’, -estimate_percent => dbms_stats.auto_sample_size, -method_opt => ‘for all columns size repeat’, -degree => 15 -)
为了充分认识dbms_stats的好处,你需要仔细体会每一条主要的预编译指令(directive)。下面让我们研究每一条指令,并体会如何用它为基于代价的SQL优化器收集最高质量的统计数据。
options参数使用4个预设的方法之一,这个选项能控制Oracle统计的刷新方式:
gather——重新分析整个架构(Schema)。gather empty——只分析目前还没有统计的表。gather stale——只重新分析修改量超过10%的表(这些修改包括插入、更新和删除)。gather auto——重新分析当前没有统计的对象,以及统计数据过期(变脏)的对象。注意,使用gather auto类似于组合使用gather stale和gather empty。注意,无论gather stale还是gather auto,都要求进行监视。如果你执行一个alter table xxx monitoring命令,Oracle会用dba_tab_modifications视图来跟踪发生变动的表。这样一来,你就确切地知道,自从上一次分析统计数据以来,发生了多少次插入、更新和删除操作。
estimate_percent选项以下estimate_percent参数是一种比较新的设计,它允许Oracle的dbms_stats在收集统计数据时,自动估计要采样的一个segment的最佳百分比:estimate_percent => dbms_stats.auto_sample_size
要验证自动统计采样的准确性,你可检视dba_tables sample_size列。一个有趣的地方是,在使用自动采样时,Oracle会为一个样本尺寸选择5到20的百分比。记住,统计数据质量越好,CBO做出的决定越好。
method_opt选项dbms_stats的method_opt参数尤其适合在表和索引数据发生变化时刷新统计数据。method_opt参数也适合用于判断哪些列需要直方图(histograms)。
某些情况下,索引内的各个值的分布会影响CBO是使用一个索引还是执行一次全表扫描的决策。例如,假如在where子句中指定的值的数量不对称,全表扫描就显得比索引访问更经济。
如果你有一个高度倾斜的索引(某些值的行数不对称),就可创建Oracle直方图统计。但在现实世界中,出现这种情况的机率相当小。使用CBO时,最常见的错误之一就是在CBO统计中不必要地引入直方图。根据经验,只有在列值要求必须修改执行计划时,才应使用直方图。
为了智能地生成直方图,Oracle为dbms_stats准备了method_opt参数。在method_opt子句中,还有一些重要的新选项,包括skewonly,repeat和auto:method_opt=>’for all columns size skewonly’method_opt=>’for all columns size repeat’method_opt=>’for all columns size auto’
skewonly选项会耗费大量处理时间,因为它要检查每个索引中的每个列的值的分布情况。
假如dbms_stat发现一个索引的各个列分布得不均匀,就会为那个索引创建直方图,帮助基于代价的SQL优化器决定是进行索引访问,还是进行全表扫描访问。例如,在一个索引中,假定有一个列在50%的行中,如清单B所示,那么为了检索这些行,全表扫描的速度会快于索引扫描。–*************************************************************– SKEWONLY option—Detailed analysis–– Use this method for a first-time analysis for skewed indexes– This runs a long time because all indexes are examined–*************************************************************
begin dbms_stats.gather_schema_stats( ownname => ‘SCOTT’, estimate_percent => dbms_stats.auto_sample_size, method_opt => ‘for all columns size skewonly’, degree => 7 );end;重新分析统计数据时,使用repeat选项,重新分析任务所消耗的资源就会少一些。使用repeat选项(清单C)时,只会为现有的直方图重新分析索引,不再搜索其他直方图机会。定期重新分析统计数据时,你应该采取这种方式。–**************************************************************– REPEAT OPTION - Only reanalyze histograms for indexes– that have histograms–– Following the initial analysis, the weekly analysis– job will use the “repeat” option. The repeat option– tells dbms_stats that no indexes have changed, and– it will only reanalyze histograms for– indexes that have histograms.–**************************************************************begin dbms_stats.gather_schema_stats( ownname => ‘SCOTT’, estimate_percent => dbms_stats.auto_sample_size, method_opt => ‘for all columns size repeat’, degree => 7 );end;使用alter table xxx monitoring;命令来实现Oracle表监视时,需要使用dbms_stats中的auto选项。如清单D所示,auto选项根据数据分布以及应用程序访问列的方式(例如通过监视而确定的一个列的工作量)来创建直方图。使用method_opt=>’auto’类似于在dbms_stats的option参数中使用gather auto。begin dbms_stats.gather_schema_stats( ownname => ‘SCOTT’, estimate_percent => dbms_stats.auto_sample_size, method_opt => ‘for all columns size auto’, degree => 7 );end;
并行收集Oracle允许以并行方式来收集CBO统计数据,这就显著提高了收集统计数据的速度。但是,要想并行收集统计数据,你需要一台安装了多个CPU的SMP服务器。
更快的执行速度dbms_stats是提高SQL执行速度的一种出色机制。通过使用dbms_stats来收集最高质量的统计数据,CBO能够正确判断执行任何SQL查询时的最快途径。dbms_stats还在不断地改进。目前,它的一些令人激动的新特性(自动样本大小和自动直方图生成)已经显著简化了Oracle专家的工作。
详细DBMS包见 http://lbdwww.epfl.ch/f/teaching/courses/oracle8i/server.815/a68001/dbms_sta.htm