热门关键字:  ubuntu  分区  Fedora  linux系统进程  函数

dbms_stats和analyze在sample size上的却别

来源: 作者: 时间:2008-06-04 Tag: 点击:
在分析前,我们查询统计信息:
SQL(c3uat)>select table_name,num_rows,sample_size,last_analyzed from user_tables;
TABLE_NAME NUM_ROWS SAMPLE_SIZE LAST_ANALYZED
--------------- ---------- ----------- -----------------------------
BIG_TABLE 338209 44342 04-JUN-2008:11:21:23
JOB_ERR_LOG 2 2 04-JUN-2008:11:09:25
MY_LOCK 26 26 04-JUN-2008:11:09:25
MY_SESSION 69 69 04-JUN-2008:11:09:26
MY_SQLTEXT 201 201 04-JUN-2008:11:09:26
PLAN_TABLE 228 228 04-JUN-2008:11:09:26
PRD_USERS 16 16 04-JUN-2008:11:09:27
TEST_TABLE 1 1 04-JUN-2008:11:09:27
8 rows selected.


我们使用dbms_stats的AUTO_SAMPLE_SIZE(来决定统计样本:
SQL(c3uat)>exec dbms_stats.gather_SCHEMA_STATS(OWNNAME=>'ATCDBA',-
OPTIONS=>'GATHER AUTO',-
ESTIMATE_PERCENT=>DBMS_STATS.AUTO_SAMPLE_SIZE,-
CASCADE=>TRUE,-
DEGREE=>2);

SQL(c3uat)>select table_name,num_rows,sample_size,last_analyzed from user_tables;
TABLE_NAME NUM_ROWS SAMPLE_SIZE LAST_ANALYZED
--------------- ---------- ----------- -----------------------------
BIG_TABLE 662167 57244 04-JUN-2008:13:07:22
JOB_ERR_LOG 2 2 04-JUN-2008:11:09:25
MY_LOCK 26 26 04-JUN-2008:11:09:25
MY_SESSION 69 69 04-JUN-2008:11:09:26
MY_SQLTEXT 201 201 04-JUN-2008:11:09:26
PLAN_TABLE 228 228 04-JUN-2008:11:09:26
PRD_USERS 16 16 04-JUN-2008:11:09:27
TEST_TABLE 1 1 04-JUN-2008:11:09:27
8 rows selected.
可见系统选择了57244/662167=8.6%的数据进行分析,这是可以接受的。根据oracle资料显示,如设置为ESTIMATE_PERCENT=>DBMS_STATS.AUTO_SAMPLE_SIZE,系统将选择5%~15%的数据进行分析。

用analyze的缺省sample size来分析表:
SQL(c3uat)>analyze table big_table estimate statistics;
Table analyzed.
SQL(c3uat)>select table_name,num_rows,sample_size,last_analyzed from user_tables;
TABLE_NAME NUM_ROWS SAMPLE_SIZE LAST_ANALYZED
--------------- ---------- ----------- -----------------------------
BIG_TABLE 665192 1014 04-JUN-2008:13:08:10
JOB_ERR_LOG 2 2 04-JUN-2008:11:09:25
MY_LOCK 26 26 04-JUN-2008:11:09:25
MY_SESSION 69 69 04-JUN-2008:11:09:26
MY_SQLTEXT 201 201 04-JUN-2008:11:09:26
PLAN_TABLE 228 228 04-JUN-2008:11:09:26
PRD_USERS 16 16 04-JUN-2008:11:09:27
TEST_TABLE 1 1 04-JUN-2008:11:09:27
8 rows selected.
可见oracle只选择了1000条数据来进行分析,相对于表的size实在是太小。

使用oralce的dbms_stats.gather_table_stats缺省sample size来进行分析:
SQL(c3uat)>exec dbms_stats.gather_table_stats(OWNNAME=>'ATCDBA',-
TABNAME=>'BIG_TABLE',-
-- ESTIMATE_PERCENT=>DBMS_STATS.AUTO_SAMPLE_SIZE,-
CASCADE=>TRUE,-
DEGREE=>2);
SQL(c3uat)>select table_name,num_rows,sample_size,last_analyzed from user_tables;
TABLE_NAME NUM_ROWS SAMPLE_SIZE LAST_ANALYZED
--------------- ---------- ----------- -----------------------------
BIG_TABLE 663748 663748 04-JUN-2008:13:12:51
JOB_ERR_LOG 2 2 04-JUN-2008:11:09:25
MY_LOCK 26 26 04-JUN-2008:11:09:25
MY_SESSION 69 69 04-JUN-2008:11:09:26
MY_SQLTEXT 201 201 04-JUN-2008:11:09:26
PLAN_TABLE 228 228 04-JUN-2008:11:09:26
PRD_USERS 16 16 04-JUN-2008:11:09:27
TEST_TABLE 1 1 04-JUN-2008:11:09:27
系统选择了所有的数据来进行收集统计信息,相当于compute statistics,如果遇到大的表,将导致分析时间过长,影响系统应用。


相关文章:
SQLite3 C/C++ 开发接口简介(API函数) 二
SQLite3 使用教学
Scaling out MySQL - Hardware today and tomorro
SQLite适用的范围
sybase cursor declare
SQL语句大全精要
用户配额
decode函数
Oracle 数据库创建表空间、创建用户指定表空间
MySQL教会我使用GnuPG验证软件包
MySQL中MyISAM引擎与InnoDB引擎性能简单测试
initdb
mysqladmin在线帮助文档
CentOS 4.7 安装Oracle 9.2.0.4的一些问题
文本如何导入oracle(sqlldr 的用法)
ORA-00600: 内部错误代码,自变量: [16201], [],
分布式Oracle的database link
install a MySQL source distribution
Mysql备份脚本(未验证)
oracle 9.2.0.1 update 9.2.0.5
每小时Dump所有mysql数据库到NAS存储设备上
Oracle SCN机制解析
Account LOCKED(TIMED)
MySQL数据库5.0的my.cnf配置选项
oracle存储过程中调用其他用户的表
修改sqlplus提示符
MYSQL建表实例
一些对Mysql DBA有用的脚本
Oracle DBA 强悍挑战OS 64位 Solaris 10-真正休
[Bugzilla]由Mysql迁移到Oracle的方法