- 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