dbms_stat的基本使用

http://www.xuexizu.com/group/32991/forum/3361/85131
1.创建测试表stats_test

sys@ora10g> conn sec/sec
Connected.
sec@ora10g> create table stats_test ( col1 number, col2 varchar2(40));

Table created.

sec@ora10g> insert into stats_test select rownum,object_name from all_objects;

11237 rows created.

sec@ora10g> commit;

Commit complete.

2.收集列的基本信息,不收集柱状图,指定的size等于1(bucket“小桶”=1)
sec@ora10g>exec dbms_stats.gather_table_stats(user, 'STATS_TEST', cascade=>false, method_opt=>'for columns col1 size 1');

PL/SQL procedure successfully completed.

sec@ora10g>select column_name,num_distinct,num_buckets,low_value,high_value,density,avg_col_len,histogram from user_tab_columns where table_name='STATS_TEST';

COLUMN_NAM NUM_DISTINCT NUM_BUCKETS LOW_VALUE  HIGH_VALUE    DENSITY AVG_COL HISTOGRAM
---------- ------------ ----------- ---------- ---------- ---------- ------- ---------
COL1              11237           1 C102       C3020D26   .000088992       5 NONE
COL2                                                                         NONE

3.收集列的柱状图信息,指定的size大于等于2小于等于254(bucket“小桶” between 2 and 254)
sec@ora10g>exec dbms_stats.gather_table_stats(user, 'STATS_TEST', cascade=>false, method_opt=>'for columns col1 size 2');

PL/SQL procedure successfully completed.

sec@ora10g>select column_name,num_distinct,num_buckets,low_value,high_value,density,avg_col_len,histogram from user_tab_columns where table_name='STATS_TEST';

COLUMN_NAM NUM_DISTINCT NUM_BUCKETS LOW_VALUE  HIGH_VALUE    DENSITY AVG_ HISTOGRAM
---------- ------------ ----------- ---------- ---------- ---------- ---- ---------------
COL1              11237           2 C102       C3020D26   .000088992    5 HEIGHT BALANCED
COL2                                                                      NONE

4.10g中删除列已有的柱状图信息同时保留列的基本统计信息方法:需要重新收集size为1的统计信息
sec@ora10g>exec dbms_stats.gather_table_stats(user, 'STATS_TEST', cascade=>false, method_opt=>'for columns col1 size 1');

PL/SQL procedure successfully completed.

sec@ora10g> select column_name,num_distinct,num_buckets,low_value,high_value,density,avg_col_len,histogram from user_tab_columns where table_name='STATS_TEST';

COLUMN_NAM NUM_DISTINCT NUM_BUCKETS LOW_VALUE  HIGH_VALUE    DENSITY AVG_COL_LEN HISTOGRAM
---------- ------------ ----------- ---------- ---------- ---------- ----------- ---------
COL1              11237           1 C102       C3020D26   .000088992           5 NONE
COL2                                                                             NONE

5.11g中删除已有的柱状图信息同时保留列的基本统计信息得到了简化
sec@ora11g>exec dbms_stats.delete_column_stats(user, 'STATS_TEST','COL1',col_stat_type=>'HISTOGRAM');

PL/SQL procedure successfully completed.

sec@ora11g> select column_name,num_distinct,num_buckets,low_value,high_value,density,avg_col_len,histogram from user_tab_columns where table_name='STATS_TEST';

COLUMN_NAM NUM_DISTINCT NUM_BUCKETS LOW_VALUE  HIGH_VALUE              DENSITY AVG HISTOGRAM
---------- ------------ ----------- ---------- -------------------- ---------- --- ---------
COL1              15404           1 C102       C3023705             .000064918   5 NONE
COL2                                                                               NONE

6.删除整个列的统计信息,使用delete_column_stats
sec@ora10g>exec dbms_stats.delete_column_stats(user, 'STATS_TEST', 'COL1');

PL/SQL procedure successfully completed.

sec@ora10g> select column_name,num_distinct,num_buckets,low_value,high_value,density,avg_col_len,histogram from user_tab_columns where table_name='STATS_TEST';

COLUMN_NAM NUM_DISTINCT NUM_BUCKETS LOW_VALUE  HIGH_VALUE    DENSITY AVG_COL_LEN HISTOGRAM
---------- ------------ ----------- ---------- ---------- ---------- ----------- ---------
COL1                                                                             NONE
COL2                                                                             NONE

7.混合打法:同一个过程中收集多个列的统计信息,不同的列指定不同的size数
sec@ora10g>exec dbms_stats.gather_table_stats(user, 'STATS_TEST', cascade=>false, method_opt => 'for columns col1 size 1 for columns col2 size 2');

PL/SQL procedure successfully completed.

sec@ora10g> select column_name,num_distinct,num_buckets,low_value,high_value,density,avg_col_len,histogram from user_tab_columns where table_name='STATS_TEST';


COLUMN_NAM NUM_DISTINCT NUM_BUCKETS LOW_VALUE  HIGH_VALUE    DENSITY AVG_C HISTOGRAM
---------- ------------ ----------- ---------- ---------- ---------- ----- ---------------
COL1              11237           1 C102       C3020D26   .000088992     5 NONE
COL2               8717           2 4143434553 5F75746C24 .000134719    19 HEIGHT BALANCED
                                    5324       5F6C6E635F
                                               696E645F70
                                               61727473

8.小结
使用dbm_stats收集及删除列的统计信息是一种高效的方法,也是Oracle推荐的统计列信息的方法
对生产系统的核心表可以使用“混合打法”编写合适的统计分析脚本,定期执行,提高数据库的效率

