龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 数据库类 > Oracle 技术 >

Oracle 11g R1中的统计收集增强(1)(2)

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
表达式统计 优化器对应用到列上的操作带来的影响一无所知,使用一种类似于多列统计的方法,我们可以收集到表达式统计数据。 可以使用存储过程CRE
表达式统计

优化器对应用到列上的操作带来的影响一无所知,使用一种类似于多列统计的方法,我们可以收集到表达式统计数据。

可以使用存储过程CREATE_EXTENDED_STATS明确地进行创建,或利用GATHER_%存储过程进行数据统计时,在METHOD_OPT参数中指定表达式进行间接创建。

DECLARE
  l_cg_name VARCHAR2(30);
BEGIN
  -- Explicitly created.
  l_cg_name := DBMS_STATS.create_extended_stats(ownname   => 'SCOTT',
                                                tabname   => 'EMP',
                                                extension => '(LOWER(ENAME))');

  -- Implicitly created.
  DBMS_STATS.gather_table_stats(
    'SCOTT',
    'EMP',
    method_opt => 'for columns (upper(ename))');
END;
/

将METHOD_OPT参数设置为“FOR ALL COLUMNS SIZE AUTO”允许对现有的表达式进行数据统计。

BEGIN
  DBMS_STATS.gather_table_stats(
    'SCOTT',
    'EMP',
    method_opt => 'for all columns size auto');
END;
/

[DBA|ALL|USER]_STAT_EXTENSIONS视图显示了关于表达式统计的信息,与多列统计一样。

COLUMN extension FORMAT A30

SELECT extension_name, extension
FROM   dba_stat_extensions
WHERE  table_name = 'EMP';


EXTENSION_NAME                 EXTENSION
------------------------------ ------------------------------
SYS_STU3VG629OEYG6FN0EKTGV_HQ6 ("JOB","DEPTNO")
SYS_STULPA1A#B6YL4KQ59DQO3OADQ ("JOB","MGR")
SYS_STU2JLSDWQAFJHQST7$QK81_YB (LOWER("ENAME"))
SYS_STUOK75YSL165W#_X8GUYL0A1X (UPPER("ENAME"))

4 rows selected.

SQL>


COLUMN col_group FORMAT A30

SELECT e.extension col_group,
       t.num_distinct,
       t.histogram
FROM   dba_stat_extensions e
       JOIN dba_tab_col_statistics t ON e.extension_name=t.column_name
AND    t.table_name = 'EMP';

COL_GROUP                      NUM_DISTINCT HISTOGRAM
------------------------------ ------------ ---------------
("JOB","DEPTNO")                          9 NONE
("JOB","MGR")                             8 NONE
(LOWER("ENAME"))                         14 NONE
(UPPER("ENAME"))                         14 NONE

4 rows selected.

SQL>

表达式统计使用DROP_EXTENDED_STATS存储过程进行删除。

-- Drop the columnn group.
BEGIN
  dbms_stats.drop_extended_stats(ownname   => 'SCOTT',
                                 tabname   => 'EMP',
                                 extension => '(UPPER(ENAME))');
END;
/

PL/SQL procedure successfully completed.

SQL>

对分区对象的统计增强

Oracle 11g也包括了对分区对象统计的改进,未修改过的分区不会重新扫描,这样在大表上收集统计信息时的速度显著提高了,大表上往往包含有部分静态分区数据,分区交换载入(PEL)被用于往表中统计数据,只有新加入到分区中数据才会被扫描,以更新统计数据。

【相关文章】

精彩图集

赞助商链接