`

索引的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 创建和删除索引

    1. **索引维护**:索引需要定期维护,以保持其有效性。例如,当数据频繁插入或删除时,可能会导致索引碎片化,进而影响查询性能。 2. **性能影响**:虽然索引可以加速查询操作,但也会对插入、更新和删除操作产生...

    索引总结 ,多年使用,工作培训

    4. **索引的自动管理**:索引一旦建立,在表上进行DML操作时(如插入、修改或删除),数据库系统会自动管理索引,确保索引的一致性和有效性。 5. **索引对用户的透明性**:索引的存在对于用户来说是透明的,无论表上...

    ORACLE索引与高性能SQL介绍

    创建索引时,可以选择特定的表空间,并设置适当的存储参数,如pctfree、initrans、maxtrans、minextents和maxextents,以优化空间利用率。 在处理大型表时,可以考虑并行创建索引,这可以显著减少创建时间并提高...

    oracel 分区表索引失效的问题

    PCTFREE 10 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED ) ); ``` 2. **创建全局索引:** 在`id`字段上创建全局索引`i_T_RANGE2`。 ```sql CREATE ...

    ORACLE索引介绍与高性能SQL优化

    索引的物理属性包括表空间、pctfree、initrans、maxtrans、storage参数等,这些参数对于索引的性能和空间使用有着直接影响。合理设置这些参数可以避免索引数据块的浪费,同时还能减少对重做日志文件空间的需求。 ...

    oracle索引

    5. **为性能安排索引列**:当多个字段经常一起用于检索时,组合索引会比单个索引更有效。 6. **限制每个表的索引数量**:虽然理论上一个表可以有几百个索引,但对于频繁插入和更新的表,过多的索引会导致较高的CPU和...

    数据库索引 分区 查询优化.ppt

    PCTFREE参数对索引无效,因为它主要影响表空间的分配。 在创建索引时,可以指定各种参数,如存储空间、初始化事务和最大事务数,以及是否启用日志记录等。例如,`CREATE INDEX`语句用于创建索引,可以定义索引是否...

    oracle建立索引

    - **数据块利用率**:默认情况下,每个数据块的`PCTFREE`为10%,即8KB的数据块可用于存储索引数据的空间约为6488字节。 - **索引容量估算**:一个数据块大约可以容纳360个索引条目。对于130万条记录的表,大约需要...

    oracle里常用命令之四

    在Oracle数据库管理中,索引是提升...了解并熟练运用这些Oracle索引命令,能够帮助数据库管理员有效地管理和优化数据库性能,提高数据检索的速度。记得在实际操作中根据具体需求和环境选择合适的索引类型和参数设置。

    Oracle分区表和索引

    当表的大小超过2GB,特别是在32位操作系统上,分区能够有效地提高查询性能,减少备份时间,并且便于管理和维护。Oracle支持对表格、表格上的索引、物化视图及其索引进行分区。 分区的透明性意味着SQL和DML操作无需...

    Oracle数据库中建立索引的基本方法讲解

    位图索引可以更有效地存储这些低基数的索引,但不适合高频率的DML操作。创建位图索引的语法如下: ```sql CREATE BITMAP INDEX idx_bitm ON class (classno) TABLESPACE tablespace_name; ``` 第四,创建唯一索引...

    oracle index学习总结

    通过理解这些概念并结合实际的数据库环境,我们可以更有效地管理和利用Oracle索引,从而提升数据库系统的性能。以上内容是根据“oracle index学习总结”文档的摘要,详细内容可参考提供的链接或文档:《oracle index...

    oracle 索引的相关介绍(创建、简介、技巧、怎样查看) .

    Oracle的优化器会智能选择是否使用索引,有时在数据量小或者查询复杂度低时,全表扫描可能比使用索引更有效率。查询的性能提升也可能来自缓存机制,因此,使用PL/SQL的“解释计划”功能可以分析执行计划,帮助编写更...

    oracle常用命令

    `:调整索引的空间使用效率,通过设置PCTFREE参数来预留一定比例的空间,避免频繁的页分裂和合并操作,提高更新性能。INITIAL和NEXT参数则分别指定初始分配的段大小和后续扩展的段大小。 #### 3. 索引空间分配 - `...

    oracle全表扫描的3种优化手段

    当索引选择性较差或者表较小的时候,Oracle可能会选择全表扫描而非索引扫描。全表扫描虽然能够快速获取数据,但其也会带来较大的IO负载,尤其是在大型表中。因此,对全表扫描进行优化是提高数据库性能的重要方面之一...

    Oracle DBA笔试及面试题汇总

    索引在大部分情况下可以加速查询,但当全表扫描更有效或索引本身很大时,使用索引反而可能降低性能。Oracle的CBO(成本基于优化器)会根据数据量、索引状态等因素决定是否使用索引。 2. **一、二、三范式、BCNF是...

    ora-600 13013处理方案

    ### ORA-600 13013错误处理方案 ...通过对索引进行检查、删除和重建等操作,可以有效地解决这类问题。此外,还需要关注表所在的数据集群的状态,确保其正确无误。在整个过程中,保持数据的安全性和完整性至关重要。

    北京邮电大学软件工程研究生的课程---数据库设计开发-4.3

    索引的PCTFREE设置需要考虑其初始创建时的空间需求,以便在增加辅助关键字时避免叶块的拆分。PCTUSED对于索引来说不是必需的,因为索引结构相对固定。根据表数据的稳定性来选择合适的PCTFREE值,以优化索引性能。 ...

Global site tag (gtag.js) - Google Analytics