Archive

Posts Tagged ‘oracle’

淘宝网DBA团队将组织举办首届中国互联网数据库技术论坛(华东站)

May 20th, 2010 23 comments

      为了加强中国互联网行业数据库技术的交流和分享,淘宝网DBA团队将于2010年6月19号组织举办首届中国互联网数据库技术论坛(华东站)。本次技术论坛我们将邀请华东地区具有代表性的互联网企业包括eBay、盛大网络、网易、斯凯网络、前程无忧网、久游游戏及阿里巴巴集团旗下各子公司(阿里巴巴B2B、淘宝网、支付宝、阿里云)的嘉宾,一起讨论分享互联网行业数据库技术架构的发展变化历程和经验。以下为会议内容: 

会议名称:首届中国互联网数据库技术论坛(华东站)

会议议题:互联网数据库架构及发展方向

地点:杭州市文二路391号西湖国际科技大厦裙楼2层百花谷

时间:2010年6月19号 

会议议程:

时间 主题 分享嘉宾
10:00-10:10 开场致辞 刘振飞:淘宝网技术保障部副总裁
10:10-11:40 淘宝网数据库架构体系及发展历程 徐进挺:淘宝网DBA
13:00-14:00 数据库与分布式文件系统的应用结合 徐景春:盛大网络DBA
14:10-15:40 开源数据库在互联网行业的使用 周正中:斯凯网络DBA主管;周振兴:淘宝网DBA
15:50-17:00 高并发OLTP数据库的性能优化 范向荣:eBay DBA

       本次技术论坛将会对外开放20个名额,请有意参加者将自己的姓名、公司名称、职务、手机号发送至:liuyun (at)taobao.com,我们将会从中挑选20名嘉宾一起参加本次技术论坛。

In Memory Undo与logical standby database

June 1st, 2009 No comments

最近碰到了一个bug,导致逻辑备库重建,相当的郁闷。我们一个系统,包含一个主库,一个物理备库,一个逻辑备库。系统不久前刚从9i升级到10.2.0.4。5.30号因为系统维护,将原主库和物理备库做了一次switchover,切换没有什么问题,做了很多次了。这是逻辑备库突然报出了ora-600错误:

ORA-00600: internal error code, arguments: [2730], [331], [1], [13], [293130], [293130], [], []

ok,不用紧张,这个错误没啥问题。因为主库从9i升级到10g之后,为了保留降级的可能,compatible参数还是保留设置为9.2.0.0.0了,而这次切换,顺便把compatible改成了10.2.0.0.0,所以出现主备库的参数不一致了,就会报该错误。修改该参数即可。
Read more…

如何根据rowid获取extent_id

March 29th, 2009 1 comment

我们知道,rowid是由四部分组成的,分别是data_object_id,file_id,block_number和row_number,通过oracle提供的dbms_rowid包可以很方便的将一串rowid解析出上述四部分的内容。然后根据这些信息,则可以获取其extent_id。

SYS@datac>declare
  2  v_block_id number;
  3  v_file_id number;
  4  v_object_id number;
  5  v_extent_id number;
  6  v_object_name varchar2(30);
  7  v_owner varchar2(30);
  8  v_rowid varchar2(20):='AAACrKAAXAAAAzUAAH';
  9  begin
 10  select dbms_rowid.ROWID_BLOCK_NUMBER(v_rowid),
 11         dbms_rowid.ROWID_RELATIVE_FNO(v_rowid),
 12         dbms_rowid.ROWID_OBJECT(v_rowid)
 13   into v_block_id,v_file_id,v_object_id
 14  from dual;
 15
 16  select owner,object_name
 17    into v_owner,v_object_name
 18  from dba_objects
 19  where data_object_id=v_object_id;
 20
 21  select extent_id into v_extent_id
 22  from dba_extents
 23  where owner=v_owner
 24  and segment_name=v_object_name
 25  and file_id=v_file_id
 26  and v_block_id between block_id and block_id+blocks-1;
 27
 28  dbms_output.put_line('         rowid: '||v_rowid);
 29  dbms_output.put_line('       file_id: '||v_file_id);
 30  dbms_output.put_line('      block_id: '||v_block_id);
 31  dbms_output.put_line('data_object_id: '||v_object_id);
 32  dbms_output.put_line('         owner: '||v_owner);
 33  dbms_output.put_line('   object_name: '||v_object_name);
 34  dbms_output.put_line('     extent_id: '||v_extent_id);
 35  end;
 36  /
         rowid: AAACrKAAXAAAAzUAAH
       file_id: 23
      block_id: 3284
data_object_id: 10954
         owner: NINGOO
   object_name: TEST
     extent_id: 5

将上述代码打包到一个shell脚本中,rowid通过参数传入,则可以更方便日常环境中使用。工欲善其事,必先利其器,将经验转化为工具,利用工具提升效率,才能做一个Lazy DBA

$ tbsql rowid AAACrKAAXAAAAzUAAH
         rowid: AAACrKAAXAAAAzUAAH
       file_id: 23
      block_id: 3284
data_object_id: 10954
         owner: NINGOO
   object_name: TEST
     extent_id: 5

$ tbsql rowid AAACrKAAZAAABiiAAR
         rowid: AAACrKAAZAAABiiAAR
       file_id: 25
      block_id: 6306
