常用的dbms 包介绍
2 ;
———- ——————–
1 seagull80
2 liguohua80
————————————
1514
1514
rowid_type IN NUMBER,
object_number IN NUMBER,
relative_fno IN NUMBER,
block_number IN NUMBER,
row_number IN NUMBER)
RETURN ROWID;
————————————
6
6
———————————— ————————————
6 1514
6 1514
———-
54147
leaf: 0×1000b74 16780148 (0: nrow: 2 rrow: 2)
—– end tree dump
2 dbms_utility.data_block_address_block(16780148) “block” from dual;
———- ———-
4 2932
的。对于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
在CREATE INDEX和ALTER INDEX REBUILD时可以指定COMPUTE STATISTICS语句,对于非分区表重建索引时会收集表、列和索引的统计信息。对于分区表,只收集索引信息,不会收集表和列信息。
Oracle根据下列条件来决定使用哪些索引:
dbms_stats.gather_schema_stats 收集SCHEMA下所有对象的统计信息;
dbms_stats.gather_index_stats 收集索引的统计信息;
dbms_stats.gather_system_stats 收集系统统计信息。
dbms_stats.delete_table_stats 删除表的统计信息
dbms_stats.export_table_stats 输出表的统计信息
dbms_stats.create_state_table
dbms_stats.set_table_stats 设置 表的统计
dbms_stats.auto_sample_size
ALTER_SCHEMA_TAB_MONITORING Procedure
ALTER_STATS_HISTORY_RETENTION Procedure
CONVERT_RAW_VALUE Procedures
CONVERT_RAW_VALUE_NVARCHAR Procedure
CONVERT_RAW_VALUE_ROWID Procedure
CREATE_STAT_TABLE Procedure
DELETE_COLUMN_STATS Procedure
DELETE_DATABASE_STATS Procedure
DELETE_DICTIONARY_STATS Procedure
DELETE_FIXED_OBJECTS_STATS Procedure
DELETE_INDEX_STATS Procedure
DELETE_SCHEMA_STATS Procedure
DELETE_SYSTEM_STATS Procedure
DELETE_TABLE_STATS Procedure
DROP_STAT_TABLE Procedure
EXPORT_COLUMN_STATS Procedure
EXPORT_DATABASE_STATS Procedure
EXPORT_DICTIONARY_STATS Procedure
EXPORT_FIXED_OBJECTS_STATS Procedure
EXPORT_INDEX_STATS Procedure
EXPORT_SCHEMA_STATS Procedure
EXPORT_SYSTEM_STATS Procedure
EXPORT_TABLE_STATS Procedure
FLUSH_DATABASE_MONITORING_INFO Procedure
GATHER_DATABASE_STATS Procedures
GATHER_DICTIONARY_STATS Procedure
GATHER_FIXED_OBJECTS_STATS Procedure
GATHER_INDEX_STATS Procedure
GATHER_SCHEMA_STATS Procedures
GATHER_SYSTEM_STATS Procedure
GATHER_TABLE_STATS Procedure
GENERATE_STATS Procedure
GET_COLUMN_STATS Procedures
GET_INDEX_STATS Procedures
GET_PARAM Function
GET_STATS_HISTORY_AVAILABILITY Function
GET_STATS_HISTORY_RETENTION Function
GET_SYSTEM_STATS Procedure
GET_TABLE_STATS Procedure
IMPORT_COLUMN_STATS Procedure
IMPORT_DATABASE_STATS Procedure
IMPORT_DICTIONARY_STATS Procedure
IMPORT_FIXED_OBJECTS_STATS Procedure
IMPORT_INDEX_STATS Procedure
IMPORT_SCHEMA_STATS Procedure
IMPORT_SYSTEM_STATS Procedure
IMPORT_TABLE_STATS Procedure
LOCK_SCHEMA_STATS Procedure
LOCK_TABLE_STATS Procedure
PREPARE_COLUMN_VALUES Procedures
PREPARE_COLUMN_VALUES_NVARCHAR2 Procedure
PREPARE_COLUMN_VALUES_ROWID Procedure
PURGE_STATS Procedure
RESET_PARAM_DEFAULTS Procedure
RESTORE_DATABASE_STATS Procedure
RESTORE_DICTIONARY_STATS Procedure
RESTORE_FIXED_OBJECTS_STATS Procedure
RESTORE_SCHEMA_STATS Procedure
RESTORE_SYSTEM_STATS Procedure
RESTORE_TABLE_STATS Procedure
SET_COLUMN_STATS Procedures
SET_INDEX_STATS Procedures
SET_PARAM Procedure
SET_SYSTEM_STATS Procedure
SET_TABLE_STATS Procedure
UNLOCK_SCHEMA_STATS Procedure
UNLOCK_TABLE_STATS Procedure
UPGRADE_STAT_TABLE Procedure
以DBMS_STATS.GATHER_SCHEMA_SATTS为例
ownname => ‘SCOTT’, -
options => ‘GATHER AUTO’, -
estimate_percent => dbms_stats.auto_sample_size, -
method_opt => ‘for all columns size repeat’, -
degree => 15 -
)
使用4个预设的方法之一,这个选项能控制Oracle统计的刷新方式:
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参数是一种比较新的设计,它允许Oracle的dbms_stats在收集统计数据时,自动估计要采样的一个segment的最佳百分比:
estimate_percent => dbms_stats.auto_sample_size
dbms_stats的method_opt参数尤其适合在表和索引数据发生变化时刷新统计数据。method_opt参数也适合用于判断哪些列需要直方图(histograms)。
method_opt=>’for all columns size skewonly’
method_opt=>’for all columns size repeat’
method_opt=>’for all columns size auto’
–*************************************************************
– 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
–*************************************************************
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专家的工作。