aux_stats$ 基表(系统统计信息)

查看操作系统统计信息colsnamefora20colpnamefora20colpval2fora40select*fromsys.aux_stats$;SNAMEPNAMEPVAL1PVAL2------------------------------------------------------------------------------------------SYSSTATS_INFOSTATUSCOMPLETEDSYSSTATS_INFODSTART08-24-201312:04SYSSTATS_INFODSTOP08-24-201312:04SYSSTATS_INFOFLAGS1SYSSTATS_MAINCPUSPEEDNW3074.07407SYSSTATS_MAINIOSEEKTIM10SYSSTATS_MAINIOTFRSPEED4096SYSSTATS_MAINSREADTIMSYSSTATS_MAINMREADTIMSYSSTATS_MAINCPUSPEEDSYSSTATS_MAINMBRCSYSSTATS_MAINMAXTHRSYSSTATS_MAINSLAVETHaux_stats$是sys管理员用户下的一个基表后缀为$,必须写schema才能查询到,所谓的基表就是给动态性能视图提供数据的原始表,由于基表非常重要,oracle规定不允许直接访问和修改基表,如果你比较了解这些那么另说了。这个表中记录了“操作系统统计信息”。Oracle会利用操作系统统计信息来修正执行计划的代价,也就是说这些信息是影响代价计算的因素之一。注意:如果oracle收集了操作系统统计信息,那么CBO采用工作量统计模式计算代价如果oracle没有收集操作系统统计信息,那么CBO采用非工作量统计模式计算代价,看上面MBRC没有参数值就说明还没有收集操作系统统计信息。这两个模式计算代价的公式是不同的。列含义:

SQL>descsys.aux_stats$NameNull?Type------------------------------------------------------------------------------------------------------------SNAMENOTNULLVARCHAR2(30)PNAMENOTNULLVARCHAR2(30)PVAL1NUMBERPVAL2VARCHAR2(255)SNAME:是指操作系统统计信息PNAME:parameter name 参数名PVAL1:参数值PVAL2:参数值参数解释FLAGS:标志CPUSPEEDNW:非工作量统计模式下CPU主频,直接来自硬件IOSEEKTIM:IO寻址时间(毫秒),直接来自硬件IOTFRSPEED:IO传输速率(字节/毫秒)SREADTIM:读取单个数据块的平均时间MREADTIM:读取多个数据块的平均时间CPUSPEED:工作量统计模式下CPU主频,根据当前工作量评估出一个合理值MBRC:oracle收集完统计信息后评估出的一次多块读可以读几个数据块db_file_multiblock_read_countMAXTHR:最大IO吞吐量(字节/秒)SLAVETHR:平均IO吞吐量(字节/秒)后面这6个参数是在oracle收集完统计信息后才能得出的参数值,有什么用呢?CBO在计算SQL语句的代价时,需要使用数据库对象例如表 索引 等对象统计数据,还要使用操作系统统计数据例如CPU周期 IO速度 数据块读时间等,选择花费时间最少的执行计划为最佳执行计划。Oracle使用dbms_stats.gather_system_stats存储过程来收集操作系统统计信息,收集来的数据存放在sys.aux_stats$表中,如果我们做了收集操作那么会有统计数据,如果没有做就没有统计数据,这两种计算代价的方法是不同的。收集系统的统计信息:

dbms_stats.gather_system_stats语法executedbms_stats.gather_system_stats(gathering_modevarchar2default'noworkload'intervalintegerdefaultnull,stattabvarchar2defaultnull,statidvarchar2defaultnull,statownvarchar2defaultnull);解释gathering_mode 参数,默认值“noworkload”,还可以设置为“workload”含义noworkload:非工作量统计模式,收集上来的数据都是来自硬件workload:工作量统计模式,收集上来的数据需要在特定的数据库负载间隔内统计出来的,这样的数据才能真实反映出数据库的操作系统参数(需要执行sql测评出来)interval:可以指定收集统计信息的时间间隔,例如 5 收集5分钟的统计信息命令:execute dbms_stats.gather_system_stats('noworkload',5);START和STOP关键字自己决定何时开始何时结束收集统计信息命令:execute dbms_stats.gather_system_stats('start');上下两条指令间隔3分钟执行,然后把这3分钟的统计信息写入到sys.aux_stats$表里面execute dbms_stats.gather_system_stats('stop');MBRC参数,它是初始化参数db_file_multiblock_read_count的简写中文翻译“一次读多少个数据块or一次多块读可以读几个数据块”,如果收集了统计信息那么CBO会用MBRC计算代价,如果没有收集统计信息CBO会用这个初始化参数db_file_multiblock_read_count计算代价。