暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 列组统计信息的删除

askTom 2017-08-17
505

问题描述

你好,

我有几件事需要澄清与扩展统计类型列组统计相关。

当我们更改某些表格列时,我认为在进行更改之前删除扩展的统计信息总是一个好主意。
我们可以使用USER_STAT_EXTENSIONS vew找到是否有这样的。

在删除此统计信息时,我们发现了一些无法从DBMS_Stats.Drop_Extended_Stats方法中删除的扩展统计信息。
具有可Droppable = 值的值NO 在user_stat_extensions视图中。

请问Droppable = 是什么意思NO在这个扩展的统计视图中?

我还注意到,在大多数 “droppable = no” 列中,扩展名名称都以SYS_NC(虽然大部分Droppable = YES是系统)。
做什么SYS_NC&SYS_STS实际上是意思?

是否建议以某种方式删除这些 “droppable = no” 列统计信息?还是我们应该避免这样做?
换句话说,当涉及到更改列之类的情况时,我们应该只删除被列为可删除 = 是的扩展统计信息吗?

Thanks&Best Regards,
纳文思

专家解答

如果需要扩展来支持其他功能,那么我们就不能删除它。这里有一个例子

SQL>
SQL> create table t ( x int, y int);

Table created.

SQL>
SQL> insert into t (x,y) select rownum, rownum from dual connect by level <=100;

100 rows created.

SQL>
SQL> exec dbms_stats.gather_table_stats('','T');

PL/SQL procedure successfully completed.

SQL>
SQL> select * from user_stat_extensions
  2  where table_name = 'T';

no rows selected
复制


所以我们从没有扩展开始。现在我们添加一个来处理X和Y之间的关系

SQL>
SQL>
SQL> select dbms_stats.create_extended_stats('','T','(x,y)') from dual;

DBMS_STATS.CREATE_EXTENDED_STATS('','T','(X,Y)')
----------------------------------------------------------------------------------------------------------------------------------
SYS_STUYPW88OE302TFVBNC6$MMQXE

1 row selected.

SQL>
SQL> exec dbms_stats.gather_table_stats('','T');

PL/SQL procedure successfully completed.

SQL>
SQL> select * from user_stat_extensions
  2  where table_name = 'T'
  3  @pr
==============================
TABLE_NAME                    : T
EXTENSION_NAME                : SYS_STUYPW88OE302TFVBNC6$MMQXE
EXTENSION                     : ("X","Y")
CREATOR                       : USER
DROPPABLE                     : YES

PL/SQL procedure successfully completed.
复制


现在该扩展是可放弃的,因为 (由于缺少更好的术语) 它是 “独立的”,因为它不支持任何其他功能,并且还看到了几行,因此没有它,该表就可以正常工作。

但是现在让我们这样做...

SQL>
SQL> alter table t add  z int generated always as (y+x);

Table altered.

SQL>
SQL> exec dbms_stats.gather_table_stats('','T');

PL/SQL procedure successfully completed.

SQL>
SQL> select * from user_stat_extensions
  2  where table_name = 'T'
  3  @pr
==============================
TABLE_NAME                    : T
EXTENSION_NAME                : SYS_STUYPW88OE302TFVBNC6$MMQXE
EXTENSION                     : ("X","Y")
CREATOR                       : USER
DROPPABLE                     : YES
==============================
TABLE_NAME                    : T
EXTENSION_NAME                : Z
EXTENSION                     : ("Y"+"X")
CREATOR                       : SYSTEM
DROPPABLE                     : NO

PL/SQL procedure successfully completed.


SQL>
SQL>
复制


我们添加了一个扩展,以明确支持刚刚添加的新虚拟列的统计信息。我们需要虚拟列功能才能正常工作,因此不允许您删除它。

这种方法没有什么新的东西-就像你不能删除用于主键的索引一样。他们被绑在一起。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论