数据库开发小知识普及八--如何读懂SQL执行计划

1.SQL执行计划的选定依据

Oracle的执行计划的选择是有套路的。这里有一个重要的关键字:统计信息。有了这个统计信息,Oracle就可以高效快速的完成SQL的解析过程(判断出代价更低的执行计划)。

2.什么是统计信息呢?

举例:select * from t1,t2 where t1.id=t2.id and id=6;这个语句。从原理上来说,先访问小表,其成为驱动表,性能更高,因此如果我们知道t1和t2表谁更小,问题就解决了。表的大小是数据库从统计信息中获取的。数据库会对库里的每张表都做一个统计,记录每张表的记录数。

Oracle是如何收集统计信息的呢?

(1)Oracle会在一个固定的时间将库里的表和索引的相关统计信息进行收集(默认选择周一至周五晚上10点和周六日早上6点),用户可以自己调整收集时间,主要是避开高峰期。等于用空间换时间,执行计划通过了解数据字典中的这些num_rows和blocks即可知道表的大小。

(2)表和索引的数据字典中last_analyzed字段的取值,即为最近一次收集统计信息的时间。并不是所有对象每天都收集一遍统计信息,Oracle可以专门对表的记录变化量进行管理,当某表一天记录变化量没有超过指定阈值时,Oracle就不会对该表收集统计信息,所以很多时候不少表被第一次收集统计信息后,由于一直很少更新,故很少再有针对该表收集信息的动作。

(3)收集表和索引信息的动作非常灵活,比如可以只针对分区表的某个分区进行收集,可以在闲时使用并行机制来收集表和索引的统计信息,这可以极大提升性能。