Decode360's Blog

业精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

  BlogJava :: 首页 :: 新随笔 :: 联系 ::  :: 管理 ::
  397 随笔 :: 33 文章 :: 29 评论 :: 0 Trackbacks
索引的相关知识 ①.创建准则
 
    今天学习索引的知识。所谓索引,恩,这个可以再我以前的文章《索引的概念及创建》看到,多的也不说了,反正是看着教材,再重新学习一遍。这里介绍的索引的内容还是比较详细的,一些很细小的东西都讲到了,可以增进对索引的理解。
 
一、管理准则
 
    Oracle的索引可以更快的定位信息,提供访问表的数据的更快路径。索引的种类有:
 
    ● B-Tree索引:默认的最常用索引
    ● B-Tree簇索引:特意为簇定义的索引
    ● 散列值索引:特意为散列簇定义的索引
    ● 全局和局部索引:相应于分区表的索引
    ● 逆转值索引:特别适用于Oracle真实应用簇的应用
    ● 位图索引:紧凑的,特别适用于少量值集的列
    ● 基于函数的索引:包含函数/表达式的预先计算的值
    ● 域索引:特别针对应用或插件
 
    索引的管理准则包括:
 
    ① 在表中插入数据后创建索引
 
    ② 索引正确的表和列
 
    * 如需经常检索大表中少于15%的行,则创建索引(百分比值与扫描速度有关)
    * 改善多个表联结性能创建索引。特别是外键需要创建索引。
    * 小表不需要索引
    * 列中的值比较唯一适合创建所以
    * 取值范围大(适合作常规索引)
    * 取值范围小(适合作位图索引)
    * 列中有许多空值,但经常查询所有具有值的行适合创建索引
    * 列中有许多空值,但又不查询非空值适合创建索引
    注:查询非空值,用 WHERE COL > -9.99 * power(10,125) 效果要比 WHERE COL IS NOT NULL 好,因为可以使用索引。
 
    ③ 调整索引列位置( 常用列放在最前面)
 
    ④ 限制每个表的索引数量
 
    ⑤ 删除不需要的索引(重建索引前必须先删除索引)
 
    ⑥ 指定索引数据块空间使用
 
    ⑦ 估计索引大小,设置存储参数
 
    ⑧ 为每个索引指定表空间
 
    ⑨ 考虑并行创建索引
 
    ⑩ 考虑用NOLOGGING创建索引
 
    ⑾ 考虑合并或重建索引时的损益
 
    ⑿ 停用或删除约束之前考虑开销
 
 
二、创建索引
 
1、明确地创建索引
 
    CREATE INDEX emp_ename ON emp(ename)
    TABLESPACE users
    STORAGE (INITIAL 20K
    NEXT 20K
    PCTINCREASE 75)
    PCTFREE 0;
 
    注:索引创建时不能指定PCTUSED参数。
 
2、明确得创建唯一索引
 
    唯一索引可以保证键列上表不会有两行重复的值。
 
    CREATE UNIQUE INDEX dept_unique_index ON dept(dname)
    TABLESPACE indx;
 
3、创建与约束相关的索引
 
    在创建UNIQUE KEY或PRIMARY KEY时,会自动创建一个唯一索引,以确保数据的完整性。在使用CREATE TABLE或ALTER TABLE时不需要用户进行操作,但是用户可以使用USING INDEX子句来对创建实施控制。
 
    CREATE TABLE emp (
    empno NUMBER(5) PRIMARY KEY,
    age INTEGER)
    ENABLE PRIMARY KEY USING INDEX
    TABLESPACE users
    PCTFREE 0;
 
    当要对UNIQUE和PRIMARY KEY约束相关索引进行更明确的控制时:
 
    例1:
    CREATE TABLE a (
    a1 INT PRIMARY KEY USING INDEX (create index ai on a(a1)));
 
    例2:
    CREATE TABLE b (
    b1 INT,
    b2 INT,
    CONSTRAINT bu1 UNIQUE (b1,b2)
    USING INDEX (create unique index bi on b(b1,b2)),
    CONSTRAINT bu2 UNIQUE (b2,b1) USING INDEX bi);
 
    例3:
    CREATE TABLE c(c1 INT, c2 INT);
    CREATE INDEX ci ON c(c1,c2);
    ALTER TABLE c ADD CONSTRAINT cpk PRIMARY KEY (c1) USING INDEX ci;
 
4、采集创建索引时伴随的统计数据
 
    CREATE INDEX emp_ename ON emp(ename)
    COMPUTE STATISTICS;
 
5、创建大索引
 
    ① 创建一个新的临时表空间
    ② 将用户默认临时表空间设置为新建的表空间
    ③ 创建索引
    ④ 删除表空间,并将用户的临时表空间更改过来
 
6、联机创建索引
 
    可以用联机创建索引的办法,使得创建时仍可更改基础表
 
    CREATE INDEX emp_name ON emp (mgr,emp1,emp2,emp3) ONLINE;
 
    注:可是使用DML,但不能使用DDL,而且不支持并行执行。
 
7、创建基于函数的索引
 
    特点:
    ● 创建更强有力的分类
    ● 预先计算出计算密集的函数值,并在索引中分类
    ● 则加优化器执行范围扫描而不是全表扫描的数量
    ● 真正的降序索引成为可能
    ● 在对象列和REF列上创建索引
 
    注:在创建基于函数的索引之后,必须ANALYZE分析表。
 
    CREATE INDEX empi ON emp
    UPPER((ename),NLSSORT(ename));
 
8、创建键压缩索引
 
    CREATE INDEX emp_name ON emp(ename)
    TABLESPACE users
    COMPRESS 1;
 
    可以使用以下语句停用压缩:
    ALTER INDEX emp_ename REBUILD NOCOMPRESS;
 
 
 
 
 
posted on 2009-02-13 21:04 decode360 阅读(157) 评论(0)  编辑  收藏 所属分类: 08.DBA

只有注册用户登录后才能发表评论。


网站导航: