大家都知道,数据库中数据对象的统计值如果是准确的,那么优化器将生成更加高效的执行计划,从而提升系统的性能。一般情况下,统计值都在业务不繁忙的时候,统一收集。但这可能无法满足用户的需求。一般的解决方法是,在对数据对象做了较大的增删改之后,手动收集数据对象的统计值。或者创建JOB,缩短统计值收集间隔。但这都不是最好的解决方案,至于有多不好,网络上的资料很多,大家可以去查阅。因为统计值的收集,并不是没有成本的。我在多年前就遇到某客户因为统计值收集过于频繁而导致系统无法正常运行的情况。在实际工作中,很多时候都是由于没有正确使用Oracle数据库,而造成性能低下。比如在某大型系统中运行的每5秒钟刷新一次的物化视图,这绝对不是一个最好的选择。所以我们将在2020年发布《从零学习Oracle》系列,面向数据库的零基础初学者,为他们打好基础,希望他们在日后的工作中,能够很好地使用Oracle数据库,让Oracle为客户带来更大的价值。
回到我们今天的主题,从Oracle Database 19c开始,数据库可以实时收集数据对象的统计信息,为优化器提供准确的统计值,从而生成更加合理的执行计划。
今天我们继续使用上篇文章(手把手教你19c新特性:自动索引)所使用的Oracle Database 19c实验环境。我们之前所使用的测试环境,只有HR schema作为我们的测试数据,今天的实验当中涉及到SH这个schema,而我们在19c默认安装的时候,是没有这个schema的,所以请先和我一起安装sample数据。
第一步:下载测试数据压缩包
今天我打算将测试数据压缩包放在/u01下面,于是用wget将GitHub上的压缩文件下载到/u01下面。
第二步:将下载的文件进行解压
第三步:修改脚本
来到解压后的文件夹,我们稍后要执行里面的mksample.sql
这里需要和大家强调一下,因为有些朋友按照官方文档执行安装脚本的时候,总是报错,导致安装失败,我看到大家的报错信息,大多都是稍后我们要执行的脚本中路径有错造成的,大家在执行这个mksample.sql之前,执行以下命令,将脚本中“不正确”的路径修改一下就没有问题了。
当执行完上面的脚本之后,mksample.sql在执行的时候就不会报错了。
第四步:执行脚本
我们来到SQL Plus,进入ORCLPDB1这个PDB,然后执行mksample.sql,请注意,您在进入SQL Plus之前,请保持当前路径是mksample.sql所在路径。执行脚本之后,会被问询很多参数,因为参数的提示非常明确,我在这里就不赘述了,首先是system和sys的密码,然后就是新创建出的schema所对应的密码。如果您没有设定system和sys的密码。请来到CDB,通过alter user sys identified by oracle;和alter user system identified by oracle;进行设定。
第五步:确认测试数据
当脚本执行完成,会自动列出生成的数据信息,您也可以通过SQL进行查询,看看我们一会儿要用的SH中的表,是否已经创建完成。
Oracle Database 19c当中的实时统计信息收集是自动打开的,如果不想使用,可以通过Hint(NO_GATHER_OPTIMIZER_STATISTICS)来阻止收集。
统计值实时收集,是通过存储过程进行操作的,有如下存储过程可用:
如果想通过view进行查询,可以通过如下视图进行查询。需要注意的是,目前不支持分区统计值的查询。
第一步:授权
在这个实验中,我们使用sh这个schema中的数据,并且假设我们已经给sh用户授予了DBA角色,并以sh用户登录。
第二步:手动收集sales表上的统计信息,看看实时统计收集是否已经工作
我们首先收集sales表上的统计信息,然后查询字段级别的统计信息,我们发现在note部分,什么都没有。说明 real-time statistics还没有收集。
第三步:查询表级别的统计信息
看到的结果一样,在note部分,都是空白,说明 real-time statistics还没有收集。
第四步:向sales表插入大量数据,然后提交
第五步:获取执行计划
大家看到下图中第二个红框中显示LOAD TABLE CONVENTIONAL,这表示在刚才插入数据的时候,数据库执行了实时统计值收集的动作。
第六步:再次执行刚才字段级别的统计值查询
我们发现下面蓝色框中所示的区域,已经显示STATS_ON_CONVENTIONAL_DML,表示刚才做DML的时候,数据库已经进行了统计值收集的动作。
第七步:强制将统计值写入数据字典
实时统计值不会立刻写入数据字典,我们可以通过存储过程强制它立即写入。
第八步:再次查询表级别的统计信息
我们发现sales表中的统计数据都是最新的。还记得在之前版本的数据库中,count(*)和数据字典中的num_rows往往都是对不上的吗?
第九步:我们做一个sales表上的查询,然后看看执行计划
我们通过执行计划下方的note看出,本次执行计划已经使用到自动统计值收集功能。
今天的内容就到这里,感谢您的点阅,谢谢。您可以点击下方的“阅读原文”,查询官方文档,获取更多讯息。
手把手系列文章:
扫描下方QR Code即刻预约ADW演示
编辑:殷海英