短信预约-IT技能 免费直播动态提醒
oracle 11g 扩展统计信息extended_stats
<span style="font-size:16px;"><strong>oracle 11g在统计信息收集方面增加了扩展统计信息的特性,它可以收集一个表中相关列上的统计信息,也可以收集函数表达式上的</strong></span><br />
<span style="font-size:16px;"><strong>统计信息.使选择率,成本的估计更加准确,也更容易走正确的执行计划.在相关列上收集统计信息,好处还是很明显的.例如两列在逻辑</strong></span><br />
<span style="font-size:16px;"><strong>上有一定的关系,但如果只是对这两个列单独做统计信息的收集,根据多条件的选择率计算{(A AND B的选择率为:OPSEL[a]*OPSEL[b]);</strong></span><br />
<span style="font-size:16px;"><strong>(A OR B 的选择率为:OPSEL[a]+OPSEL[b]-OPSEL[a]OPSEL[b]);(NOT A的选择率为:1-OPSEL[a])},估算出来的选择率就可能偏差很大.</strong></span><br />
<br />
<span style="font-size:16px;"><strong>以下测试:</strong></span><br />
<strong>DB Version:11.2.0.4</strong><br />
<span style="font-size:16px;"><strong>----产生测试数据</strong></span><br />
<span style="font-size:16px;">drop table scott.test01 purge;</span><br />
<span style="font-size:16px;">create table scott.test01</span><br />
<span style="font-size:16px;">as select * from dba_objects;</span><br />
<br />
<span style="font-size:16px;"><strong>--把object_name 更新为和object_type一样,用于测试.</strong></span><br />
<span style="font-size:16px;">update scott.test01</span><br />
<span style="font-size:16px;">set object_name=object_type;</span><br />
<span style="font-size:16px;">commit;</span><br />
<br />
<span style="font-size:16px;"><strong>1.收集单列统计信息,查看执行计划</strong></span><br />
<span style="font-size:16px;"><strong>--收集单列统计信息</strong></span><br />
<span style="font-size:16px;">begin</span><br />
<span style="font-size:16px;">dbms_stats.gather_table_stats('scott','test01');</span><br />
<span style="font-size:16px;">end;</span><br />
<span style="font-size:16px;"><strong>--查看表的行数</strong></span><br />
<span style="font-size:16px;">select table_name,num_rows from dba_tables</span><br />
<span style="font-size:16px;">where owner = 'SCOTT' and table_name = 'TEST01';</span><br />
<span style="font-size:16px;"></span><br />
<span style="font-size:16px;"><strong>--产生语句的执行计划</strong></span><br />
<span style="font-size:16px;">explain plan for select * from scott.test01 where object_name='INDEX' and object_type='INDEX';</span><br />
<br />
<span style="font-size:16px;">SELECT lpad(' ', 2 * (LEVEL - 1)) || operation operation,</span><br />
<span style="font-size:16px;"> options,</span><br />
<span style="font-size:16px;"> object_name,</span><br />
<span style="font-size:16px;"> cardinality,</span><br />
<span style="font-size:16px;"> bytes,</span><br />
<span style="font-size:16px;"> io_cost,</span><br />
<span style="font-size:16px;"> cpu_cost,</span><br />
<span style="font-size:16px;"> cost,</span><br />
<span style="font-size:16px;"> time</span><br />
<span style="font-size:16px;"> FROM plan_table</span><br />
<span style="font-size:16px;"> START WITH id = 0</span><br />
<span style="font-size:16px;">CONNECT BY PRIOR id = parent_id;</span><br />
<span style="font-size:16px;"></span><br />
<span style="font-size:16px;"><strong>这里可以看到,估算的返回行数是41,显然和实际相差很远</strong></span><br />
<span style="font-size:16px;">rollback;</span><br />
<br />
<span style="font-size:16px;"><strong>--行数估算</strong></span><br />
<span style="font-size:16px;"> select rpad(column_name, 30, ' ') column_name,</span><br />
<span style="font-size:16px;"> rpad(num_distinct, 8, ' ') num_distinct,</span><br />
<span style="font-size:16px;"> rpad(utl_raw.cast_to_varchar2(low_value), 15, ' ') low_value,</span><br />
<span style="font-size:16px;"> rpad(utl_raw.cast_to_varchar2(high_value), 10, ' ') high_value,</span><br />
<span style="font-size:16px;"> rpad(num_nulls, 8, ' ') num_nulls,</span><br />
<span style="font-size:16px;"> rpad(avg_col_len, 6, ' ') avg_col_len,</span><br />
<span style="font-size:16px;"> rpad(density, 20, ' ') density,</span><br />
<span style="font-size:16px;"> histogram</span><br />
<span style="font-size:16px;"> from dba_tab_col_statistics</span><br />
<span style="font-size:16px;"> where owner = 'SCOTT'</span><br />
<span style="font-size:16px;"> and table_name = 'TEST01'</span><br />
<span style="font-size:16px;"> and column_name in ('OBJECT_NAME','OBJECT_TYPE');</span><br />
<span style="font-size:16px;"></span><br />
<span style="font-size:16px;"><strong>估算的返回行数是41,是由两个列的density相乘再乘以表的行数得到,.0217391304347826*.0217391304347826*87212=41.2155009451796=41</strong></span><br />
<span style="font-size:16px;"><strong> </strong> </span><br />
<span style="font-size:16px;"><strong>2.收集多列扩展统计信息,查看执行计划</strong></span><br />
<span style="font-size:16px;"><strong>--收集多列扩展统计信息</strong></span><br />
<span style="font-size:16px;"> begin</span><br />
<span style="font-size:16px;"> dbms_stats.gather_table_stats('scott','test01',method_opt =>'for columns (object_name,object_type)');</span><br />
<span style="font-size:16px;"> end;</span><br />
<br />
<span style="font-size:16px;"><strong>--产生语句的执行计划 </strong> </span><br />
<span style="font-size:16px;"> explain plan for select * from scott.test01 where object_name='INDEX' and object_type='INDEX';</span><br />
<br />
<span style="font-size:16px;">SELECT lpad(' ', 2 * (LEVEL - 1)) || operation operation,</span><br />
<span style="font-size:16px;"> options,</span><br />
<span style="font-size:16px;"> object_name,</span><br />
<span style="font-size:16px;"> cardinality,</span><br />
<span style="font-size:16px;"> bytes,</span><br />
<span style="font-size:16px;"> io_cost,</span><br />
<span style="font-size:16px;"> cpu_cost,</span><br />
<span style="font-size:16px;"> cost,</span><br />
<span style="font-size:16px;"> time</span><br />
<span style="font-size:16px;"> FROM plan_table</span><br />
<span style="font-size:16px;"> START WITH id = 0</span><br />
<span style="font-size:16px;">CONNECT BY PRIOR id = parent_id;</span><br />
<span style="font-size:16px;"></span><br />
<span style="font-size:16px;"><strong>这里可以看到,估算的返回行数是5303,已经基本上和实际返回行数相近.</strong></span><br />
<br />
<span style="font-size:16px;"><strong>PS:</strong></span><br />
<span style="font-size:16px;"><strong>1.扩展统计信息的收集,可以用select dbms_stats.create_extended_stats('scott','test01','(object_name,object_type)')from dual</strong></span><br />
<span style="font-size:16px;"><strong>创建扩展统计列,然后dbms_stats.gather_table_stats('scott','test01')收集统计信息,也可以直接在</strong></span><br />
<span style="font-size:16px;"><strong>dbms_stats.gather_table_stats中的method_opt属性同时建立扩展统计又收集统计数据.</strong></span><br />
<span style="font-size:16px;"><strong>2.oracle 11g不仅可以收集多列扩展统计信息,还可以收集函数和表达式的扩展统计信息.</strong></span><br />
<br />
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)
难度 813人已做
查看 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析
难度 354人已做
查看 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析
难度 318人已做
查看 2024年上半年软考高项第一、二批次真题考点汇总(完整版)
难度 435人已做
查看 2024年上半年系统架构设计师考试综合知识真题
难度 224人已做
查看