在11g中,Oracle在统计信息方面进行了进一步的增强。

这篇介绍列组的创建和维护。


前一篇介绍了收集列组的方式。利用这种方法收集统计信息后,Oracle会自动生成一个列组信息。

而实际上,用户可以手工创建或维护列组信息,使得自动收集统计信息的时候会收集列组的统计信息:

SQL> exec dbms_stats.delete_table_stats(user, 't_multi_col')

PL/SQL过程已成功完成。

SQL> begin

 2  dbms_stats.drop_extended_stats(

 3  user,

 4  't_multi_col',

 5  '(file_id, relative_fno)');

 6  end;

 7  /

PL/SQL过程已成功完成。

SQL> set serverout on

SQL> declare

 2  v_column_group varchar2(30);

 3  begin

 4  v_column_group := dbms_stats.create_extended_stats(

 5  user,

 6  't_multi_col',

 7  '(file_id, relative_fno)');

 8  dbms_output.put_line(v_column_group);

 9  end;

10  /

SYS_STUOYUMATSRXHHKNUWV64MRJUG

PL/SQL过程已成功完成。

删除了上一篇文章自动收集统计信息后留下的列组,然后通过手工方式创建了一个新的列组。最后返回的是列组名称。

如果没有记录下来函数返回的列组名称也没有关系,Oracle提供了很多方式来查询列组信息:

SQL> select dbms_stats.show_extended_stats_name(

 2  user,

 3  't_multi_col',

 4  '(file_id, relative_fno)') from dual;

DBMS_STATS.SHOW_EXTENDED_STATS_NAME(USER,'T_MULTI_COL','(FILE_ID,RELATIVE_FNO)')

--------------------------------------------------------------------------------------

SYS_STUOYUMATSRXHHKNUWV64MRJUG

SQL> select extension_name, extension

 2  from user_stat_extensions

 3  where table_name = 'T_MULTI_COL';

EXTENSION_NAME                 EXTENSION

------------------------------ ------------------------------------------------------------

SYS_STUOYUMATSRXHHKNUWV64MRJUG ("FILE_ID","RELATIVE_FNO")

检查统计信息:

SQL> col column_name format a50

SQL> select column_name, num_distinct, histogram

 2  from user_tab_col_statistics

 3  where table_name = 'T_MULTI_COL';

未选定行

由于刚才删除了表的统计信息,所以统计信息不存在:

SQL> exec dbms_stats.gather_table_stats(user, 't_multi_col')

PL/SQL过程已成功完成。

SQL> select column_name, num_distinct, histogram

 2  from user_tab_col_statistics

 3  where table_name = 'T_MULTI_COL';

COLUMN_NAME                                        NUM_DISTINCT HISTOGRAM

-------------------------------------------------- ------------ ---------------

OWNER                                                        14 NONE

SEGMENT_NAME                                               5191 NONE

PARTITION_NAME                                              233 NONE

SEGMENT_TYPE                                                 11 NONE

TABLESPACE_NAME                                               3 NONE

EXTENT_ID                                                   199 NONE

FILE_ID                                                       3 FREQUENCY

BLOCK_ID                                                  10010 NONE

BYTES                                                         6 NONE

BLOCKS                                                        6 NONE

RELATIVE_FNO                                                  3 FREQUENCY

SYS_STUOYUMATSRXHHKNUWV64MRJUG                                3 NONE

已选择12行。

可以看到,创建了列组后,即使是默认的统计信息收集方式,这个列组的统计信息也被收集,从而达到了数据库自动收集列组统计信息的目的。


oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html