查看: 7252|回复: 37

【话题讨论】浅析oracle 数据库索引相关问题

[复制链接]
认证徽章
论坛徽章:
24
技术图书徽章
日期:2013-08-16 14:31:52问答徽章
日期:2013-11-04 08:53:14目光如炬
日期:2013-12-23 06:00:11目光如炬
日期:2013-12-30 06:00:11明星写手
日期:2014-02-22 06:00:12马上有钱
日期:2014-03-31 14:09:05沸羊羊
日期:2015-05-20 12:42:59秀才
日期:2015-06-24 13:05:36秀才
日期:2015-07-13 09:48:14
发表于 2013-6-25 09:32 | 显示全部楼层 |阅读模式
在应用程序开发工作中,之所以要用到数据库,很大一方面原因是数据库能确保数据的安全和高效存取,这样我们可以专心开发与业务相关的功能,而不必操心对底层数据结构进行操作的具体实现。数据库利用各种方式维护数据的完整性、一致性,并提高数据查询和更改操作的效率,其中索引是非常重要的一种方式。Oracle体系结构庞大,它的索引种类繁多、特点各异,每种都有适用的场合和值得注意之处。随着版本的更新,Oracle不断增加新的索引类型。要开发正确、高效的应用程序,必须在一开始就计划使用索引,并在设计中包含它们。而不是等应用程序编写完成后,再让DBA去创建索引,虽然有时需要根据业务的发展修改索引。要在编写应用程序过程中利用好索引,需要深入了解各种索引的功能和特点。否则如果用错索引,不但不能获益,还会给应用程序带来不良的影响。在应用程序投入运行之后,监控、管理和维护索引,对于保证应用程序正常运行必不可少。


讨论话题:
1.如何决定创建索引的类型,你一般使用那种类型的索引?
2.Oracle索引技术之如何建立最佳索引?


讨论时间:2013.6.25--2013.7.12

讨论奖励:活动结束后将会抽取4名会员赠送唯一专注Oracle数据库索引技术的图书《Oracle索引技术》一本。
zcover.jpg

buptdream    pastime_Wang  
认证徽章
论坛徽章:
86
秀才
日期:2015-09-21 09:46:16目光如炬
日期:2014-07-28 06:00:03马上有钱
日期:2014-06-16 15:55:42马上有房
日期:2014-06-16 15:55:422014年世界杯参赛球队: 伊朗
日期:2014-06-13 11:29:242014年世界杯参赛球队:巴西
日期:2014-06-06 14:36:14马上有钱
日期:2014-04-04 13:51:21马上加薪
日期:2014-04-04 13:35:40马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:02
发表于 2013-6-25 09:50 | 显示全部楼层
本帖最后由 buptdream 于 2013-6-26 21:44 编辑

1.如何决定创建索引的类型,你一般使用那种类型的索引?
    在创建索引的时候,需要根据应用的需要和应用系统的类型,oltp和olap考虑的是不一样的,B树索引是最常见的索引,可以适用于几乎所有场合,很多索引结构也都是B树结构。与之相对的位图索引是完全不同的存储结构。然后这两种索引有自己的适用场景。
用示例说明B-Tree索引性能优于BitMap索引.
键值重复率低的字段比较适合使用B 树索引,也就是说,如果一个字段中的数值的重复率越低,就越适合使用B 树索引。
首先我们来实验一下数据重复率非常低的表上,分别建立b-tree索引和位图索引的例子,看一下性能比较。
SQL> create table t as select * from dba_objects;

Table created.

SQL> desc t;
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
OWNER                                              VARCHAR2(30)
OBJECT_NAME                                        VARCHAR2(128)
SUBOBJECT_NAME                                     VARCHAR2(30)
OBJECT_ID                                          NUMBER
DATA_OBJECT_ID                                     NUMBER
OBJECT_TYPE                                        VARCHAR2(19)
CREATED                                            DATE
LAST_DDL_TIME                                      DATE
TIMESTAMP                                          VARCHAR2(19)
STATUS                                             VARCHAR2(7)
TEMPORARY                                          VARCHAR2(1)
GENERATED                                          VARCHAR2(1)
SECONDARY                                          VARCHAR2(1)
NAMESPACE                                          NUMBER
EDITION_NAME                                       VARCHAR2(30)

