ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 建立索引和使用索引需要注意的问题.

建立索引和使用索引需要注意的问题.

原创 Linux操作系统 作者:beyond_sea 时间:2009-07-16 23:30:06 0 删除 编辑

1、索引不要与表存放在同一个表空间内;

2、一个表的索引不要过多;


3、对于大表而且使用频繁的表,在生产时最好不要去加索引;
如果对大表进行索引,取出的数据大于总量的5%至10%,使用索引扫描会效率下降很多。如果通过索引,取出数据量为总量的50%以上,这个时候还不如全表扫描来得快。

4、数据量小的表,使用不频繁的不要单独另建立索引;


5、在查询条件中几个条件一起使用的,适合建立组合索引,否则不要建立组合索引,当单独引用非第一字段时将发生全表扫描;
  在Oracle9i之前,只有在使用到索引的前导索引时才可以使用组合索引


6,在查询的时候,where条件不要对索引的列做处理,而要对后面的条件字段做处理。否则用不上这个列上的索引。

如: score_date 是varchar2类型,该列上有索引。

select
......
where trim(replace(s.SCORE_DATE, '-', '')) <= '20071201'  
......

上面这条sql用不上score_date列上的索引。
下面这条sql就能用上索引。

select
......
where SCORE_DATE <= '20071201'
......

如果不是基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。
         下面的查询不会使用索引(只要它不是基于函数的索引)
          select empno,ename,deptno
          from   emp
          where  trunc(hiredate)='01-MAY-81';
          把上面的语句改成下面的语句,这样就可以通过索引进行查找。
          select empno,ename,deptno
          from   emp
          where  hiredate<(to_date('01-MAY-81')+0.9999);

 

6.1: 表的某个字段是字符型的, 那么传入数字值不加引号的话,sql不走索引:

例子:
docset表的todocid字段新建了索引,但是这个sql就是不走索引,加hint也没有用.  


select /*+INDEX(docset IX_DOCSET_TODOCID)*/ *
  from docset
 WHERE REPLYSENDFLAG = 1
   and TODOCID in (141429, 141441);
执行计划如下:
SELECT STATEMENT, GOAL = ALL_ROWS   Cost=1592 Cardinality=2 Bytes=650
 TABLE ACCESS FULL Object wner=SEALDATA Object name=DOCSET Cost=1592 Cardinality=2 Bytes=650

后来发现, todocid这个字段是VARCHAR2(20)类型的, 不是number, 所以传入的值是数字的时候,要加引号,才能走索引, 否则要使用函数索引才能有效.
  
select /*+INDEX(docset IX_DOCSET_TODOCID)*/ *
  from docset
 WHERE REPLYSENDFLAG = 1
   and TODOCID in ('141429', '141441');
执行计划如下:
SELECT STATEMENT, GOAL = ALL_ROWS   Cost=1 Cardinality=2 Bytes=650
 INLIST ITERATOR     
  TABLE ACCESS BY INDEX ROWID Object wner=SEALDATA Object name=DOCSET Cost=1 Cardinality=2 Bytes=650
   INDEX RANGE SCAN Object wner=SEALDATA Object name=IX_DOCSET_TODOCID Cost=1 Cardinality=2 

 

 


7,关于位图索引。
怎样使用位图索引?注意点是什么?语句怎样写呢:        dba_indexes index_type

OLTP不能使用位图索引,这应该是谨记的!
create bitmap index t_index1 on TEST_ZHP (c1);
当列上的值类型比较少时,适合使用位图索引


olap:online analysis processing 联机分析处理, 适用于dss(decision support system决策支持系统,也就是人们常说的数据仓库系统)
主要面向分析,一般基于数据仓库,数据主要为只读方式,涉及海量查询,select,主要处理历史数据,出报表等。
olap是联机分析处理,它所擅长的是对企业的当前和历史数据进行分析,对企业的状况进行分析,主要是针对企业管理人员


位图索引是oracle的比较引人注目的地方,其主要用在olap(联机数据分析)方面,也就是数据仓库。
位图索引在实际密集型OLTP(数据事务处理)中用得比较少,因为OLTP会对表进行大量的删除、修改 ,建议使用B-tree索引


oltp :online transaction processing  联机事务处理  适用于mis ,网站等小事务的交易系统!
主要面向事务处理,一般为单行或几行操作。update , 写密集型
它所擅长的就是处理当前实时的数据,最新的业务数据,实现企业业务的计算机化,主要针对企业的业务人员

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7532565/viewspace-609386/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-07-05

  • 博文量
    18
  • 访问量
    54167