`

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

阅读更多

本文只涉及使用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在收集列的基本信息之外,还会根据情况收集某些列的柱状图。

分享到:
评论

相关推荐

    动态添加删除列和高级报表查询统计

    动态添加删除列和高级报表查询统计是一种先进的技术,它使得用户可以根据需求自定义报表结构,提高了数据处理的灵活性和效率。Flex是一款强大的富互联网应用程序(RIA)开发框架,特别适合创建交互式、数据驱动的...

    mysql查询根据列按条件统计总数

    ### MySQL 查询根据列按条件...- 最后一个查询计算`t2`表中`列1`的数量,并将结果与其他统计信息一起显示,这里的`列2`、`列3`等为空字符串。 通过这种方式,我们可以灵活地组合不同的查询来满足复杂的数据统计需求。

    表和索引统计信息不一致

    统计信息是数据库管理系统用于优化查询计划的重要依据,包括表的行数、列的值分布情况以及索引的使用情况等。当这些统计信息与实际数据不匹配时,数据库可能无法做出最佳的查询决策,导致查询性能下降。 首先,我们...

    Oracle Statistic 统计信息

    2. **列统计信息 (Column statistics):** - **不同值的数量 (Number of distinct values (NDV)):** 列中不同的值的数量。 - **空值数量 (Number of nulls):** 列中为空的值的数量。 - **数据分布 (Histograms):**...

    oracle-认证之管理统计信息

    列统计 - **指标**:列中的唯一值数量(NUM_DISTINCT)、NULL值的数量(NUM_NULLS)以及数据分布(HISTOGRAM)。 - **存储位置**:这些信息存储在`DBA_TAB_COLUMNS`视图中。 - **作用**:帮助优化器估算使用特定列作为...

    统计信息修改,基于基础的实例进行编写.zip

    可以针对这些列单独收集统计信息,以确保数据库能够准确地评估过滤条件。 4. **调整采样比例**:默认的统计信息采样比例可能不适合所有情况。如果数据量特别大,全面扫描可能过于耗时,这时可以调整采样比例,找到...

    Oracle 11g收集各种统计信息(DBMS_STAT)

    收集统计信息的过程应当定期进行,尤其是在大量数据插入、更新或删除后,以确保优化器能够生成最优的执行计划。如果不这样做,可能会导致性能下降,因为优化器可能基于过时或不准确的统计信息做出决策。 在实际应用...

    用户信息统计

    对于统计需求,可能还需要额外考虑是否设置一个“是否删除”字段,以便区分正常帖子和已被删除的帖子。 2. **统计逻辑实现**:同样地,通过SQL查询语句来获取已发表帖子的数量。这里的SQL语句可能类似于`SELECT ...

    数据表datagridview带有统计栏

    3. **更新统计信息**: 当数据发生变化时(例如,当用户添加、删除或修改行),需要实时更新统计栏的数据。这可以通过监听`DataGridView`的事件(如`CellValueChanged`、`RowAdded`、`RowRemoved`)来实现,一旦触发...

    基于SQl的学生信息管理数据库查询删除

    本项目"基于SQL的学生信息管理数据库查询删除"正是针对这个主题,通过源代码实现了一个高效、实用的信息管理系统。 首先,SQLQuery1.sql到SQLQuery7.sql这些文件很可能包含了不同的SQL查询和数据操作语句。每个文件...

    ORACLE 数据库的统计数据及优化

    例如,`FORALL COLUMNS SIZE REPEAT`表示对所有列重复收集统计信息,以适应列值分布的变化。 #### 六、示例代码 ```sql EXEC DBMS_STATS.GATHER_SCHEMA_STATS( OWNNAME => 'SCOTT', OPTIONS => 'GATHERAUTO', ...

    动态水晶报表(列、运行统计、网格)

    在动态报表中,我们可能需要在运行时根据数据源的变化调整列标题,例如添加、删除或重命名。 2. **运行统计**:在报表中进行运行时统计是一种常见的需求,例如计算某列的总和、平均值、最大值或最小值。水晶报表...

    TableLayout,实现动态添加和删除行,并实现统计表格中的数据

    在这个场景中,我们将深入探讨如何使用TableLayout动态添加和删除行,以及如何实现数据的统计。 1. **动态添加和删除行** 在TableLayout中,每一行是由TableRow对象构成的。要动态添加行,首先需要创建一个新的...

    实现某部门职工信息管理。职工信息包括:职工号、姓名、性别、年龄、学历、基本工资、岗位津贴、住址、电话等(职工号不重复)。

    实现某部门职工信息管理。职工信息包括:职工号、姓名、性别、年龄...6、统计功能:对文件中某关键字的相关记录内容信息进行统计(比如人数.工资等),7、排序:根据给定字段,对记录进行排序,例如:按工资的高低排序

    Python实现学生管理系统,可以对学生信息进行添加、删除、修改、查询、排序、统计

    该系统提供了丰富的功能,包括学生信息的录入、查找、修改、删除,以及成绩排名、学生人数统计和显示所有学生信息等操作。下面将对这些功能进行详细的解释和探讨。 首先,`StudentStem.py`是主程序文件,它包含了...

    [ORACLE]数据库维护收集.pdf

    Oracle数据库维护是确保数据库高效运行的关键任务,其中统计信息的收集和管理扮演着核心角色。统计信息对SQL语句的性能至关重要,因为优化器依赖这些信息来制定执行计划。优化器利用统计信息评估多种执行策略并选择...

    Best Practices for Gathering Optimizer Statistics with Oralce 18c

    - 修改了表结构(如添加、删除列) - 数据分布发生了显著变化 - 系统升级到新版本 此外,建议定期进行统计信息的收集,例如每晚或每周一次,以确保统计信息始终反映当前的数据状态。 #### 确保统计信息的质量 ...

    [ORACLE]数据库维护整理.pdf

    列统计信息则包含了不同值的数量、最大值和最小值、NULL值的数量以及平均列长度。索引统计信息则关注索引深度、不同键值数量和聚合因子等。此外,索引相关的统计信息如引用现有行和被删除行的索引数也是重要的参考。...

    长沙理工大学信息统计服务系统.docx

    《长沙理工大学信息统计服务系统》是一个专为高校设计的数据管理和统计平台,旨在提高统计数据的收集、处理和查询效率,实现无纸化办公,减少人力成本,确保数据的准确性和及时性。该系统的设计和功能主要涵盖了以下...

Global site tag (gtag.js) - Google Analytics