首先创建四个临时表t1,t2,t3,t4,和他们相对应的索引
复制内容到剪贴板
代码:
create table t1 as select * from user_objects;
create table t2 as select * from user_objects;
create table t3 as select * from user_objects;
create table t4 as select * from user_objects;
create unique index pk_t1_idx on t1(object_id);
create unique index pk_t2_idx on t2(object_id);
create unique index pk_t3_idx on t3(object_id);
create unique index pk_t4_idx on t4(object_id);
查看这个时候各个表对应的数据库统计信息(表,字段,索引)
复制内容到剪贴板
代码:
--查看表的统计信息
select table_name,num_rows,blocks,empty_blocks from user_table where table_names in ('T1','T2','T3','T4');
TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS
T1
T2
T3
T4
--查看字段的统计信息
select table_name,column_name,num_distinct,low_value,high_value,density from user_tab_columns where table_name in ('T1','T2','T3','T4');
TABLE_NAME COLUMN_NAME NUM_DISTINCT LOW_VALUE HIGH_VALUE DENSITY
T1 OBJECT_NAME
T1 SUBOBJECT_NAME
T1 OBJECT_ID
T1 DATA_OBJECT_ID
T1 OBJECT_TYPE
T1 CREATED
T1 LAST_DDL_TIME
T1 TIMESTAMP
T1 STATUS
T1 TEMPORARY
T1 GENERATED
T1 SECONDARY
T2 OBJECT_NAME
T2 SUBOBJECT_NAME
T2 OBJECT_ID
T2 DATA_OBJECT_ID
T2 OBJECT_TYPE
T2 CREATED
T2 LAST_DDL_TIME
T2 TIMESTAMP
T2 STATUS
T2 TEMPORARY
T2 GENERATED
T2 SECONDARY
T3 OBJECT_NAME
T3 SUBOBJECT_NAME
T3 OBJECT_ID
T3 DATA_OBJECT_ID
T3 OBJECT_TYPE
T3 CREATED
T3 LAST_DDL_TIME
T3 TIMESTAMP
T3 STATUS
T3 TEMPORARY
T3 GENERATED
T3 SECONDARY
T4 OBJECT_NAME
T4 SUBOBJECT_NAME
T4 OBJECT_ID
T4 DATA_OBJECT_ID
T4 OBJECT_TYPE
T4 CREATED
T4 LAST_DDL_TIME
T4 TIMESTAMP
T4 STATUS
T4 TEMPORARY
T4 GENERATED
T4 SECONDARY
--查看索引的统计信息
select table_name,index_name,blevel,leaf_blocks,distinct_keys,
avg_leaf_blocks_per_key avg_leaf_blocks,avg_data_blocks_per_key avg_data_blocks,clustering_factor,num_rows
from user_indexes where table_name in ('T1','T2','T3','T4');
TABLE_NAME INDEX_NAME BLEVEL LEAF_BLOCKS DISTINCT_KEYS AVG_LEAF_BLOCKS AVG_DATA_BLOCKS CLUSTERING_FACTOR NUM_ROWS
T1 PK_T1_IDX
T2 PK_T2_IDX
T3 PK_T3_IDX
T4 PK_T4_IDX
现在我们分别对这个表做不同形式的analyze table处理
复制内容到剪贴板
代码:
analyze table t1 compute statistics for table;
analyze table t2 compute statistics for all columns;
analyze table t3 compute statistics for all indexed columns;
analyze table t4 compute statistics;
我们再回头看看这是的oracle数据库对于各种统计信息
复制内容到剪贴板
代码:
--这是对于表的统计信息
select table_name,num_rows,blocks,empty_blocks from user_tables where table_name in ('T1','T2','T3','T4');
TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS
T1 3930 55 1
T2
T3
T4 3933 55 1
--我们可以据此得出结论,只有我们在analyze table命令中指定了for table或者不指定任何参数的时候,oracle数据库才会给我们统计基于表的统计信息
--这是对于表中字段的统计信息
select table_name,column_name,num_distinct,low_value,high_value,density from user_tab_columns where table_name in ('T1','T2','T3','T4');
TABLE_NAME COLUMN_NAME NUM_DISTINCT LOW_VALUE HIGH_VALUE DENSITY
T1 OBJECT_NAME
T1 SUBOBJECT_NAME
T1 OBJECT_ID
T1 DATA_OBJECT_ID
T1 OBJECT_TYPE
T1 CREATED
T1 LAST_DDL_TIME
T1 TIMESTAMP
T1 STATUS
T1 TEMPORARY
T1 GENERATED
T1 SECONDARY
T2 OBJECT_NAME 3823 41423030 D3F1BBB736D4C2B7DDCFFABBA7C7E5B5A5 .000270447891062615
T2 SUBOBJECT_NAME 77 503031 52455354 .012987012987013
T2 OBJECT_ID 3930 C304062D C30F4619 .000254452926208651
T2 DATA_OBJECT_ID 3662 C304062D C30F4619 .000273074822501365
T2 OBJECT_TYPE 15 4441544142415345204C494E4B 56494557 .000127194098193844
T2 CREATED 3684 7867081E111F33 7868071211152F .000547559423988464
T2 LAST_DDL_TIME 3574 7867081E11251B 7868071211152F .000565522924083892
T2 TIMESTAMP 3649 323030332D30382D33303A31363A33303A3530 323030342D30372D31383A31363A32303A3436 .000559822349362313
T2 STATUS 2 494E56414C4944 56414C4944 .000127194098193844
T2 TEMPORARY 2 4E 59 .000127194098193844
T2 GENERATED 2 4E 59 .000127194098193844
T2 SECONDARY 2 4E 59 .000127194098193844
T3 OBJECT_NAME
T3 SUBOBJECT_NAME
T3 OBJECT_ID 3931 C304062D C30F461A .000254388196387688
T3 DATA_OBJECT_ID
T3 OBJECT_TYPE
T3 CREATED
T3 LAST_DDL_TIME
T3 TIMESTAMP
T3 STATUS
T3 TEMPORARY
T3 GENERATED
T3 SECONDARY
T4 OBJECT_NAME 3825 41423030 D3F1BBB736D4C2B7DDCFFABBA7C7E5B5A5 .000261437908496732
T4 SUBOBJECT_NAME 77 503031 52455354 .012987012987013
T4 OBJECT_ID 3932 C304062D C30F461B .000254323499491353
T4 DATA_OBJECT_ID 3664 C304062D C30F461B .00027292576419214
T4 OBJECT_TYPE 15 4441544142415345204C494E4B 56494557 .0666666666666667
T4 CREATED 3685 7867081E111F33 78680712111530 .000271370420624152
T4 LAST_DDL_TIME 3575 7867081E11251B 78680712111530 .00027972027972028
T4 TIMESTAMP 3650 323030332D30382D33303A31363A33303A3530 323030342D30372D31383A31363A32303A3437 .000273972602739726
T4 STATUS 2 494E56414C4944 56414C4944 .5
T4 TEMPORARY 2 4E 59 .5
T4 GENERATED 2 4E 59 .5
T4 SECONDARY 2 4E 59 .5
/*
在这个结果中我们可以看到,oracle数据库给t2,t4的所有字段都做了统计信息.
对表t3的object_id(索引字段)做了统计信息.
由此得出结论,
在指定for all columns 和不指定任何参数的时候oracle会给所有字段做统计信息,在指定for indexed columns时,oracle只给[b]有索引的字段进行字段信息统计[/b],如果我们别有必要给所有字段统计信息时,这个属性就很有用了.
*/
--这里是对于索引的统计信息
select table_name,index_name,blevel,leaf_blocks,distinct_keys,
avg_leaf_blocks_per_key avg_leaf_blocks,avg_data_blocks_per_key avg_data_blocks,clustering_factor,num_rows
from user_indexes where table_name in ('T1','T2','T3','T4');
TABLE_NAME INDEX_NAME BLEVEL LEAF_BLOCKS DISTINCT_KEYS AVG_LEAF_BLOCKS AVG_DATA_BLOCKS CLUSTERING_FACTOR NUM_ROWS
T1 PK_T1_IDX
T2 PK_T2_IDX
T3 PK_T3_IDX
T4 PK_T4_IDX 1 9 3932 1 1 2143 3932
--从这里我们可以看出,只有表t4有索引统计信息.
--再综合前面的我们就会发现,如果在运行analyze table是我们不指定参数,oracle将收集对于特定表的所有统计信息(表,索引,表字段的统计信息)
补充,truncate命令不修改以上统计信息
复制内容到剪贴板
代码:
truncate table t1;
truncate table t2;
truncate table t3;
truncate table t4;
--我们在查看表和索引的统计信息
select table_name,num_rows,blocks,empty_blocks from user_tables where table_name in ('T1','T2','T3','T4');
TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS
T1 3930 55 1
T2
T3
T4 3933 55 1
--索引的统计信息
select table_name,index_name,blevel,leaf_blocks,distinct_keys,
avg_leaf_blocks_per_key avg_leaf_blocks,avg_data_blocks_per_key avg_data_blocks,clustering_factor,num_rows
from user_indexes where table_name in ('T1','T2','T3','T4');
TABLE_NAME INDEX_NAME BLEVEL LEAF_BLOCKS DISTINCT_KEYS AVG_LEAF_BLOCKS AVG_DATA_BLOCKS CLUSTERING_FACTOR NUM_ROWS
T1 PK_T1_IDX
T2 PK_T2_IDX
T3 PK_T3_IDX
T4 PK_T4_IDX 1 9 3932 1 1 2143 3932
--我们再对以上各表做一次分析
analyze table t1 compute statistics for table;
analyze table t2 compute statistics for all columns;
analyze table t3 compute statistics for all indexed columns;
analyze table t4 compute statistics;
--现在再来查看表和索引的统计信息
select table_name,num_rows,blocks,empty_blocks,initial_extent,'8192' block_size from user_tables where table_name in ('T1','T2','T3','T4');
TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS INITIAL_EXTENT BLOCK_SIZE
T1 0 0 8 65536 8192
T2 65536 8192
T3 65536 8192
T4 0 0 8 65536 8192
--索引的统计信息
select table_name,index_name,blevel,leaf_blocks,distinct_keys,
avg_leaf_blocks_per_key avg_leaf_blocks,avg_data_blocks_per_key avg_data_blocks,clustering_factor,num_rows
from user_indexes where table_name in ('T1','T2','T3','T4');
TABLE_NAME INDEX_NAME BLEVEL LEAF_BLOCKS DISTINCT_KEYS AVG_LEAF_BLOCKS AVG_DATA_BLOCKS CLUSTERING_FACTOR NUM_ROWS
T1 PK_T1_IDX
T2 PK_T2_IDX
T3 PK_T3_IDX
T4 PK_T4_IDX 0 0 0 0 0 0 0
--由此得出结论,truncate命令不会修改数据的统计信息,
--也就是如果我们想让CBO利用合理利用数据的统计信息的时候,需要我们及时的使用analyze命令或者dbms_stats重新统计数据的统计信息
分享到:
相关推荐
有時候Oracle效能變慢, 做一下分析 讓他認得index.key....,之後查詢、執行操作會提高效率
10_analyze_table.bat
Oracle Database 10g 提供了一个显著改进的工具:自动工作负载信息库 (AWR:Automatic Workload Repository)。Oracle 建议用户用这个取代 Statspack。AWR 实质上是一个 Oracle 的内置工具,它采集与性能相关的统计...
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] 本语句用于分析和存储表的关键字分布。在分析期间,使用一个读取锁定对表进行锁定。这对于MyISAM, BDB和InnoDB表有作用。对于MyISAM表,本语句与...
SELECT 'ANALYZE TABLE ZFMI.'||TABLE_NAME||' COMPUTE STATISTICS ;' FROM USER_TABLES; ----------------------------------------------------------------------------------------- 表索引分析语句 ...
一、mysqlcheck简介 mysqlcheck客户端可以检查和修复MyISAM表。...Mysqlcheck为用户提供了一种方便的使用SQL语句CHECK TABLE、REPAIR TABLE、ANALYZE TABLE和OPTIMIZE TABLE的方式。它确定在要执行的操作中使用使用哪
运行OPTIMIZE TABLE 表名后,虽然最后会报Table does not support optimize, doing recreate + analyze instead,但其实已经成功了:) ————————————————————- 如果没有设置这个参数,
analyze 使用analyze命令分析数据库中任意的表、索引和簇 audit any 为任意的数据库对象设置审计选项 audit system 答应系统操作审计 backup any table 备份任意表的权限 become user 切换用户状态的...
如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器。 在缺省情况下,ORACLE采用CHOOSE优化器,为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免...
如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器。 在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用...
Oracle语句优化30个规则详解: ... 在缺省情况下,ORACLE采用CHOOSE优化器,为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器.....
注意:如果您没有太多数据,您可以使用created_at ,但是对于 >1M 行,获取day的速度要快得多。 可选:设置您的ANALYZE_TWEETS_LOG_FILE环境变量。 默认值为“analyze_tweets.log”。 这是如何运作的? 脚本被...
ORACLE的优化器共有3种 ... 在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器
1. 选用适合的ORACLE优化器 ... 在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器.
在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器. 2. 访问Table的方式 ORACLE 采用两种...
Oracle Oracle语句优化53个规则详解(1) Oraclesql 性能优化调整 1.选用适合的ORACLE优化器 ORACLE的优化器共有3种: a.RULE(基于规则) ...如果table已经被analyze过,优化器模式将自动成为CBO,反之,数据
Analyze Table MySQL 的Optimizer(优化元件)在优化SQL语句时,首先需要收集一些相关信息,其中就包括表的cardinality(可以翻译为“散列程度”),它表示某个索引对应的列包含多少个不同的值——如果cardinality...
SQLite执行如下的语法 ALTER TABLE ANALYZE ATTACH DATABASE BEGIN TRANSACTION 注释 COMMIT TRANSACTION COPY CREATE INDEX CREATE TABLE CREATE TRIGGER CREATE VIEW DELETE DETACH DATABASE DROP INDEX DROP ...
在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器. 2. 访问Table的方式 ORACLE 采用两种访问表...
不需要Db.pas的支持, 它可以让DISQLite3 编译的时候使用Delphi全部的优势, 包括Delphi 标准版和专业版. 大多数数据库操作都比其它常见的数据库要快. 小巧易用的API. 支持加密. DISQLite3创建的数据库可以在Linux ...