灌入大量数据后手工采集统计信息的重要性(三)

2015-01-27 22:37:43 · 作者: · 浏览: 35
n hash value: 2620555949 ----------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | ----------------------------------------------------------------------------------------- PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 29M| 1703M| | 12327 (2)| 00:02:28 | |* 1 | HASH JOIN | | 29M| 1703M| 47M| 12327 (2)| 00:02:28 | | 2 | TABLE ACCESS FULL| TBL_STAT_2 | 1190K| 34M| | 3644 (1)| 00:00:44 | | 3 | TABLE ACCESS FULL| TBL_STAT | 1190K| 34M| | 3790 (1)| 00:00:46 | PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - access("A"."OBJECT_ID"="B"."OBJECT_ID")

15 rows selected. 此时TBL_STAT_2表的记录也趋于和实际一致,两表的连接仍是哈希连接
总结: 1. 表的统计信息收集还是比较重要的一项工作,除了Oracle 10g以后会有自动收集的作业外,也可以手工进行统计信息的收集。 2. 本例中,由于TBL_STAT表灌入100万数据后,未收集统计信息,和TBL_STAT_2表连接采用的是嵌套循环连接,这种连接适用于大表和小表的关联场景,但实际这的两张表数据量相当,且都超过了100万,这样相当于100万*100万次关联,当收集统计信息后,两表连接改为了哈希连接,说明此时Oracle已经知道了表的实际数据量,执行计划也是依据表的实际数据量来做的判断,因此当表灌入大量数据后,建议手工采集统计信息,否则在 系统自动采集统计信息之前,可能得到的执行计划就是错的。

?