Archive for 五月, 2008

Parallel Execution for a Session

星期四, 五月 1st, 2008

并行执行会话,有时候为了加快执行速度,充分利用多CPU资源,进行比如并行创建索引的操作.

要使用并行执行某些操作可以使用alter session 语句

 ALTER SESSION ENABLE PARALLEL DML|DDL|QUERY

关闭用如下语句

alter session disable parallel DDL|DML|QUERY

强制并行执行:

 ALTER SESSION FORCE PARALLEL DML|DDL|QUERY

终止一个用户会话执行用如下语句:

ALTER SYSTEM KILL SESSION ‘7,15′; 其中 7是系统进程号 15是serial

查询某个用户的会话

SELECT SID, SERIAL#, STATUS
  FROM V$SESSION
  WHERE USERNAME = ‘username’;

如果你杀掉了一个正在执行事务的会话,那么用户的事务将回滚,并且用户就收到如下信息:

ORA-00028: your session has been killed

如果你终止了一个不活动的会话,用户不会立即收到00028错误,而在用户在执行某项操作时会收到错误信息

牙痛–真要命

星期四, 五月 1st, 2008

这几天,一直与牙痛做斗争,这是一颗补过的牙,到现在已经有快五年了,本来想上火,吃点消炎的就好了,但是好像没什么效果,第一天一晚上没睡着,第二天就去了北医三院去处理了下,花了我700米,本来想应该舒服点了,哎,结果比之前更疼了,当时已经回家了,没办法在去买点止疼药吧,结果吃完了,没效果,实在受不了,就去冰箱里找了几个易拉罐啤酒放在靠近坏牙的脸上,没想到比吃药的效果好,可能疼来源于牙龈充血的缘故,一晚上把易拉罐扔冰箱里,一会拿出来,一个一个换,一会抱着易拉罐睡了,早上醒来又开始疼拉,气死我了,赶紧又吃了点药,又去冰箱里拿了易拉罐,继续冰,过了一会感觉药起点作用了,想想今天FESCO来公司报销医疗,有部分费用可以给报销,忍着来公司,希望这个月结束,一切都是新的,新的起点,新的希望。

 

STOP 0×0000006B Process1_Initialization_Failed

星期四, 五月 1st, 2008

STOP 0×0000006B Process1_Initialization_Failed

今天早上来到公司,帮同事处理了个错误

XP P版,启动一会,蓝屏,主要错误如下

 停止 0×0000006B (0xC0000034、 0 x 00000002、 0 x 00000000、 0 x 00000000)
Process1_Inialization_Failed。

STOP 代码, 0XC0000034, 中第一个参数表示:
div class=”errormsg” STATUS_OBJECT_NAME_NOT_FOUND /div
未找到对象名

原因是因为:NTDLL.DLL文件损坏导致,解决方法也就简单了

找个XP的安装盘,启动到恢复模式,

然后把c:\windows\system32\下的Ntdll.dll文件重命名,做个备份,然后把光盘里的I386\system32\NTDLL.DLL 复制到系统c:\windows\system32下

当前路径光盘

copy  I386\system32\NTDLL.DLL C:\winidows\system32

然后退出,重新启动OK,建议把相关资料备份下,重新安装下系统。

新的起点,新的开始–杭州

星期四, 五月 1st, 2008

经过一夜的折腾,两天里的收拾,终于在杭州安下了。
在北京生活了六年,基本熟悉那里的地理和生活环境,这次选择来杭州也考虑过很多,主要还是和自己的职业规划有关系,还有考虑LP的工作,希望在里能收获更多,也希望大家都能取得自己想要的东西,杭州相比北京来说,消费水平是比较高的,交通也没比北京好多少,而且选择机会比较少,原来在北京住在回龙观,3居2厅2卫,一月才2K,而且装修和家具都挺齐全,那边地铁也方便,去哪上班都还OK,地铁的拥挤还是能接受,在大城市,这个是没法改变的,相同的时间里,有限的运力,无限的人员需求导致。杭州这边的租房比北京就贵多了,基本上赶上3环的价格了,在杭州组了2居,2.3K左右,在这里还的感谢BABY_RULE多亏他的帮忙才这么快在杭州安顿下来,有朋友就是好,还是那句话,朋友多了路好走,^_^。这几天在慢慢熟悉周围的环境,特别是地理环境,来这边别人问我在哪?我都不知道?我在什么位置,我只知道小区名字,别人告诉杭州小区N多,我怎么知道你那小区在那?哈哈,我在哪呢?杭州这边的路名到不少?不过总体感觉这边规划太差,开车的,骑电动,都特别猛,特别的开车,如果在北京,不知道出多少事故,交多少罚单。电动车更是开的比哪啥还快,走路的小心,人行道上也满是骑车的,这要是盲人可咋办呢?不过杭州的环境还是不错的,可真是鸟语花香啊,养鸟的不少?空气也很清新,到处到是绿色,比北方有趣多了。
不撤了,希望所有的朋友有时间来我家做客,特别杭州的牛牛们,哈哈,我的手机号:原来号码也在使用,只限短信了,现在新号码?可以去看我QQ资料,就不公布了。
希望在杭州每一天都有所收获,还是那句话,每天多做一点,每天进步一点!

常用的dbms 包介绍

星期四, 五月 1st, 2008

首先介绍: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 dump
leaf: 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 Procedure
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为例

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专家的工作。

明天继续。。。先介绍这三个。。