`
1enny
  • 浏览: 70591 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

索引

 
阅读更多
oracle213

索引

q索引是与表相关的一个可选结构
q用以提高 SQL 语句执行的性能
q减少磁盘I/O
q使用 CREATE INDEX 语句创建索引
q在逻辑上和物理上都独立于表的数据
qOracle 自动维护索引
q索引分为:B树索引(平衡树索引)、位图索引(数据仓库中用的多)。
qB树索引分为:唯一索引、组合索引、反向键索引、基于函数的索引
qanalyze index <index_name> validate structure;

查看index_stats表中的pct_used列的值,如果pct_used的值过低,说明在索引中存在碎片,
可以重建索引,来提高pct_used的值,减少索引中的碎片。
索引 碎片的产生:由于索引建立以后对数据进行了DML了,那么就会让索引块找不到对应的数据块;这样索引块中就存在无效的索引这样就产生了碎片
司 索引重建:1. 删除后重新建立 2. rebuild
SQL> begin
2 for i in 1.. 1300000 loop
3 insert into test_index values(ltrim( to_char(i ,'00000009')));
4 if mod (i,100) = 0 then
5 commit;
6 end if;
7 end loop;
8 end;
9 /
SQL>
PL/SQL procedure successfully completed

SQL> commit;
Commit complete

SQL>create index index_test on test_index(id);
Index created
SQL> select * from user_indexes ui where ui.INDEX_NAME='INDEX_TEST';
INDEX_NAME INDEX_TYPE TABLE_OWNER TABLE_NAME
------------------------------ --------------------------- --------------------
INDEX_TEST NORMAL HR TEST_INDEX
SQL> select * from user_ind_columns uic where uic.INDEX_NAME='INDEX_TEST';
INDEX_NAME TABLE_NAME COLUMN_NAME COLUMN_POSITION COLUMN_LENGTH CHAR_LENGTH DESCEND
------------------------------ ------------------------------ -------------------------------------------------------------------------------- --------------- ------------- ----------- -------
INDEX_TEST TEST_INDEX ID 1 10 10 ASC

SQL>analyze index index_test validate structure;//分析索引
Index analyzed

SQL> select is_.name, is_.pct_used fromindex_statsis_ where is_.name='INDEX_TEST';
NAME PCT_USED
------------------------------ ----------
INDEX_TEST 90

SQL>
SQL> delete from test_index where rownum < 500000;
499999 rows deleted

SQL> commit;
Commit complete

SQL> analyze index index_test validate structure;
Index analyzed

SQL> select is_.name, is_.pct_used from index_stats is_ where is_.name='INDEX_TEST';
NAME PCT_USED
------------------------------ ----------
INDEX_TEST 69

SQL>alter index index_test rebuild;//重建索引
Index altered

SQL> analyze index index_test validate structure;
Index analyzed

SQL> select is_.name, is_.pct_used from index_stats is_ where is_.name='INDEX_TEST';
NAME PCT_USED
------------------------------ ----------
INDEX_TEST 90

SQL>

唯一索引:
唯一索引确保在定义索引的列中没有重复值
Oracle 自动在表的主键列上创建唯一索引
使用CREATE UNIQUE INDEX语句创建唯一索引

SQL> CREATE UNIQUE INDEX item_index

ON itemfile (itemcode);



组合索引:
q组合索引是在表的多个列上创建的索引
q索引中列的顺序是任意的
q如果 SQL 语句的 WHERE 子句中引用了组合索引的所有列或大多数列,则可以提高检索速度

SQL> CREATE INDEX comp_index

ON itemfile(p_category, itemrate);


反向键索引:
q反向键索引反转索引列键值的每个字节
q通常建立在值是连续增长的列上,使数据均匀地分布在整个索引上
比如学号是1001,1002,1003,1004——>1001,2001,3001,4001这样的形式存在于索引块中。
q创建索引时使用REVERSE关键字

SQL> CREATE INDEX rev_index

ON itemfile (itemcode) REVERSE;

SQL> ALTER INDEX rev_index REBUID NOREVERSE;

位图索引:
q位图索引适合创建在低基数列(即使条目非常多但是情况非常少:男、女 这样的数据)
q位图索引不直接存储ROWID值,而是存储字节位到ROWID的映射
q节省空间占用
q如果索引列被经常更新的话,不适合建立位图索引
q总体来说,位图索引适合于数据仓库中,不适合OLTP中

SQL> CREATE BITMAP INDEX bit_index

ON order_master (orderno);


基于函数的索引:
q基于一个或多个列上的函数或表达式创建的索引
q表达式中不能出现聚合函数
q不能在LOB类型的列上创建
q创建时必须具有 QUERY REWRITE 权限
SQL> CREATE INDEXlowercase_idxON toys (LOWER(toyname));
SQL> SELECTtoyid FROM toyWHERELOWER(toyname)='doll';
这样上面的查询就会变快了,索引是在列的小写函数上建立的;查询快不快关键在于where的过滤好不好


重建索引:
qALTER INDEXindex_nameREBUILD [ONLINE] [NOLOGGING] [COMPUTE STATISTICS];

其中:ONLINE使得在重建索引过程中,用户可用对原来的索引进行修改;

NOLOGGING表示在重建过程中产生最少的重做条目redoEntry

COMPUTE STATISTICS表示在重建过程中就生成了oracle
优化器所需的统计信息,避免了索引重建之后再进行analyzedbms_stats来收集统计信息。

索引的分区:
q可以将索引存储在不同的分区中
q与分区有关的索引有三种类型:
q局部分区索引 - 在分区表上创建的索引,在每个表分区上创建独立的索引,索引的分区范围与表一致
  • SQL> create table test_partition (
    2 id number(20),name varchar2(20),account number(20)) partition by range(account)(
    3 partition part01 values less than (100),
    4 partition part02 values less than (200),
    5 partition part03 values less than(maxvalue));
    Table created

    SQL> create index test_partition_index on test_partition(account) local;
    Index created

    SQL> select ui.INDEX_NAME,ui.index_type,ui.PARTITIONED from user_indexes ui where ui.INDEX_NAME='TEST_PARTITION_INDEX';
    INDEX_NAME INDEX_TYPE PARTITIONED
    ------------------------------ --------------------------- -----------
    TEST_PARTITION_INDEX NORMAL YES

    SQL> select uip.index_name,uip.partition_name,uip.high_value from user_ind_partitions uip where uip.index_name='TEST_PARTITION_INDEX';
    INDEX_NAME PARTITION_NAME HIGH_VALUE
    ------------------------------ ------------------------------ --------------------------------------------------------------------------------
    TEST_PARTITION_INDEX PART01 100
    TEST_PARTITION_INDEX PART02 200
    TEST_PARTITION_INDEX PART03 MAXVALUE

    SQL> select utp.table_name,utp.partition_name,utp.high_value from user_tab_partitions utp where utp.table_name='TEST_PARTITION';
    TABLE_NAME PARTITION_NAME HIGH_VALUE
    ------------------------------ ------------------------------ --------------------------------------------------------------------------------
    TEST_PARTITION PART01 100
    TEST_PARTITION PART02 200
    TEST_PARTITION PART03 MAXVALUE

    SQL>

q全局分区索引 - 在分区表或非分区表上创建的索引,索引单独指定分区的范围,与表的分区范围或是否分区无关
  • SQL> create index index_partition_global on test_partition(account) global;
    create index index_partition_global on test_partition(account) global
    ORA-01408: 此列列表已索引

    SQL> drop index test_partition_index ;
    Index dropped

    SQL> create index index_partition_global on test_partition(account) global partition by range(account) (
    2 partition part1 values less than (200),
    3 partition part2 values less than(maxvalue));
    Index created

    SQL> select uip.index_name,uip.partition_name,uip.high_value from user_ind_partitions uip where uip.index_name='INDEX_PARTITION_GLOBAL';
    INDEX_NAME PARTITION_NAME HIGH_VALUE
    ------------------------------ ------------------------------ --------------------------------------------------------------------------------
    INDEX_PARTITION_GLOBAL PART1 200
    INDEX_PARTITION_GLOBAL PART2 MAXVALUE

    SQL>

q全局非分区索引 - 在分区表上创建的全局普通索引,索引没有被分区
  • SQL> create index index_partition_global on test_partition(account) global;
    Index created

    SQL> select ui.INDEX_NAME,ui.index_type,ui.PARTITIONED from user_indexes ui where ui.INDEX_NAME='INDEX_PARTITION_GLOBAL';
    INDEX_NAME INDEX_TYPE PARTITIONED
    ------------------------------ --------------------------- -----------
    INDEX_PARTITION_GLOBAL NORMAL NO

    SQL>



获取索引信息:
q与索引有关的数据字典视图有:
qUSER_INDEXES - 用户创建的索引的信息
qUSER_IND_PARTITIONS - 用户创建的分区索引的信息
qUSER_IND_COLUMNS - 与索引相关的表列的信息

SQL> SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME

FROM USER_IND_COLUMNS

ORDER BY INDEX_NAME, COLUMN_POSITION;



分享到:
评论

相关推荐

    ORACLE重建索引总结

    4、索引高度:索引高度是指由于数据行的插入操作而产生的索引层数,当表中添加大量数据时,oracle将生成索引的新层次以适应加入的数据行,因此,oracle索引可能有4层,但是这只会出现在索引数中产生大量插入操作的...

    分区索引,本地索引,全局索引的区别

    oracle 分区索引,本地索引,全局索引的区别

    倒排索引处理文档

    倒排索引(英语:Inverted index),也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。 ...

    python基础教程:pandas DataFrame 行列索引及值的获取的方法

    pandas DataFrame是二维的,所以,它既有列索引,又有行索引 上一篇里只介绍了列索引: import pandas as pd df = pd.DataFrame({'A': [0, 1, 2], 'B': [3, 4, 5]}) print df # 结果: A B 0 0 3 1 1 4 2 2 5 行索引...

    MySQL数据库:创建索引.pptx

    创建索引 数据索引 课程目标 理解 —— 创建索引的语法; 掌握 —— 在已有表上创建索引的方法; 掌握 —— 在修改表时添加索引的方法; 掌握 —— 在创建表时创建索引的方法。 创建索引 使用CREATE INDEX语句创建...

    索引介绍聚集索引和非聚集索引

    关于索引的介绍,以及b+树结构图,两种索引性能比较,索引优化建议

    Python DataFrame 设置输出不显示index(索引)值的方法

    在输出代码行中,加入“index=False”... 您可能感兴趣的文章:Python将DataFrame的某一列作为index的方法pandas将DataFrame的列变成行索引的方法python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)Py

    hbase创建二级索引

    public class IndexBuilder3 extends Configured{ public static class MapperIndex extends TableMapper,Put&gt;{ private String tableName; private String columnFamily;...// 该列对应的索引表名字

    简单例子理解主键,索引,聚集索引,复合索引,非聚合索引

    一、 创建主键(主键=主键索引=聚集索引) 主键是什么? 答:拿主键可以唯一确定一条数据,它和物理存储排序一致,不能为空,一个表只能有一个。 原本没有创建的主键的表在磁盘上存储为: Id=0;username=username0;sex...

    SQL Server 索引结构及其使用(聚集索引与非聚集索引)

    SQL Server 索引结构及其使用(聚集索引和非聚集索引)的区别与实例讲解,提高查询速度。

    XML数据索引技术

    对XML数据建立有效的索引,是左右XML数据处理性能的重要因素.深入地讨论了目前XML索引 技术的研究现状,将XML索引技术分为两大类:节点记录类索引(本身还可以分为3个小的类型)和结构摘要类 索引.根据XML数据查询...

    基于给定的文档生成倒排索引的全部源码

    本系统源码是个人原创文章系列,程序员编程艺术第二十六章:基于给定的文档生成倒排索引的编码与实践的整个工程源码 look:http://blog.csdn.net/v_july_v/article/details/7109500 windows下VS2010,linux环境下皆...

    数据库 索引及优化

    数据库 索引 优化 数据库索引好比是一本书前面的目录,能加快数据库的查询速度。 例如这样一个查询:select * from table1 where id=44。如果没有索引,必须遍历整个表,直到ID等于44的这一行被找到为止;有了索引...

    MySQL 主键与索引的联系与区别分析

    索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。下面是主键和索引的一些区别与联系。 1. 主键一定是唯一性索引,唯一性索引并不一定就是主键。 所谓...

    SQL Server中用索引视图查看性能状况

    索引视图是一个已被物化或保存在数据库中的视图。当基本表更新时,给视图建立的索引由数据库引擎保存和更新。当你的结果集返回许多行并且需要求总数时,索引视图十分有用。这是因为数据库引擎必须在基表数据更新时...

    Mysql数据库索引创建、索引删除、索引失效场景详解

    在关系数据库中,索引是一种单独对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。 索引的作用相当于图书的目录,可以...

    数据库 创建索引 sql oracle

    1.索引的创建与使用 2.创建索引的原则 3.索引的分类 4.创建索引的多种方法 5.管理索引 6.索引优化 7.查看、修改索引属性 8.修改索引名 9.删除索引

    数据库索引,到底是什么

    • 数据库索引用于加速查询 • 虽然哈希索引是O(1),树索引是O(log(n)),但SQL有很多“有序”需求,故数据库使用树型索引 • InnoDB不支持哈希索引 • 数据预读的思路是:磁盘读写并不是按需读取,而是按页预读,一...

    倒排索引引擎

    数据库索引

    MySQL Innodb 索引原理详解

    MySQL Innodb 索引原理详解

Global site tag (gtag.js) - Google Analytics