SQL> create index idx_object_id on t(object_id);

Index created.

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

PL/SQL procedure successfully completed.

SQL> create table t2 as select * from t;

Table created.

SQL> create bitmap index idx_bitmap on t2(object_id);

Index created.

Elapsed: 00:00:00.24
SQL> exec dbms_stats.gather_table_stats(user,'t2',cascade => true);
SQL> set autotrace traceonly
SQL> set timing on
SQL> select * from t where object_id=10;

Elapsed: 00:00:00.01

Execution Plan
----------------------------------------------------------
Plan hash value: 2041828949

--------------------------------------------------------------------------------
-------------

| Id  | Operation                   | Name          | Rows  | Bytes | Cost (%CPU
)| Time     |

--------------------------------------------------------------------------------
-------------

|   0 | SELECT STATEMENT            |               |     1 |    98 |     2   (0
)| 00:00:01 |

|   1 |  TABLE ACCESS BY INDEX ROWID| T             |     1 |    98 |     2   (0
)| 00:00:01 |

|*  2 |   INDEX RANGE SCAN          | IDX_OBJECT_ID |     1 |       |     1   (0
)| 00:00:01 |

--------------------------------------------------------------------------------
-------------


Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("OBJECT_ID"=10)


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          4  consistent gets
          0  physical reads
          0  redo size
       1620  bytes sent via SQL*Net to client
        523  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> set linesize 1000
SQL> /

Elapsed: 00:00:00.00

Execution Plan
----------------------------------------------------------
Plan hash value: 2041828949

---------------------------------------------------------------------------------------------
| Id  | Operation                   | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |               |     1 |    98 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T             |     1 |    98 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX_OBJECT_ID |     1 |       |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("OBJECT_ID"=10)


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          4  consistent gets
          0  physical reads
          0  redo size
       1620  bytes sent via SQL*Net to client
        523  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> select * from t2 where object_id=10;

Elapsed: 00:00:00.00

Execution Plan
----------------------------------------------------------
Plan hash value: 3397711522

-------------------------------------------------------------------------------------------
| Id  | Operation                    | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |            |     1 |    98 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID | T2         |     1 |    98 |     1   (0)| 00:00:01 |
|   2 |   BITMAP CONVERSION TO ROWIDS|            |       |       |            |          |
|*  3 |    BITMAP INDEX SINGLE VALUE | IDX_BITMAP |       |       |            |          |
-------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("OBJECT_ID"=10)


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          4  consistent gets
          0  physical reads
          0  redo size
       1620  bytes sent via SQL*Net to client
        523  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> /

Elapsed: 00:00:00.01

Execution Plan
----------------------------------------------------------
Plan hash value: 3397711522

-------------------------------------------------------------------------------------------
| Id  | Operation                    | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |            |     1 |    98 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID | T2         |     1 |    98 |     1   (0)| 00:00:01 |
|   2 |   BITMAP CONVERSION TO ROWIDS|            |       |       |            |          |
|*  3 |    BITMAP INDEX SINGLE VALUE | IDX_BITMAP |       |       |            |          |
-------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("OBJECT_ID"=10)


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          4  consistent gets
          0  physical reads
          0  redo size
       1620  bytes sent via SQL*Net to client
        523  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> select object_id from t where object_id=10;

Elapsed: 00:00:00.00

Execution Plan
----------------------------------------------------------
Plan hash value: 1276437228

----------------------------------------------------------------------------------
| Id  | Operation        | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |               |     1 |     5 |     1   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| IDX_OBJECT_ID |     1 |     5 |     1   (0)| 00:00:01 |
----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("OBJECT_ID"=10)


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          3  consistent gets
          0  physical reads
          0  redo size
        535  bytes sent via SQL*Net to client
        523  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> select object_id from t2 where object_id=10;

Elapsed: 00:00:00.00

Execution Plan
----------------------------------------------------------
Plan hash value: 1059387380

-------------------------------------------------------------------------------
| Id  | Operation        | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |            |     1 |     5 |     1   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| IDX_BITMAP |     1 |     5 |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("OBJECT_ID"=10)


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          3  consistent gets
          0  physical reads
          0  redo size
        535  bytes sent via SQL*Net to client
        523  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed




SQL> select object_id from t2 where object_id=10;