data_object_id: 10954
         owner: NINGOO
   object_name: TEST
     extent_id: 7
Categories: 数据库 Tags: ,

如何收集及删除列的统计信息

February 22nd, 2009 2 comments

本文只涉及使用dbm_stats来收集或删除列的统计信息的一些命令,以备查询。

测试表如下(实验环境为10.2.0.4):

SQL> create table test(i int,a varchar2(30));
Table created.

SQL> insert into test select rownum,object_name from all_objects;
9907 rows created.

简单的说,列的统计信息,主要包括两种类型:

  • 只有基本信息:收集的统计信息只有1个桶(bucket)
  • 包含柱状图信息:收集的统计信息包含2到254个桶

也就是说,如果想收集列的基本信息,同时不希望收集柱状图,则需要指定bucket的size为1:

SQL> exec dbms_stats.gather_table_stats(user, 'TEST',
cascade=>false, method_opt=>'for columns i size 1');

PL/SQL procedure successfully completed.                                                                             

SQL> select column_name,num_distinct,num_buckets,low_value,high_value,density,
avg_col_len,histogram
  2  from user_tab_columns where table_name='TEST';

COLUMN_NAM DISTINCT BUCKETS LOW_VALUE  HIGH_VALUE    DENSITY AVG_COL_LEN HISTOGRAM
---------- -------- ------- ---------- ---------- ---------- ----------- ----------
I              9907       1 C102       C26408     .000100939           4 NONE
A                                                                        NONE

如果要收集列的柱状图信息,则bucket的个数必须大于等于2(最多不超过254)

SQL> exec dbms_stats.gather_table_stats(user, 'TEST',
cascade=>false, method_opt=>'for columns i size 2');

PL/SQL procedure successfully completed.

SQL> select column_name,num_distinct,num_buckets,low_value,high_value,density,
avg_col_len,histogram
  2  from user_tab_columns where table_name='TEST';

COLUMN DISTINCT BUCKETS LOW_VALUE HIGH_VALUE    DENSITY AVG_COL_LEN HISTOGRAM
------ -------- ------- --------- ---------- ---------- ----------- ---------------
I          9907       2 C102      C26408     .000100939           4 HEIGHT BALANCED
A                                                                   NONE

如果要删除列已有的柱状图信息而保留列的基本统计信息,则需要重新收集bucket为1的统计信息

SQL> exec dbms_stats.gather_table_stats(user, 'TEST',
cascade=>false, method_opt=>'for columns i size 1');

PL/SQL procedure successfully completed.

SQL> select column_name,num_distinct,num_buckets,low_value,high_value,density,
avg_col_len,histogram
  2  from user_tab_columns where table_name='TEST';

COLUMN DISTINCT BUCKETS LOW_VALUE  HIGH_VALUE    DENSITY AVG_COL_LEN HISTOGRAM
------ -------- ------- ---------- ---------- ---------- ----------- ----------
I          9907       1 C102       C26408     .000100939           4 NONE
A                                                                    NONE

这个操作明显不太合理,重新收集统计信息的代价有时候是很大的,所以Oracle11g对此做出了改进,允许只删除柱状图而保留基本统计信息,命令语法如下:

exec dbms_stats.delete_column_stats(user, 'TEST','I',col_stat_type=>'HISTOGRAM');

而要彻底删除整个列的统计信息,则需要调用delete_column_stats过程

SQL> exec dbms_stats.delete_column_stats(user, 'TEST', 'I');

PL/SQL procedure successfully completed.

SQL> select column_name,num_distinct,num_buckets,low_value,high_value,density,
avg_col_len,histogram
  2  from user_tab_columns where table_name='TEST';

COLUMN DISTINCT BUCKETS LOW_VALUE  HIGH_VALUE DENSITY  AVG_COL_LEN HISTOGRAM
------ -------- ------- ---------- ---------- -------  ----------- ----------
I                                                                  NONE
A                                                                  NONE

可以在同一个过程中收集多个列的统计信息,并且可以为不同的列指定不同的bucket个数:

SQL> exec dbms_stats.gather_table_stats(user, 'TEST',
cascade=>false, method_opt => 'for columns size 1 T for columns size 2 A');

PL/SQL procedure successfully completed.

SQL> select column_name,num_distinct,num_buckets,low_value,high_value,density,
avg_col_len,histogram
  2  from user_tab_columns where table_name='TEST';

COLUMN DISTINCT BUCKETS LOW_VALUE HIGH_VALUE              DENSITY AVG_COL_LEN HISTOGRAM
------ -------- ------- --------- -------------------- ---------- ----------- ---------------
I          9907       1 C102      C26408               .000100939           4 NONE
A          7376       2 41        5F75746C245F6C6E635F .000185239          18 HEIGHT BALANCED
                                  696E645F7061727473

值得注意的是,9i的dbms_stats中,method_opt的默认值是FOR ALL COLUMNS SIZE 1,也就是收集列的基本统计信息而不收集柱状图信息,而10g的默认值则变成了FOR ALL COLUMNS SIZE AUTO,则Oracle在收集列的基本信息之外,还会根据情况收集某些列的柱状图。

注:由于排版的原因,部分查询结果的列名做了处理。

Categories: 数据库 Tags: ,