设为首页 加入收藏

TOP

B树索引学习总结。(四)
2014-11-24 01:08:16 来源: 作者: 【 】 浏览:40
Tags:索引 学习 总结
- dynamic sampling used for this statement (level=2) Statistics ---------------------------------------------------------- 17 recursive calls 0 db block gets 54 consistent gets 0 physical reads 0 redo size 2411 bytes sent via SQL*Net to client 534 bytes received via SQL*Net from client 3 SQL*Net roundtrips to/from client 3 sorts (memory) 0 sorts (disk) 28 rows processed

这就是oracle cbo采用全表扫描方式。注意:有时候采用全表扫描可能比采用索引效率更高。

2、准备创建B树索引:

命名规则:

主键索引名应该包含表名和一个后缀,如:_PK;

唯一索引应该包含表名和一个后缀,如:_UKN,N代表一个数字;

外键索引应该包含外键表和一个后缀,如_FKN,N代表一个数字;

对于不适用约束的索引,适用表名和一个后缀,如_IDXN,N代表一个数字;

基于函数的索引的名称应该适用一个表名和一个后缀,如_FCN,N代表一个数字;

只所以采用这种命名方法是便于查看和便于问题分析。

估算索引大小;

因为当在一个大表上创建索引或是在一个业务量增长非常迅速的表上维护索引时,该索引同样需要消耗资源,当表空间资源不足的时候,就有可能导致数据库挂起。

对于估算索引一般采用如下步骤:

1、收集最新的表的统计信息

2、使用dbms_space.create_index_cost进行 索引估算。下面测试如

估算需要创建索引的大小,如下:

SQL> EXEC DBMS_STATS.gather_TABLE_STATS(OWNNAME=>'AMY',TABNAME=>'T',CASCADE=>TRUE);

PL/SQL procedure successfully completed.

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

no rows selected

SQL> SET SERVEROUT ON   
SQL> VAR USED_BYTES NUMBER
SQL> VAR ALLOC_BYTES NUMBER
SQL> EXEC DBMS_SPACE.CREATE_INDEX_COST('CREATE INDEX T_IDX1 ON T(A)',:USED_BYTES,:ALLOC_BYTES);

PL/SQL procedure successfully completed.

SQL> PRINT USED_BYTES

USED_BYTES
----------
   1135000

SQL> PRINT ALLOC_BYTES

ALLOC_BYTES
-----------
    6291456

SQL> CREATE INDEX T_IDX1 ON T(A);

Index created.


SQL> SELECT SEGMENT_NAME,BYTES FROM USER_SEGMENTS WHERE SEGMENT_NAME='T_IDX1';

SEGMENT_NAME              BYTES
-------------------- ----------
T_IDX1                  4423680

SQL> 


索引与表数据分离,单独创建表空间,这样可以单独维护索引如备份和恢复,但是减少i/0其实更应该放入不同的磁盘上面;

SQL> create tablespace reporting_index datafile '+DATAGROUP1' size 512M autoextend on next 1M maxsize 1G extent management local uniform size 128K segment space management auto nologging;

Tablespace created.
SQL> DROP INDEX T_IDX1;

Index dropped.

SQL> CREATE INDEX T_IDX1 ON T(A) TABLESPACE REPORTING_INDEX;

Index created.

SQL>

SQL> alter table emp add constraint emp_pk primary key(empno) using index tablespace reporting_index;

Table altered.

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

INDEX_NAME                     TABLE_NAME
------------------------------ ------------------------------
EMP_PK                         EMP

SQL> alter table emp add constraint emp_uk unique(empno,ename) using index tablespace reporting_index;

Table altered.
SQL> DROP INDEX EMP_IDX2;

Index dropped.

SQL> alter table dept add constraint dept_pk primary key(deptno) using index tablespace reporting_index;

Table altered.

SQL> CREATE INDEX EMP_IDX2 ON EMP(DEPTNO) TABLESPACE REPORTING_INDEX;

Index created.

SQL> select index_name,INDEX_TYPE,table_name,tablespace_name,status from user_indexes where table_name in('T','EMP','DEPT');

INDEX_NAME                     INDEX_TYPE                  TABLE_NAME                     TABLESPACE_NAME                STATUS
------------------------------ --------------------------- ------------------------------ ------------------------------ --------
T_IDX1                         NORMAL                      T                              REPORTING_INDEX                VALID
EMP_PK                         NORMAL                      EMP                            REPORTING_INDEX                VALID
EMP_UK                         NORMAL                      EMP                            REPORTING_INDEX                VALID
EMP_IDX2                       NORMAL                      EMP                            REPORTING_INDEX                VALID
DEPT_PK                        NORMAL                      DEPT                           REPORTING_IN
首页 上一页 1 2 3 4 5 6 下一页 尾页 4/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇ACCESS 外链文件 下一篇Oracle系统包

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: