Chinaunix首页 | 论坛 | 博客
  • 博客访问: 427249
  • 博文数量: 239
  • 博客积分: 8010
  • 博客等级: 中将
  • 技术积分: 2431
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-02 21:12
文章分类
文章存档

2008年(239)

我的朋友

分类: Oracle

2008-06-17 23:43:44

有关优化器的日常维护

优化器对SQL语句执行计划的成本估算,需要使用数据字典信息。其中的数据库对象统计信息反映了数据库中用户数据的使用和分布状况,这些信息的准确性决定了SQL语句最终执行计划的正确性。

数据库系统不会自动维护这些统计信息,对它的维护是数据库管理员的职责。

 

1. 定期执行统计信息的收集

 

数据库系统的运行,要不断地改变表、索引中的记录,表、索引的磁盘空间使用也不断地发生变化。在一段时间之后,现有统计信息已不能正确反映表、索引中的数据状况。优化器使用这些统计信息,就无法正确找出SQL语句的最小代价执行计划。因此数据库管理员应当定期收集表、索引的统计信息,以反映表、索引中数据的实际情况。

如果对表进行了大数据量的增加、删除或者更改操作,就应当立即进行统计信息的收集。

 

2. 决定需要进行统计信息收集的字段或者字段组合

 

一个表可能包含很多字段,一个索引也可能建立在多个字段上。是不是表、索引中的所有字段都需要统计信息的收集呢?

我们知道,优化器使用查询条件、表连接中字段及其它们的统计信息,决定SQL语句执行计划的访问路径(表扫描或者索引扫描)、表连接的方式和顺序。因此,我们只要对这些字段进行统计信息的收集,就能够保证优化器作出合理的选择。对其它字段的信息收集,是不必要的。

一般来说,我们应当结合应用程序,选择下列字段进行统计信息的收集:

1)表中用作查询条件的字段。

2)表中用作表连接的字段。

3)索引所使用字段。

4)如果表中多个字段经常一起出现在查询条件中,并且表中数据量巨大,那么可以将它们放在一起进行信息统计。

5)如果索引是复合索引,并且索引中记录数很多,那么可以根据需要,将索引的第一个字段和其它字段中的一些进行组合,进行统计信息的收集。

在决定要进行信息收集的字段之后,接下来需要确定信息的收集方式和准确程度。对字段的信息收集,可以统计其取值的最大值、最小值、不同取值的个数;可以设定字段取值区间,统计每一个取值区间内所包含的记录个数,等等。 这些统计信息的准确程度与处理的数据量有关,统计可以基于整个表、索引中的数据,也可以只在部分采样数据上进行。如果使用数据采样,采样的数据量越大,信息越准确。

所有这些工作应当在应用系统开发完成后,根据系统的使用情况来决定。

 

3. 在空闲状态下进行统计信息的收集

 

优化器生成SQL语句的执行计划后,要存放在内存缓冲区中。当SQL语句再次被使用时,就可以直接使用,从而提高了SQL语句的执行速度。

然而,SQL语句的执行计划和数据字典信息密切相关。一旦对数据库系统进行了维护,修改了数据字典信息,如:更改了表和索引的结构、重新收集了统计信息,存放在内存缓冲区中、与此相关的执行计划将失效,优化器必须再次对SQL语句进行优化。

此外,在业务高峰期对系统进行维护,不但要花费大量时间、占用大量资源,而且由于锁的使用,影响了系统的并发能力,从而对业务系统的运行产生非常大的影响。

因此为了避免执行计划的失效以及对业务系统的影响,数据库管理员不要在业务高峰期对系统进行维护,维护工作可以在系统处于空闲状态下进行,如:下班后或者夜间。

阅读(529) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~