Elapsed: 00:00:00.00

Execution Plan
----------------------------------------------------------
Plan hash value: 3005354435

------------------------------------------------------------------------------------------
| Id  | Operation                   | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |            |     1 |     5 |     1   (0)| 00:00:01 |
|   1 |  BITMAP CONVERSION TO ROWIDS|            |     1 |     5 |     1   (0)| 00:00:01 |
|*  2 |   BITMAP INDEX SINGLE VALUE | IDX_BITMAP |       |       |            |          |
------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("OBJECT_ID"=10)


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          3  consistent gets
          0  physical reads
          0  redo size
        535  bytes sent via SQL*Net to client
        523  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed
可见在数据重复率非常低的情况下,两个索引差别不是很大。但是位图索引使用的范围非常有限,特别是对于一些OLTP 系统,位图索引是不适合的。
示例说明BitMap索引性能优于B-Tree索引.
位图索引的索引数据组织方式和B 树索引的方式完全不同,我们知道,在B 树索引中,每个索引键值中都存储了一个行号( ROWID),通过这个行号,就可以非常方便地找到表中对应的记录,就像书的目录一样。实际上,在每一个位图索引的键值中,都会存放指向很多行的指针,而不是一行。这样,位图索引存放的键值就会比B 树索引少得多。
在DBA_OBJECTS 中,字段object_type 重复率比较高,我们把这个字段作为创建位图索引的字段。在下面的例子中,我们将在几种查询中比较位图索引和B 树索引的性能情况。

SQL> conn change/change
Connected.
SQL> create table t1 as select * from dba_objects;

Table created.

SQL> insert into t1 select * from t1;

71897 rows created.

SQL> /

143794 rows created.

SQL> /

287588 rows created.

SQL> /

575176 rows created.

SQL> commit;

Commit complete.
在t1表object_type字段上创建位图索引
SQL> create bitmap index idx_t1_bitmap on t1(object_type);

Index created.

SQL> begin
  2  dbms_stats.gather_table_stats(user,'t1',cascade => true);
  3  end;
  4  /

PL/SQL procedure successfully completed.

建一张和t1相同的表t2,来进行比较;

SQL> create table t2 as select * from t1;
Table created.
在t2表字段object_type建b-tree索引
SQL> create index idx_t2 on t2(object_type);

Index created.

SQL> begin
  2  dbms_stats.gather_table_stats(user,'t2',cascade => true);
  3  end;
  4  /
PL/SQL procedure successfully completed.


SQL> select segment_name,bytes from user_segments where segment_type='INDEX';

SEGMENT_NAME
--------------------------------------------------------------------------------
     BYTES
----------
IDX_T1_BITMAP
    655360

IDX_T2
  27262976
SQL> col SEGMENT_NAME format a40
SQL> /

SEGMENT_NAME                                  BYTES
---------------------------------------- ----------
IDX_T1_BITMAP                                655360
IDX_T2                                     27262976

我们先来看一下这两种索引的大小比较,很显然,位图索引占用的空间(差不多655KB)要远小于B 树索引占用的空间(大约27MB)。
SQL> set autotrace traceonly
SQL> set timing on
SQL> select count(*) from t1 where object_type='TABLE';

Elapsed: 00:00:00.00

Execution Plan
----------------------------------------------------------
Plan hash value: 1434743110

---------------------------------------------------------------------------------------------
| Id  | Operation                   | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |               |     1 |     9 |     2   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE             |               |     1 |     9 |            |          |
|   2 |   BITMAP CONVERSION COUNT   |               | 26752 |   235K|     2   (0)| 00:00:01 |
|*  3 |    BITMAP INDEX SINGLE VALUE| IDX_T1_BITMAP |       |       |            |          |
---------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("OBJECT_TYPE"='TABLE')


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          6  consistent gets
          0  physical reads
          0  redo size
        536  bytes sent via SQL*Net to client
        523  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed
在创建有位图索引的表上以该字段作为条件进行count,从执行计划我们看到,Oracle 选择了使用位图索引进行数据访问;从统计信息可以看到,操作一共发生了6次一致性读。

SQL> select count(*) from t2 where object_type='TABLE' ;

Elapsed: 00:00:00.01

Execution Plan
----------------------------------------------------------
Plan hash value: 4191549303

