分享
分享赚钱 收藏 举报 版权申诉 / 6

类型集簇因子-柱状图.doc

  • 上传人:tkhy51908
  • 文档编号:8225239
  • 上传时间:2019-06-15
  • 格式:DOC
  • 页数:6
  • 大小:55.50KB
  • 配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    集簇因子-柱状图.doc
    资源描述:

    1、列值的选择性、集簇和柱状图切记,优化器了解表中列数据的许多重要特征,最显著的是列值的选择性和列的集簇因子以及柱状图。 例如,以下我们看到一个使用列值来形成结果集的查询: selectcustomer_namefromcustomerwherecustomer_state = Rhode Island;在此示例中,选择使用索引还是全表扫描受到罗得岛客户比例的影响。如果罗得岛客户的比例非常小,并且数值集簇在数据块中,则对于此查询而言索引扫描可能是最快的执行计划。 许多 Oracle 开发人员对于当他们只检索很少量的行时优化器选择全表扫描而感到困惑,而没有意识到优化器考虑了表中列值的集簇。 Orac

    2、le 在 dba_indexes 视图中提供一个名为 clustering_factor 的列,通知优化器关于表的行与索引的同步情况。当集簇因子接近数据块的数量时,表的行与索引同步,即相同的数据存放得比较集中,聚集度高。 列值的选择性、db_block_size、avg_row_len 以及集合基数全都协同工作,帮助优化器决定是使用索引还是使用全表扫描。如果数据列具有高度的选择性和低的 clustering_factor,则索引扫描通常是最快的执行方法(参见 图 2)。 如果多数 SQL 引用了具有高 clustering_factor、大 db_block_size 和小 avg_row_l

    3、en 的列,则 DBA 有时会周期性地对表的行进行重排序或使用单表集簇来维持行的顺序。这种方法将所有相邻的行放置在同一数据块中,消除了全表扫描,使查询速度的增加高达 30 倍。 相反,高 clustering_factor 的数值达到表中的行数 (num_rows),表明这些行的顺序与索引中的顺序不同,索引范围扫描将会需要额外的 I/O。由于 clustering_factor 达到表中的行数,这些行与索引不同步,即相同的数据存放得比较分散,聚集度低。 但是,即使列具有高度的选择性,高 clustering_factor 和小 avg_row_len 也会表示列值在表中随机分布,而获取这些行需

    4、要额外的 I/O。在此情况下,索引范围扫描会导致大量不必要的 I/O(参见 图 3);全表扫描则会高效得多。总而言之,clustering_factor、db_block_size 和 avg_row_len 全都影响优化器有关执行全表扫描或是索引范围扫描的决策,理解优化器如何使用这些统计信息非常重要。 我们已经注意到,每个新版本的优化器都有改进,并且 Oracle Database 10 g 提供的最新增强特性在确定执行计划时会考虑外部的影响。Oracle 称此特性为外部成本核算,并包括对 CPU 和 I/O 成本的评估。以下例子来说明列值的集簇因子对执行计划产生的影响:1、 搭建环境 SQ

    5、L insert into test select * from emp;14 rows created.Commit complete. SQLcreate index test_ename_ind on test (ename);2、分析表SQL analyze table test compute statistics;Table analyzed.3、查看列值的集簇因子:select t.table_name,t.NUM_ROWS,t.BLOCKS,t.AVG_ROW_LEN,i.index_name,i.CLUSTERING_FACTORfrom dba_tables t,dba_i

    6、ndexes iwhere t.table_name=i.table_nameand t.owner=SCOTTand t.table_name=TEST3;TABLE_NAME NUM_ROWS BLOCKS AVG_ROW_LEN INDEX_NAME CLUSTERING_FACTOR- - - - - -TEST 14 1 32 TEST_ENAME 14、使用索引列进行查询:SQL select * from test where ename=CUUG1;no rows selectedExecution Plan-0 SELECT STATEMENT Optimizer=CHOOS

    7、E (Cost=2 Card=1 Bytes=32)1 0 TABLE ACCESS (FULL) OF TEST (TABLE) (Cost=2 Card=1 Bytes=32)Statistics-1 recursive calls0 db block gets3 consistent gets0 physical reads0 redo size615 bytes sent via SQL*Net to client376 bytes received via SQL*Net from client1 SQL*Net roundtrips to/from client0 sorts (m

    8、emory)0 sorts (disk)0 rows processed注;这里执行计划采用全表扫描。(如果使用到了索引,那么再往表中插入一遍数据,然后做 analyze,此时 oracle 就会选择全表扫描 )5、往 test 表中插入数据,注意 ename 列的值都不一样,也就是有很高的选择性。declareV_ENAME test.ename%type;BEGINV_ENAME :=CUUG;FOR I IN 110000 LOOPinsert into test (empno,ename,job,sal,deptno)values (1121,V_ENAME|I,WORKER,2000

    9、,20);END LOOP;COMMIT;END;6、然后使用索引列进行查询:SQL select * from test where ename=CUUG1;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO- - - - - - - -1121 CUUG1 WORKER 2000 20Execution Plan-0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=32)1 0 TABLE ACCESS (FULL) OF TEST (TABLE) (Cost=2 Card=1 Bytes=

    10、32)Statistics-1 recursive calls0 db block gets51 consistent gets0 physical reads0 redo size795 bytes sent via SQL*Net to client511 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)1 rows processed注:这里还是采用了全表扫描的执行计划,按道理列的选择性很高,AVG_ROW_LEN 的值也很小,为什

    11、么没有采用索引能,一个关键的原因就是集簇因子。因为 test 表曾经分析过,在 dba_indexes 中保留了列值的集簇因子,导致执行计划选择全表扫描。7、如何让执行计划采用索引,需要对表 test 再次分析。SQL analyze table test compute statistics;Table analyzed.1 select t.table_name,t.NUM_ROWS,t.BLOCKS,t.AVG_ROW_LEN,i.index_name,i.CLUSTERING_FACTOR2 from dba_tables t,dba_indexes i3 where t.table_

    12、name=i.table_name4 and t.owner=SCOTT5* and t.table_name=TEST3SQL /TABLE_NAME NUM_ROWS BLOCKS AVG_ROW_LEN INDEX_NAME CLUSTERING_FACTOR- - - - - -TEST 10014 47 32 TEST_ENAME 1920注:这里的集簇因子的值变了。8、再次执行查询:SQL select * from test where ename=CUUG1;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO- - - - - - - -1

    13、121 CUUG1 WORKER 2000 20Execution Plan-0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=29)1 0 TABLE ACCESS (BY INDEX ROWID) OF TEST (TABLE) (Cost=2 Card=1 Bytes=29)2 1 INDEX (RANGE SCAN) OF TEST_ENAME (INDEX) (Cost=1 Card=1)Statistics-1 recursive calls0 db block gets4 consistent gets0 physi

    14、cal reads0 redo size799 bytes sent via SQL*Net to client511 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)1 rows processed注:发现这次执行计划选择了索引。许多 Oracle 开发人员对于当他们只检索很少量的行时优化器选择全表扫描而感到困惑,而没有意识到优化器考虑了表中列值的集簇。另外,如果表包含有很多空块(delete 以后) ,也会影响优化器的选择,比如集簇因子不同步,但是空块很多,也会影响优化器。

    展开阅读全文
    提示  道客多多所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:集簇因子-柱状图.doc
    链接地址:https://www.docduoduo.com/p-8225239.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    道客多多用户QQ群:832276834  微博官方号:道客多多官方   知乎号:道客多多

    Copyright© 2025 道客多多 docduoduo.com 网站版权所有世界地图

    经营许可证编号:粤ICP备2021046453号    营业执照商标

    1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png



    收起
    展开