secooler

<think>我们正在解决PostgreSQL中启用pg_stat_statements扩展时出现的错误:“pg_stat_statements must be loaded via shared_preload_libraries”。根据引用内容,这个错误是因为没有正确配置shared_preload_libraries参数。以下步骤将指导您解决此问题。 ### 步骤1: 修改postgresql.conf文件 首先,您需要编辑PostgreSQL的配置文件`postgresql.conf`,将`pg_stat_statements`添加到`shared_preload_libraries`参数中。根据引用[1]和[5]的示例,您可以这样做: 1. 找到`postgresql.conf`文件(通常位于PostgreSQL的数据目录中)。 2. 使用文本编辑器打开该文件。 3. 搜索`shared_preload_libraries`参数。如果该行被注释(以`#`开头),请取消注释。 4. 将`pg_stat_statements`添加到参数值中。如果已经有其他库,用逗号分隔。例如: ``` shared_preload_libraries = 'pg_stat_statements' # 如果之前没有其他库 ``` 或者 ``` shared_preload_libraries = '$libdir/dbms_pipe,$libdir/edb_gen,pg_stat_statements' # 如果已有其他库 ``` 注意:引用[5]中展示了在已有库的基础上添加`pg_stat_statements`的例子。 ### 步骤2: 重启PostgreSQL服务 修改配置文件后,必须重启PostgreSQL服务才能使更改生效(因为该参数需要重启才能应用)。根据您的操作系统和安装方式,重启命令可能不同。例如: - 使用systemctl(Linux): ```bash sudo systemctl restart postgresql ``` 或者指定服务名(如`postgresql-12`等)。 - 使用pg_ctl(在PostgreSQL的bin目录下): ```bash pg_ctl restart -D /path/to/data/directory ``` ### 步骤3: 创建扩展 重启后,连接到您的数据库,并执行以下SQL命令来创建`pg_stat_statements`扩展: ```sql CREATE EXTENSION IF NOT EXISTS pg_stat_statements; ``` 如果之前因为配置问题创建失败,现在应该可以成功。 ### 步骤4: 验证 创建扩展后,您可以验证它是否正常工作: ```sql SELECT * FROM pg_stat_statements; ``` 如果不再报错,并且返回了查询统计信息(可能是空的结果集,因为还没有统计信息),则说明扩展已成功启用。 ### 注意事项 1. **权限问题**:修改配置文件和重启PostgreSQL服务通常需要管理员权限。 2. **文件位置**:确保修改的是正确的`postgresql.conf`文件(即当前运行的实例所使用的配置文件)。 3. **参数语法**:`shared_preload_libraries`的值是一个字符串,用单引号括起来,多个库用逗号分隔。 4. **版本差异**:不同版本的PostgreSQL可能在配置细节上略有不同,但基本步骤一致。 ### 引用说明 - 修改配置文件并重启服务是解决该错误的关键步骤,如引用[1]、[5]所示。 - 错误信息“pg_stat_statements must be loaded via shared_preload_libraries”在引用[2]和[3]中被提及,必须通过配置`shared_preload_libraries`来解决。 - 引用[4]提供了环境信息,但未直接涉及解决步骤。 通过以上步骤,您应该能够成功启用`pg_stat_statements`扩展。 §§相关问题§§ 1. 如何确认PostgreSQL当前加载了哪些共享库? 2. `pg_stat_statements`扩展提供哪些具体的统计信息? 3. 除了`pg_stat_statements`,还有哪些常用的PostgreSQL性能监控扩展?</think>### 解决 PostgreSQL "pg_stat_statements must be loaded via shared_preload_libraries" 错误 此错误表明 `pg_stat_statements` 扩展未通过共享预加载方式正确初始化。以下是完整解决步骤: #### 1. **修改配置文件** - 打开 PostgreSQL 配置文件(通常位于数据目录,如 `/var/lib/pgsql/版本号/data/postgresql.conf`) - 找到 `shared_preload_libraries` 参数,添加 `pg_stat_statements`: ```ini shared_preload_libraries = 'pg_stat_statements' # 若已有其他扩展,用逗号分隔 ``` - **重要**:确保取消该行的注释(删除行首的 `#`)[^1][^5] #### 2. **重启 PostgreSQL 服务** ```bash # 根据系统选择命令 sudo systemctl restart postgresql-版本号 # 或 postgresql.service # 或使用 pg_ctl pg_ctl restart -D /your/data/directory ``` > 📌 必须重启服务才能加载共享库[^1][^3] #### 3. **创建扩展** 连接数据库后执行 SQL: ```sql CREATE EXTENSION pg_stat_statements; ``` #### 4. **验证是否生效** ```sql SELECT * FROM pg_stat_statements; -- 应返回空表而非错误 ``` #### 常见问题排查 - **文件权限问题**:确保 `postgresql.conf` 可被 PostgreSQL 用户读取 - **路径错误**:检查 `shared_preload_libraries` 是否拼写正确 - **未重启服务**:修改后**必须重启**才能生效[^1][^3] - **版本兼容**:确认 PostgreSQL 版本与 `pg_stat_statements` 兼容(通常 v9.2+ 支持) #### 工作原理 `pg_stat_statements` 需要在内核初始化时通过 `shared_preload_libraries` 加载到共享内存中,这是因为它需要挂钩到查询执行器进行 SQL 跟踪。动态加载(如 `CREATE EXTENSION` 单独使用)无法满足此要求[^2][^3]。 > ⚠️ 注意:如果跟踪数据量过大导致内存问题,可通过 `pg_stat_statements.max` 参数限制记录数量[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值