----------------------------------------------------------------------------
| Id  | Operation         | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |        |     1 |     9 |    76   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE   |        |     1 |     9 |            |          |
|*  2 |   INDEX RANGE SCAN| IDX_T2 | 26752 |   235K|    76   (0)| 00:00:01 |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("OBJECT_TYPE"='TABLE')


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
        108  consistent gets
          1  physical reads
          0  redo size
        536  bytes sent via SQL*Net to client
        523  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed
而对于使用B 树索引的T2 表上相同的操作,却发生了108 次一致性读。由此可以看出,位图索引的效率要高于B 树索引。

SQL> select count(*) from t1 where object_type='TABLE' or object_type='INDEX';

Elapsed: 00:00:00.01

Execution Plan
----------------------------------------------------------
Plan hash value: 758362091

----------------------------------------------------------------------------------------------
| Id  | Operation                    | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |               |     1 |     9 |     4   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE              |               |     1 |     9 |            |          |
|   2 |   INLIST ITERATOR            |               |       |       |            |          |
|   3 |    BITMAP CONVERSION COUNT   |               | 53505 |   470K|     4   (0)| 00:00:01 |
|*  4 |     BITMAP INDEX SINGLE VALUE| IDX_T1_BITMAP |       |       |            |          |
----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("OBJECT_TYPE"='INDEX' OR "OBJECT_TYPE"='TABLE')


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
         12  consistent gets
          0  physical reads
          0  redo size
        536  bytes sent via SQL*Net to client
        523  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> select count(*) from t2 where object_type='TABLE' or object_type='INDEX';

Elapsed: 00:00:00.01

Execution Plan
----------------------------------------------------------
Plan hash value: 2423727260

-----------------------------------------------------------------------------
| Id  | Operation          | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |        |     1 |     9 |   149   (0)| 00:00:02 |
|   1 |  SORT AGGREGATE    |        |     1 |     9 |            |          |
|   2 |   INLIST ITERATOR  |        |       |       |            |          |
|*  3 |    INDEX RANGE SCAN| IDX_T2 | 53505 |   470K|   149   (0)| 00:00:02 |
-----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("OBJECT_TYPE"='INDEX' OR "OBJECT_TYPE"='TABLE')


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
        255  consistent gets
          0  physical reads
          0  redo size
        536  bytes sent via SQL*Net to client
        523  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed


上面的例子显示,位图索引对于重复数据上进行的AND、OR 操作,比B 树索引性能更优。这是由位图索引的数据访问方式来决定的。由于位图索引的每个键值中保存了该键值在那些记录中存在的信息,当Oracle 要对不同键值进行AND、OR 操作时,Oracle 只需通过对这些信息在各个行上的分布(实际上是对0、1 的位运算)进行计算,即可得出最终的结果。

SQL> select * from t1 where object_type='TABLE' ;

44688 rows selected.

Elapsed: 00:00:01.31

Execution Plan
----------------------------------------------------------
Plan hash value: 1126381833

----------------------------------------------------------------------------------------------
| Id  | Operation                    | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |               | 26752 |  2560K|  3293   (1)| 00:00:40 |
|   1 |  TABLE ACCESS BY INDEX ROWID | T1            | 26752 |  2560K|  3293   (1)| 00:00:40 |
|   2 |   BITMAP CONVERSION TO ROWIDS|               |       |       |            |          |
|*  3 |    BITMAP INDEX SINGLE VALUE | IDX_T1_BITMAP |       |       |            |          |
----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("OBJECT_TYPE"='TABLE')


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
       6559  consistent gets
          0  physical reads
          0  redo size
    4947345  bytes sent via SQL*Net to client
      33292  bytes received via SQL*Net from client
       2981  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      44688  rows processed

SQL>

SQL> select * from t2 where object_type='TABLE' ;

44688 rows selected.

Elapsed: 00:00:01.34

Execution Plan
----------------------------------------------------------
Plan hash value: 2008370210

--------------------------------------------------------------------------------------
| Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |        | 26752 |  2560K|  1505   (1)| 00:00:19 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T2     | 26752 |  2560K|  1505   (1)| 00:00:19 |
|*  2 |   INDEX RANGE SCAN          | IDX_T2 | 26752 |       |    76   (0)| 00:00:01 |
--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("OBJECT_TYPE"='TABLE')


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
      10174  consistent gets
          0  physical reads
          0  redo size
    4947345  bytes sent via SQL*Net to client
      33292  bytes received via SQL*Net from client
       2981  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      44688  rows processed

