统计信息类似于战争中的侦察兵,如果情报工作没有做好,打仗就会输掉战争。同样的道理,如果没有正确地收集表的统计信息,或者没有及时地更新表的统计信息,SQL的执行计划就会跑偏,SQL也就会出现性能问题。收集统计信息是为了让优化器选择最佳执行计划,以最少的代价(成本)查询出表中的数据。
统计信息主要分为表的统计信息、列的统计信息、索引的统计信息、系统的统计信息、数据字典的统计信息以及动态性能视图基表的统计信息。
关于系统的统计信息、数据字典的统计信息以及动态性能视图基表的统计信息本文不做讨论,本文重点讨论表的统计信息、列的统计信息以及索引的统计信息。
表的统计信息主要包含表的总行数(num_rows)、表的块数(blocks)以及行平均长度(avg_row_len),我们可以通过查询数据字典DBA_TABLES获取表的统计信息。
我有几张阿里云幸运券分享给你,用券购买或者升级阿里云相应产品会有特惠惊喜哦!把想要买的产品的幸运券都领走吧!快下手,马上就要抢光了。
现在我们创建一个测试表T_STATS。
1SQL> create table t_stats as select * from dba_objects;
2Table created.
我们查看表T_STATS常用的表的统计信息。
1SQL> select owner, table_name, num_rows, blocks, avg_row_len
2 2 from dba_tables
3 3 where owner = 'SCOTT'
4 4 and table_name = 'T_STATS';
5OWNER TABLE_NAME NUM_ROWS BLOCKS AVG_ROW_LEN
6--------------- --------------- ---------- ---------- -----------
7SCOTT T_STATS
因为T_STATS是新创建的表,没有收集过统计信息,所以从DBA_TABLES查询数据是空的。
现在我们来收集表T_STATS的统计信息。
1SQL> BEGIN
2 2 DBMS_STATS.GATHER_TABLE_STATS(ownname => 'SCOTT',
3 3 tabname => 'T_STATS',
4 4 estimate_percent => 100,
5 5 method_opt => 'for all columns size auto',
6 6 no_invalidate => FALSE,
7 7 degree => 1,
8 8 cascade => TRUE);
9 9 END;
10 10 /
11PL/SQL procedure successfully completed.
我们再次查看表的统计信息。
1SQL> select owner, table_name, num_rows, blocks, avg_row_len
2 2 from dba_tables
3 3 where owner = 'SCOTT'
4 4 and table_name = 'T_STATS';
5OWNER TABLE_NAME NUM_ROWS BLOCKS AVG_ROW_LEN
6--------------- --------------- ---------- ---------- -----------
7SCOTT T_STATS 72674 1061 97
从查询中我们可以看到,表T_STATS一共有72?674行数据,1?061个数据块,平均行长度为97字节。
列的统计信息主要包含列的基数、列中的空值数量以及列的数据分布情况(直方图)。我们可以通过数据字典DBA_TAB_COL_STATISTICS查看列的统计信息。
现在我们查看表T_STATS常用的列统计信息。