索引的pctfree什么时候有效?

tom曰:
pctfree only counts when BUILDING an index.  It reserves X% of the block for subsequent
inserts into that block (inserts into the block can arise from inserts or UPDATES to the
base table).

All the pctfree does on an index is defer the splitting of an index block due to
subsequent inserts/updates AFTER the index is build.  10% is just a good "starting
point".

可见,与表的pctfree值不同,对于索引来说,其pctfree仅仅是在create或rebuild时生效,对与后续的插入、修改之类的操作来说是无效的,pctfree的设置也仅仅是为了延缓由于insert等操作而导致的的索引块分裂。

测试验证:

SQL> create table t(id int) tablespace users;

Table created.

SQL>  create index idx_t on t(id) tablespace idx_2k;

Index created.

SQL>  select table_name,index_name,pct_free from user_indexes where table_name='T';

TABLE_NAME                     INDEX_NAME                       PCT_FREE
------------------------------ ------------------------------ ----------
T                              IDX_T                                  10

SQL> begin
  2  for i in 1 .. 100000 loop
  3  insert into t values(i);
  4  end loop;
  5  commit;
  6  end;
  7  /

PL/SQL procedure successfully completed.

SQL> analyze index idx_t validate structure;

Index analyzed.

SQL> select name,blocks,lf_blks,br_blks,used_space,pct_used from index_stats;

NAME                                                   BLOCKS    LF_BLKS    BR_BLKS USED_SPACE   PCT_USED
-------------------------------------------------- ---------- ---------- ---------- ---------- ----------
IDX_T                                                    1024        864          7    1599166        100

SQL> alter index idx_t rebuild pctfree 10 tablespace idx_2k;

Index altered.

SQL>  analyze index idx_t validate structure;

Index analyzed.

SQL> select name,blocks,lf_blks,br_blks,used_space,pct_used from index_stats;

NAME                                                   BLOCKS    LF_BLKS    BR_BLKS USED_SPACE   PCT_USED
-------------------------------------------------- ---------- ---------- ---------- ---------- ----------
IDX_T                                                    1024        965          8    1600361         89

转自:http://space.itpub.net/10972173/viewspace-626164

这里主要说一下索引里面的PCTFREE概念:我们知道,表块里面的PCTFREE存在的主要目的是为了在块里面的行的列值进行更改时留下空间,这部分空间是不能用于插入行的行的。索引里面的PCTFREE主要是指在索引创建时为索引块留下的的剩余空间,这个剩余空间可以用来插入新的索引项。而不是更新索引项(index entry)哪怕这个块中的使用量已经超过了PCTFREE的值。这里顺便巩固一下Index entry的组成:它包括Index ertry header,key column length,key column value,rowid四个部分组成。所以,更新键列值时,涉及到的是对索引项的逻辑上的删除和重建。删除行只导致逻辑删除索引项。删除的行所用的空间仍不能用于新项,直到删除块中的所有项。索引中我们不能为索引指定PCTUSED。由于索引项必须按正确的顺序存储,所以用户无法控制何时在某一索引块中插入。

重建索引的一些优缺点:

重建索引是在现有索引的基础上进行重建,所以它省掉了排序麻烦,防止了我们temp标空间的争用。从而性能更加。但是又因为我们重建索引是基于前面的索引,所以在重建索引时,表空间同时存在旧的索引和新创建的索引,直到新的索引创建完毕。在这个期间,旧的索引可以继续工作。但是我们不建议在此期间进行大量的DML操作。所以对表空间的容量具有一定的要求。重新创建的索引不包括已经删除的项。所以可以更好的使用表空间资源。我们在一个索引如果存在大量的删除项时重建索引是个不错的选择。

在进行数据的批量加载时,建议把索引删除然后等数据加载完毕后进行重建

同时不要忘了,我们将索引存在的表移动到了其它的表空间,索引不能跟着移动,我们需要重建索引。

转自:http://iselina870217.blog.163.com/blog/static/348270112007819103633861/

你可能感兴趣的:(oracle)