在上面查询中,位图索引扫描的一致性比普通索引的逻辑读要小很多。性能要好一些。

2.Oracle索引技术之如何建立最佳索引
首先是一切服从应用需要,不是索引越多越好,不使用的索引会额外增加DML的成本。尽可能的一个索引能够为更多的sql服务,在通常情况下设计复合索引是比较高效的。位图索引和B树索引有不同的使用场合,要根据实际情况选择适当的索引。在系统中尽可能的合并类似的索引。

使用道具 举报

回复
论坛徽章:
65
林肯
日期:2013-09-12 15:57:33马自达
日期:2013-10-11 13:52:31路虎
日期:2014-01-26 14:35:49三菱
日期:2013-11-25 11:21:19现代
日期:2013-08-29 14:39:50雪佛兰
日期:2013-09-12 15:55:00一汽
日期:2013-11-28 14:15:05技术图书徽章
日期:2013-12-11 10:10:51技术图书徽章
日期:2013-12-11 10:11:35技术图书徽章
日期:2014-01-14 10:54:13
发表于 2013-6-25 11:06 | 显示全部楼层
本帖最后由 pastime_Wang 于 2013-6-26 16:07 编辑

占位,更新!

1.如何决定创建索引的类型,你一般使用那种类型的索引 ?
RE:
常用到的索引: B* 索引、唯一性索引 UI、主键 PK ( Unique Index + Not Null Constraint )、函数索引、位图索引、分区索引(本地和全局)

索引的类型应根据索引本身的属性来具体问题具体分析, 有的放矢, 主要参考:
1、数据库设计表确定的索引,如 PK \ FK
2、从 "可使用索引的谓词 Indexable predicates " 中选定候选索引键

/*******************************************************************/
2.Oracle索引技术之如何建立最佳索引 ?
RE:
1、了解业务系统架构, 熟悉业务系统数据库设计 ;
2、Oracle 优化器大部分情况下采用 CBO, 应定期对表进行分析和采样, 保持其上的统计、直方图等信息与实际一致 ;
3、谓词条件相对固定, 优先考虑创建针对多字段的复合索引, 复合索引设计原则:
   3.1 前缀性 (Prefixing) 索引值存储 按照字段 "从左向右" 顺序存储
   3.2 可选择性 (Selectivity) 基数高的放在最前面
   
4、谓词条件涉及的字段不固定,组合灵活,最好对字段单独创建索引
5、GROUP BY、ORDER BY 从句中的列加入索引, 可以减少访问计划中的排序操作
6、谓词中的函数表达式不能使用索引,应在SQL中避免谓词的函数操作, 否则需建立 "函数索引"
7、多表连接, 连接列根据连接类型(NL \ MERGE \ HASH) 创建相关索引
如 Nest Loop, 内表的扫描次数取决于外表的返回纪录数, 所以内表的连接字段需要建立索引

/*******************************************************************/
此外:
1、应对索引进行监控和维护,发现多余或未被使用的索引
2、可以采用 如 db2 中的"虚拟索引(Virtual index) " 的机制, 来验证创建的索引,
2、建立索引会降低 表上 DML 操作的速度, 增加索引的维护, 导致索引碎片, 增加索引 I/O 的开销,创建索引要适度


使用道具 举报

回复
论坛徽章:
9
蛋疼蛋
日期:2011-10-18 11:00:17ITPUB十周年纪念徽章
日期:2011-11-01 16:25:51蜘蛛蛋
日期:2011-11-09 13:48:06迷宫蛋
日期:2011-11-24 10:38:342012新春纪念徽章
日期:2012-01-04 11:56:44蜘蛛蛋
日期:2013-07-12 21:52:36凯迪拉克
日期:2013-12-12 09:53:072014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08
发表于 2013-6-25 11:06 | 显示全部楼层
你们慢慢析 我坐板凳观望!

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
9
ITPUB社区千里马徽章
日期:2013-06-09 10:15:34奥迪
日期:2013-10-12 15:10:47优秀写手
日期:2014-03-19 06:00:25马上有车
日期:2014-03-20 16:13:24马上有房
日期:2014-03-20 16:14:11马上有钱
日期:2014-03-20 16:14:11马上有对象
日期:2014-03-20 16:14:11马上加薪
日期:2014-03-20 16:14:11问答徽章
日期:2014-03-26 10:07:34
发表于 2013-6-25 12:14 | 显示全部楼层
1.如何决定创建索引的类型,你一般使用那种类型的索引?
  暂时就是按照书上的照搬,一般都是B索引,最多再用用用BitMAP。创建完后在开启检测跟踪索引,一个程序周期后看看结果,不起作用就删了。我大概就是这么做的。

