ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 不同建表方式对统计信息影响不同

不同建表方式对统计信息影响不同

原创 Linux操作系统 作者:yangtingkun 时间:2007-06-06 00:00:00 0 删除 编辑

在测试一个SQL的时候发现10g的统计信息和建表的方式还有关系。


看一个简单的例子,测试版本10.2.0.1

SQL> ALTER SESSION SET OPTIMIZER_DYNAMIC_SAMPLING = 0;

会话已更改。

SQL> CREATE TABLE T1 (ID NUMBER PRIMARY KEY);

表已创建。

SQL> INSERT INTO T1 SELECT ROWNUM FROM DBA_TABLES;

已创建1563行。

SQL> COMMIT;

提交完成。

SQL> SET AUTOT ON
SQL> SELECT MAX(ID) MAX, MIN(ID) MIN FROM T1;

MAX MIN
---------- ----------
1563 1

执行计划
----------------------------------------------------------
Plan hash value: 3724264953

---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 2 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 13 | | |
| 2 | TABLE ACCESS FULL| T1 | 164 | 2132 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------

统计信息
----------------------------------------------------------
1 recursive calls
0 db block gets
7 consistent gets
0 physical reads
0 redo size
460 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed

SQL> CREATE TABLE T2 (ID PRIMARY KEY) AS SELECT ROWNUM FROM DBA_TABLES;

表已创建。

SQL> SELECT MAX(ID) MAX, MIN(ID) MIN FROM T2;

MAX MIN
---------- ----------
1563 1

执行计划
----------------------------------------------------------
Plan hash value: 3403752043

-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 1 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 13 | | |
| 2 | INDEX FULL SCAN| SYS_C0013827 | 818 | 10634 | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------

统计信息
----------------------------------------------------------
1 recursive calls
0 db block gets
3 consistent gets
2 physical reads
0 redo size
460 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed

为了避免动态收集统计信息的影响,这里先将其关闭。

上面的表T1T2中的数据完全相同,唯一的区别在于T1先建表和索引,然后插入数据。而T2在建表和索引的同时插入数据。

导致的结果就是二者的执行计划不一样。对T1执行全表扫描,而对T2执行索引扫描。从执行效果看显然T2的执行效果更好。

检查二者的统计信息发现:

SQL> SELECT TABLE_NAME, DISTINCT_KEYS, NUM_ROWS, SAMPLE_SIZE, LAST_ANALYZED
2 FROM USER_INDEXES WHERE TABLE_NAME IN ('T1', 'T2');

TABLE_NAME DISTINCT_KEYS NUM_ROWS SAMPLE_SIZE LAST_ANALYZED
---------------- ------------- ---------- ----------- -------------------
T1
T2 1563 1563 1563 2007-06-06 17:18:13

Oracle对于CREATE TABLE AS SELECT方式进行优化,在完成了创建表的过程后,收集了统计信息。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-69301/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1954
  • 访问量
    10876314