设为首页 加入收藏

TOP

Oracle Index Clustering Factor(集群因子)(五)
2018-01-17 13:05:29 】 浏览:394
Tags:Oracle Index Clustering Factor 集群 因子
sp;   7657  bytes received via SQL*Net from client
    660    SQL*Net roundtrips to/from client
      0    sorts (memory)
      0    sorts (disk)
    9880  rows processed   
----强制走索引之后,使用了index range scan,但是cost变成了9683,而全表扫描时是1824.
----还有比较一下两次查询中物理读的情况:全表扫描的物理读明显比索引的要高很多,但是Oracle却没有使用索引。
----因此Oracle认为走索引的Cost比走全表扫描大,而是大N倍,CBO是基于Cost来决定执行计划的。
----由此得出,对于索引的Cost,Oracle是根据clustering factor参数来计算的,而该实验中的clustering factor参数是很高的,数据存储无序。这就造成了Oracle认为走索引的cost比全表扫描的大。


 4.2、解决问题:


----通过上面的分析,可以看出,要降低clustering factor才能解决问题,而要解决clustering factor,就需要重新对表的存储位置进行排序。----
  ----重建jakc表----
SQL> create table echo as select * from jack where 1=0;


Table created.


SQL> insert /*+ append */ into echo select * from jack order by object_id;


725460 rows created.


SQL> commit;


Commit complete.


SQL> truncate table jack;


Table truncated.


SQL> insert /*+ append */ into jack select * from echo;


725460 rows created.


SQL> commit;


Commit complete.


  ----查看表和索引的信息----
SQL> select segment_name,blocks,extents,bytes/1024/1024||'M' "size" from user_segments where segment_name='JACK';


SEGMENT_NAME    BLOCKS    EXTENTS    size
------------- ---------- ---------- -----------
JACK            11264      82        88M


SQL> select segment_name,segment_type,blocks,extents,bytes/1024/1024||'M' "size" from user_segments where segment_name='JACK_IND';


SEGMENT_NAME    SEGMENT_TYPE      BLOCKS    EXTENTS    size
------------ ------------------ ---------- ---------- -------------
JACK_IND            INDEX          1536          27    12M


SQL> select index_name,clustering_factor,num_rows from user_indexes where index_name='JACK_IND';


INDEX_NAME    CLUSTERING_FACTOR NUM_ROWS
------------- ----------------- ----------
JACK_IND            725460      725460


  ----对索引进行rebuild----
SQL> alter index jack_ind rebuild;


Index altered.


  ----查看cluster factor----
SQL> select index_name,clustering_factor,num_rows from user_indexes where index_name='JACK_IND';


INDEX_NAME      CLUSTERING_FACTOR  NUM_ROWS
--------------- ----------------- ----------
JACK_IND              10327      725460    ------注意这里的Factor,已经变成10327,我们收集一下表的统计信息,然后与表的block进行一次比较。


SQL> exec dbms_stats.gather_table_stats(user,'jack',cascade=>true);


PL/SQL procedure successfully completed.


SQL> select blocks from dba_tables where table_name='JACK';


    BLOCKS
----------
    10474  ----表jack实际使用的block是10474,clustering factor是10327基本还是比较接近了,这也说明相邻的row是存储在相同的block里。


SQL> select index_name,clustering_factor,num_rows from user_indexes where index_name='JACK_IND';


INDEX_NAME              CLUSTERING_FACTOR  NUM_ROWS
------------------------------ ----------------- ----------
JACK_IND              &

首页 上一页 2 3 4 5 下一页 尾页 5/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇MySQL 5.7设置简单密码报错ERROR .. 下一篇MySQL binlog日志存放位置的修改

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目