2.Oracle索引技术之如何建立最佳索引?
  这个我也很想知道,坐等大牛解答

使用道具 举报

回复
论坛徽章:
10000
地主之星
日期:2015-07-20 17:15:36地主之星
日期:2015-09-01 14:14:25地主之星
日期:2015-09-01 17:59:09地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58
发表于 2013-6-25 12:29 | 显示全部楼层
书不错
占位

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
41
喜羊羊
日期:2015-05-08 16:18:362014年新春福章
日期:2014-02-18 16:48:49技术图书徽章
日期:2014-01-26 14:02:05福特
日期:2013-12-27 00:16:54劳斯莱斯
日期:2013-12-20 16:46:55劳斯莱斯
日期:2013-12-02 16:08:54问答徽章
日期:2013-11-12 20:51:23奔驰
日期:2013-10-25 20:19:39ITPUB社区12周年站庆徽章
日期:2013-10-08 15:00:34马上加薪
日期:2014-02-18 16:48:49
发表于 2013-6-25 13:17 | 显示全部楼层
支持         

使用道具 举报

回复
求职 : 技术/实施/服务顾问
论坛徽章:
5
授权会员
日期:2006-11-18 08:50:312013年新春福章
日期:2013-02-25 14:51:24ITPUB元老
日期:2013-03-01 14:33:22ITPUB社区千里马徽章
日期:2013-06-09 10:15:34奥运纪念徽章
日期:2013-06-18 09:13:52
发表于 2013-6-25 13:42 | 显示全部楼层
1.根据SQL谓词条件建立索引.一般用得最多的是B-tree索引和位图索引。
2.一般根据应用SQL选择合适的索引,当字段唯一值可选性高的情况下选择B-tree索引,重复值多选择位图索引。索引的建立有利有弊,根据业务,以及数据量来判断。我觉得如何建立最佳索引,这没有绝对,主要是看个人经验和对业务的理解程度。

使用道具 举报

回复
认证徽章
论坛徽章:
184
2013年新春福章
日期:2013-05-27 10:23:002013年新春福章
日期:2013-05-27 10:23:002013年新春福章
日期:2013-06-05 15:29:212013年新春福章
日期:2013-06-05 15:29:212013年新春福章
日期:2013-05-27 10:23:002013年新春福章
日期:2013-06-05 15:29:21马上有房
日期:2014-03-03 16:14:44马上有对象
日期:2014-02-18 16:44:082014年新春福章
日期:2014-03-04 16:55:19ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42
发表于 2013-6-25 14:11 | 显示全部楼层
支持   

使用道具 举报

回复
认证徽章
论坛徽章:
764
2014年世界杯参赛球队: 加纳
日期:2014-05-20 17:24:592014年世界杯参赛球队:墨西哥
日期:2014-05-20 17:25:142014年世界杯参赛球队: 波黑
日期:2014-05-20 17:27:292014年世界杯参赛球队: 希腊
日期:2014-07-15 11:05:212014年世界杯参赛球队: 阿尔及利亚
日期:2014-07-15 11:05:212014年世界杯参赛球队: 厄瓜多尔
日期:2014-07-15 14:14:452014年世界杯参赛球队: 哥斯达黎加
日期:2014-06-16 15:29:332014年世界杯参赛球队: 智利
日期:2014-06-16 17:03:11 2014年世界杯参赛球队: 德国
日期:2014-06-16 17:10:512014年世界杯参赛球队: 葡萄牙
日期:2014-06-18 09:28:47
发表于 2013-6-25 15:15 | 显示全部楼层
占位,更新!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表