关于对oracle数据库锁表创建索引总结

合集下载

oracle 索引

oracle 索引

Oracle Index 各类索引介绍及创建方法[转]概述索引在各种关系型数据库系统中都是举足轻重的组成部分,其对于提高检索数据的速度起至关重要的作用。

在Oracle中,索引基本分为以下几种:B*Tree索引,反向索引,降序索引,位图索引,函数索引,interMedia全文索引等。

Oracle提供了大量索引选项。

知道在给定条件下使用哪个选项对于一个应用程序的性能来说非常重要。

一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程终止。

而如果做出正确的选择,则可以合理使用资源,使那些已经运行了几个小时甚至几天的进程在几分钟得以完成,这样会使您立刻成为一位英雄。

这篇文章就将简单的讨论每个索引选项。

主要有以下内容:[1] 基本的索引概念查询DBA_INDEXES视图可得到表中所有索引的列表,注意只能通过USER_INDEXES的方法来检索模式(schema)的索引。

访问USER_IND_COLUMNS视图可得到一个给定表中被索引的特定列。

[2] 组合索引当某个索引包含有多个已索引的列时,称这个索引为组合(concatented)索引。

在Oracle9i 引入跳跃式扫描的索引访问方法之前,查询只能在有限条件下使用该索引。

比如:表emp 有一个组合索引键,该索引包含了empno、ename和deptno。

在Oracle9i之前除非在where 之句中对第一列(empno)指定一个值,否则就不能使用这个索引键进行一次范围扫描。

特别注意:在Oracle9i之前,只有在使用到索引的前导索引时才可以使用组合索引![3] ORACLE ROWID通过每个行的ROWID,索引Oracle提供了访问单行数据的能力。

ROWID其实就是直接指向单独行的线路图。

如果想检查重复值或是其他对ROWID本身的引用,可以在任何表中使用和指定rowid列。

[4] 限制索引限制索引是一些没有经验的开发人员经常犯的错误之一。

在SQL中有很多陷阱会使一些索引无法使用。

oracle数据库创建索引例子

oracle数据库创建索引例子

oracle数据库创建索引例子Oracle数据库创建索引例子在Oracle数据库中,创建索引是优化查询性能的重要手段之一。

下面列举了一些创建索引的例子,并进行详细的讲解。

创建简单索引的例子1.创建唯一索引–语法:CREATE UNIQUE INDEX index_name ON table_name(column_name);–示例:创建一个名为idx_unique_id的唯一索引,索引字段为id,索引表为employees。

CREATE UNIQUE INDEX idx_unique_id ON employees(id);–说明:唯一索引保证了索引字段的值是唯一的,用于字段中不能存在重复值的情况。

2.创建普通索引–语法:CREATE INDEX index_name ONtable_name(column_name);–示例:创建一个名为idx_lastname的普通索引,索引字段为last_name,索引表为employees。

CREATE INDEX idx_lastname ON employee s(last_name);–说明:普通索引可以加快查询速度,适用于频繁查询的字段。

创建复合索引的例子3.创建复合唯一索引–语法:CREATE UNIQUE INDEX index_name ON table_name(column1, column2);–示例:创建一个名为idx_unique_name_dept 的复合唯一索引,索引字段为name和dept_id,索引表为employees。

CREATE UNIQUE INDEX idx_unique_name_d ept ON employees(name, dept_id);–说明:复合唯一索引是基于多个字段的唯一索引,可以保证多个字段组合的值是唯一的。

4.创建复合普通索引–语法:CREATE INDEX index_name ON table_name(column1, column2);–示例:创建一个名为idx_firstname_lastname的复合普通索引,索引字段为first_name和last_name,索引表为employees。

oracle数据库索引的理解与总结

oracle数据库索引的理解与总结

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

例如这样一个查询:SELECT * FROM TABLE1 WHERE ID = 44。

如果没有索引,必须遍历整个表,直到ID等于44的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),直接在索引里面找44(也就是在ID这一列找),就可以得知这一行的位置,也就是找到了这一行。

可见,索引是用来定位的。

建立索引的目的是加快对表中记录的查找或排序。

为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。

虽然建立索引能加快对表中记录的查询或者排序速度,但是并不是索引建得越多越好,这就需要我们了解使用索引过程中,索引的一些优点以及缺陷:使用索引的好处:创建索引可以大大提高系统的性能:第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。

第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

使用索引的一些不足:第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。

第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

索引是建立在数据库表中的某些列的上面。

在创建索引的时候,应该考虑在哪些列上可以创建索引,在哪些列上不能创建索引。

一般来说,应该在这些列上创建索引:∙在经常需要搜索的列上,可以加快搜索的速度;在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;∙在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;∙在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;∙在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;∙在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

oracle索引总结

oracle索引总结

oracle 索引总结oracle 索引总结简介1.说明 1)索引是数据库对象之⼀,⽤于加快数据的检索,类似于书籍的索引。

在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于在书籍中我们利⽤索引可以不⽤翻阅整本书即可找到想要的信息。

2)索引是建⽴在表上的可选对象;索引的关键在于通过⼀组排序后的索引键来取代默认的全表扫描检索⽅式,从⽽提⾼检索效率 3)索引在逻辑上和物理上都与相关的表和数据⽆关,当创建或者删除⼀个索引时,不会影响基本的表; 4)索引⼀旦建⽴,在表上进⾏DML 操作时(例如在执⾏插⼊、修改或者删除相关操作时),oracle 会⾃动管理索引,索引删除,不会对表产⽣影响 5)索引对⽤户是透明的,⽆论表上是否有索引,sql 语句的⽤法不变 6)oracle 创建主键时会⾃动在该列上创建索引索引原理1. 若没有索引,搜索某个记录时(例如查找name='wish')需要搜索所有的记录,因为不能保证只有⼀个wish ,必须全部搜索⼀遍2. 若在name 上建⽴索引,oracle 会对全表进⾏⼀次搜索,将每条记录的name 值哪找升序排列,然后构建索引条⽬(name 和rowid ),存储到索引段中,查询name 为wish 时即可直接查找对应地⽅3.创建了索引并不⼀定就会使⽤,oracle ⾃动统计表的信息后,决定是否使⽤索引,表中数据很少时使⽤全表扫描速度已经很快,没有必要使⽤索引索引使⽤(创建、修改、删除、查看)1.创建索引语法CREATE [UNIQUE] | [BITMAP] INDEX index_name --unique 表⽰唯⼀索引ON table_name([column1 [ASC|DESC],column2 --bitmap ,创建位图索引[ASC|DESC],…] | [express])[TABLESPACE tablespace_name][PCTFREE n1] --指定索引在数据块中空闲空间[STORAGE (INITIAL n2)][NOLOGGING] --表⽰创建和重建索引时允许对表做DML 操作,默认情况下不应该使⽤[NOLINE][NOSORT]; --表⽰创建索引时不进⾏排序,默认不适⽤,如果数据已经是按照该索引顺序排列的可以使⽤2.修改索引1)重命名索引alter index index_sno rename to bitmap_index;2) 合并索引(表使⽤⼀段时间后在索引中会产⽣碎⽚,此时索引效率会降低,可以选择重建索引或者合并索引,合并索引⽅式更好些,⽆需额外存储空间,代价较低)alter index index_sno coalesce ;3)重建索引 ⽅式⼀:删除原来的索引,重新建⽴索引 ⽅式⼆:alter index index_sno rebuild;3.删除索引drop index index_sno;4.查看索引select index_name,index-type, tablespace_name, uniqueness from all_indexes where table_name ='tablename';-- eg:create index index_sno on student('name');select*from all_indexes where table_name='student';索引分类1. B树索引(默认索引,保存讲过排序过的索引列和对应的rowid值)1)说明: 1.oracle中最常⽤的索引;B树索引就是⼀颗⼆叉树;叶⼦节点(双向链表)包含索引列和指向表中每个匹配⾏的ROWID值 2.所有叶⼦节点具有相同的深度,因⽽不管查询条件怎样,查询速度基本相同 3.能够适应精确查询、模糊查询和⽐较查询2)分类: UNIQUE,NON-UNIQUE(默认),REVERSE KEY(数据列中的数据是反向存储的)3)创建例⼦craete index index_sno on student('sno');4)适合使⽤场景: 列基数(列不重复值的个数)⼤时适合使⽤B数索引2. 位图索引1)说明: 1.创建位图索引时,oracle会扫描整张表,并为索引列的每个取值建⽴⼀个位图(位图中,对表中每⼀⾏使⽤⼀位(bit,0或者1)来标识该⾏是否包含该位图的索引列的取值,如果为1,表⽰对应的rowid所在的记录包含该位图索引列值),最后通过位图索引中的映射函数完成位到⾏的ROWID的转换2)创建例⼦create bitmap index index_sno on student(sno);3) 适合场景:对于基数⼩的列适合简历位图索引(例如性别等)3.单列索引和复合索引(基于多个列创建)1) 注意: 即如果索引建⽴在多个列上,只有它的第⼀个列被where⼦句引⽤时,优化器才会使⽤该索引,即⾄少要包含组合索引的第⼀列4. 函数索引1)说明: 1. 当经常要访问⼀些函数或者表达式时,可以将其存储在索引中,这样下次访问时,该值已经计算出来了,可以加快查询速度 2. 函数索引既可以使⽤B数索引,也可以使⽤位图索引;当函数结果不确定时采⽤B树索引,结果是固定的某⼏个值时使⽤位图索引 3. 函数索引中可以⽔泥⽤len、trim、substr、upper(每⾏返回独⽴结果),不能使⽤如sum、max、min、avg等2)例⼦:create index fbi on student (upper(name));select*from student where upper(name) ='WISH';索引建⽴原则总结 1. 如果有两个或者以上的索引,其中有⼀个唯⼀性索引,⽽其他是⾮唯⼀,这种情况下oracle将使⽤唯⼀性索引⽽完全忽略⾮唯⼀性索引 2. ⾄少要包含组合索引的第⼀列(即如果索引建⽴在多个列上,只有它的第⼀个列被where⼦句引⽤时,优化器才会使⽤该索引) 3. ⼩表不要简历索引 4. 对于基数⼤的列适合建⽴B树索引,对于基数⼩的列适合简历位图索引 5. 列中有很多空值,但经常查询该列上⾮空记录时应该建⽴索引 6. 经常进⾏连接查询的列应该创建索引 7. 使⽤create index时要将最常查询的列放在最前⾯ 8. LONG(可变长字符串数据,最长2G)和LONG RAW(可变长⼆进制数据,最长2G)列不能创建索引 9.限制表中索引的数量(创建索引耗费时间,并且随数据量的增⼤⽽增⼤;索引会占⽤物理空间;当对表中的数据进⾏增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度)注意事项1. 通配符在搜索词⾸出现时,oracle不能使⽤索引,eg:--我们在name上创建索引;create index index_name on student('name');--下⾯的⽅式oracle不适⽤name索引select*from student where name like'%wish%';--如果通配符出现在字符串的其他位置时,优化器能够利⽤索引;如下:select*from student where name like'wish%';2. 不要在索引列上使⽤not,可以采⽤其他⽅式代替如下:(oracle碰到not会停⽌使⽤索引,⽽采⽤全表扫描)select*from student where not (score=100);select*from student where score <>100;--替换为select*from student where score>100or score <1003. 索引上使⽤空值⽐较将停⽌使⽤索引, eg:select*from student where score is not null;。

oracle创建索引

oracle创建索引

Oracle创建索引Oracle在创建索引时要遵循以下的原则:●平衡查询和DML的需要。

在易挥发(DML操作频繁)的表上尽量减少索引的数量,因为索引虽然加快了查询的速度,但却降低了DML操作速度。

●将其放入单独的表空间,不要与表、临时段或还原(回滚)段放在一个表空间,因为索引段会与这些段竞争输入/输出(I/O)。

●使用统一的EXTENT尺寸:数据块尺寸的5倍,或表空间的MINIMUM EXTENT的尺寸。

这样做的目的是为了减少系统的转换时间。

●对大索引可以考虑使用NOLOGGING。

这样做的目的是通过减少REDO操作来提高系统的效率,但是如果一旦系统发生崩溃,则该索引一般是无法进行完全灰度的。

不过问题也不是很大,因为真正的数据还在表中,所以可以通过重建该索引来恢复与之前完全相同的效果。

●索引的INITRANS参数通常应该比相对应表的高。

以为索引项要比表中的数据行小的多,所以一个数据块可以存放更多的索引项(记录)。

创建索引的命令格式:CREA TE (UNIQUE|BITMAP) INDEX [用户名.]索引名ON [用户名.]表名(列名[ASC | DESC] [,列名[ASC| DESC ] ]…)[TABLESPACE 表空间名][PCTFREE 正整型数][INITRANS 正整型数][MAXTRANS 正整型数][存储子句][LOGGING | NOLOGGING][NOSORT]其中,●UNIQUE:说明该索引是唯一索引,默认是非唯一的●ASC:说明所创建的索引为升序●DESC:说明所创建的索引为降序●表空间名:说明将要创建的索引的表空间名●PCTFREE:在创建索引时每一个块中预留的空间●INITRANS:在每一个块中预分配的事物记录数,默认值为2●MAXTRANS:在每一个块中可以分配的事物记录数的上限,默认为255●存储子句:说明在索引中EXTENTS怎样分配●LOGGING:说明在创建索引是和以后的索引操作中要记录联机重做日志文件(默认)●NOLOGGING:说明索引的创建和一些数据装入操作将不记录联机重做日志文件●NOSORT:数据库中所存的数据行已经按升序排好,因此在创建索引时不需要再排序了●PCTUSED:在索引中不能说明该参数。

oracle重建索引

oracle重建索引

oracle重建索引⼀、重建索引的前提1、表上频繁发⽣update,delete操作;2、表上发⽣了alter table ..move操作(move操作导致了rowid变化)。

⼆、重建索引的标准1、索引重建是否有必要,⼀般看索引是否倾斜的严重,是否浪费了空间,那应该如何才可以判断索引是否倾斜的严重,是否浪费了空间,对索引进⾏结构分析(如下):SQL>Analyze index index_name validate structure;2、在执⾏步骤1的session中查询index_stats表,不要到别的session去查询。

SQL>select height,DEL_LF_ROWS/LF_ROWS from index_stats;说明:当查询出来的 height>=4 或者 DEL_LF_ROWS/LF_ROWS>0.2 的场合,该索引考虑重建。

举例: (t_gl_assistbalance 26 万多条信息 )SQL> select count(*) from t_gl_assistbalance ;输出结果:COUNT(*)----------265788SQL> Analyze index IX_GL_ASSTBAL_1 validate structure;Index analyzedSQL> select height,DEL_LF_ROWS/LF_ROWS from index_stats;输出结果:HEIGHT DEL_LF_ROWS/LF_ROWS---------- -------------------4 1三、重建索引的⽅式1、drop 原来的索引,然后再创建索引;举例:删除索引:drop index IX_PM_USERGROUP;创建索引:create index IX_PM_USERGROUP on T_PM_USER (fgroupid);说明:此⽅式耗时间,⽆法在24*7环境中实现,不建议使⽤。

oracle数据库中锁序列索引管理

oracle数据库中锁序列索引管理

详析Oracle数据库中锁、序列、索引管理一、锁1.1什么是锁数据库是一个多用户使用的共享资源。

当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。

若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

而锁就是用于控制事务对数据的访问,实现事务的并发控制,保持数据库的一致性。

1.2锁的类型DDL锁:被Oracle自动的发布和释放DML锁:在事务处理的开始时被施加,而且在事务处理完成时被释放(使用Commit 或Rollback时被释放)内部锁:由Oracle自己管理以保护内部数据库结构注:DDL锁由数据库自动管理;DML锁和内部锁可以由用户直接或间接管理。

1.3锁的粒度1)TX锁:行级锁(事务锁),会阻止这行上其它DML操作,直到Commit或Rollback 时被释放,它只有X排他锁2)TM锁:表级锁。

2.1)Row-S 行共享(RS):共享行锁,即可被其他事务查询该行。

2.2)Row-X 行专用(RX):用于行的修改,即禁止其他事务对该行的所有操作。

2.3)Share 共享锁(S):阻止其他DML操作2.4)S/Row-X 共享行专用(SRX):阻止其他事务操作2.5)exclusive 专用(X):独立访问使用3)数据库级锁:锁定数据库为限制模式alter system enable restricted session;以下语句将锁定数据库为只读模式startup mount;alter database open read only;1.4锁的模式和使用1)共享锁(Share Table Lock,S):使用情况:当执行事务时,事务所要操作的表不希望被别的事务更新时可以使用。

即某表被加锁后只能被加锁的事务全权控制,其他事务只能对该表执行查询操作。

加锁语法:Lock Table TableName In Share Mode;使用度:中。

当对表执行大面积更新操作时可使用,反之,则不用。

oracle索引介绍(图文详解)

oracle索引介绍(图文详解)

oracle索引介绍(图⽂详解)对于数据库来说,索引是⼀个必选项,但对于现在的各种⼤型数据库来说,索引可以⼤⼤提⾼数据库的性能,以⾄于它变成了数据库不可缺少的⼀部分。

索引分类:逻辑分类single column or concatenated 对⼀列或多列建所引unique or nonunique 唯⼀的和⾮唯⼀的所引,也就是对某⼀列或⼏列的键值(key)是否是唯⼀的。

Function-based 基于某些函数索引,当执⾏某些函数时需要对其进⾏计算,可以将某些函数的计算结果事先保存并加以索引,提⾼效率。

Doman 索引数据库以外的数据,使⽤相对较少物理分类B-Tree :normal or reverse key B-Tree索引也是我们传统上常见所理解的索引,它⼜可以分为正常所引和倒序索引。

Bitmap :位图所引,后⾯会细讲B-Tree 索引 B-Tree index 也是我们传统上常见所理解的索引。

B-tree (balance tree)即平衡树,左右两个分⽀相对平衡。

B-Tree indexRoot为根节点,branch 为分⽀节点,leaf 到最下⾯⼀层称为叶⼦节点。

每个节点表⽰⼀层,当查找某⼀数据时先读根节点,再读⽀节点,最后找到叶⼦节点。

叶⼦节点会存放index entry (索引⼊⼝),每个索引⼊⼝对应⼀条记录。

Index entry 的组成部分:Indexentry entry header 存放⼀些控制信息。

Key column length 某⼀key的长度Key column value 某⼀个key 的值ROWID 指针,具体指向于某⼀个数据创建索引:复制代码代码如下:⽤户登录:SQL> conn as1/as1Connected.创建表:SQL> create table dex (id int,sex char(1),name char(10));Table created.向表中插⼊1000条数据SQL> beginfor i in 1..1000loopinsert into dex values(i,'M','chongshi');end loop;commit;end;/PL/SQL procedure successfully completed.查看表记录SQL> select * from dex;ID SE NAME---------- -- --------------------... . .....M chongshiM chongshiM chongshiM chongshiM chongshiM chongshiM chongshiM chongshiM chongshiM chongshirows selected.创建索引:SQL> create index dex_idx1 on dex(id);Index created.注:对表的第⼀列(id)创建索引。

oracle重建索引的方法

oracle重建索引的方法

oracle重建索引的方法在Oracle 数据库中,重建索引是一种优化数据库性能的方法之一。

索引的重建可以帮助数据库优化查询性能,减少碎片,提高查询效率。

以下是在Oracle 中重建索引的一般步骤:1. 查看索引状态:在执行重建索引之前,你可以查看索引的状态,以确定是否需要重建。

使用以下查询来获取索引的统计信息:```sqlSELECT index_name, table_name, table_owner, statusFROM dba_indexesWHERE table_owner = 'your_table_owner' AND table_name = 'your_table_name';```这将返回表中所有索引的信息,包括索引名称、表名称、所有者和状态等。

2. 禁用索引(可选):在进行索引重建之前,你可以选择禁用索引。

禁用索引可能会加快索引重建的过程。

使用以下语句禁用索引:```sqlALTER INDEX index_name NOPARALLEL;```在此语句中,`index_name` 是要禁用的索引名称。

3. 重建索引:使用`ALTER INDEX` 语句来重建索引。

重建索引的语法如下:```sqlALTER INDEX index_name REBUILD;```在此语句中,`index_name` 是要重建的索引名称。

4. 启用索引(可选):如果在第2步中禁用了索引,可以使用以下语句启用索引:```sqlALTER INDEX index_name PARALLEL;```在此语句中,`index_name` 是要启用的索引名称。

请注意,重建索引可能会导致数据库锁定和性能影响,因此在生产环境中建议在低负载时执行。

此外,重建索引的必要性取决于数据库的使用情况,有时候并不是每个索引都需要经常重建。

最好在进行此类维护任务之前,了解数据库性能和索引的使用情况,以确保执行这些操作是有益的。

Oracle建立索引及SQL优化

Oracle建立索引及SQL优化

Oracle建⽴索引及SQL优化索引有单列索引复合索引之说如何某表的某个字段有主键约束和唯⼀性约束,则Oracle 则会⾃动在相应的约束列上建议唯⼀索引。

数据库索引主要进⾏提⾼访问速度。

建设原则: 1、索引应该经常建在Where ⼦句经常⽤到的列上。

如果某个⼤表经常使⽤某个字段进⾏查询,并且检索⾏数⼩于总表⾏数的5%。

则应该考虑。

 2、对于两表连接的字段,应该建⽴索引。

如果经常在某表的⼀个字段进⾏Order By 则也经过进⾏索引。

 3、不应该在⼩表上建设索引。

优缺点: 1、索引主要进⾏提⾼数据的查询速度。

当进⾏DML时,会更新索引。

因此索引越多,则DML越慢,其需要维护索引。

因此在创建索引及DML需要权衡。

创建索引: 单⼀索引:Create Index <Index-Name> On <Table_Name>(Column_Name); 复合索引: Create Index i_deptno_job on emp(deptno,job); —>在emp表的deptno、job列建⽴索引。

select * from emp where deptno=66 and job='sals' ->⾛索引。

select * from emp where deptno=66 OR job='sals' ->将进⾏全表扫描。

不⾛索引 select * from emp where deptno=66 ->⾛索引。

select * from emp where job='sals' ->进⾏全表扫描、不⾛索引。

如果在where ⼦句中有OR 操作符或单独引⽤Job 列(索引列的后⾯列) 则将不会⾛索引,将会进⾏全表扫描。

Sql 优化:当Oracle数据库拿到SQL语句时,其会根据查询优化器分析该语句,并根据分析结果⽣成查询执⾏计划。

Oracle合理创建索引规则

Oracle合理创建索引规则

Oracle合理创建索引规则在Oracle数据库中,创建索引虽然比较简单。

但是要合理的创建索引则比较困难了。

笔者认为,在创建索引时要做到三个适当,即在适当的表上、适当的列上创建适当数量的索引。

虽然这可以通过一句话来概括优化的索引的基本准则,但是要做到这一点的话,需要数据库管理员做出很大的努力。

具体的来说,要做到这个三个适当有如下几个要求。

一、根据表的大小来创建索引。

虽然给表创建索引,可以提高查询的效率。

但是数据库管理员需要注意的是,索引也需要一定的开销的。

为此并不是说给所有的表都创建索引,那么就可以提高数据库的性能。

这个认识是错误的。

恰恰相反,如果不管三七二十一,给所有的表都创建了索引,那么其反而会给数据库的性能造成负面的影响。

因为此时滥用索引的开销可能已经远远大于由此带来的性能方面的收益。

所以笔者认为,数据库管理员首先需要做到,为合适的表来建立索引,而不是为所有的表建立索引。

一般来说,不需要为比较小的表创建索引。

如在一个ERP系统的数据库中,department 表用来存储企业部门的信息。

一般企业的部分也就十几个,最多不会超过一百个。

这100条记录对于人来说,可能算是比较多了。

但是对于计算机来说,这给他塞塞牙缝都还不够。

所以,对类似的小表没有必要建立索引。

因为即使建立了索引,其性能也不会得到很大的改善。

相反索引建立的开销,如维护成本等等,要比这个要大。

也就是说,付出的要比得到的多,显然违反常理。

另外,就是对于超大的表,也不一定要建立索引。

有些表虽然比较大,记录数量非常的多。

但是此时为这个表建立索引并一定的合适。

如系统中有一张表,其主要用来保存数据库中的一些变更信息。

往往这些信息只给数据库管理员使用。

此时为这张表建立索引的话,反而不合适。

因为这张表很少用到,只有在出问题的时候才需要查看。

其次其即使查看,需要查询的纪录也不会很多,可能就是最近一周的更新记录等等。

对于对于一些超大的表,建立索引有时候往往不能够达到预计的效果。

数据库索引(Oracle和Mysql)学习总结

数据库索引(Oracle和Mysql)学习总结

数据库索引(Oracle和Mysql)学习总结旭⽇Follow_24 的CSDN 博客,全⽂地址请点击:索引概念:索引是关系数据库中⽤于存放每⼀条记录的⼀种对象,主要⽬的是加快数据的读取速度和完整性检查。

建⽴索引是⼀项技术性要求⾼的⼯作。

⼀般在数据库设计阶段的与数据库结构⼀道考虑。

应⽤系统的性能直接与索引的合理直接有关。

⼀、Oracle索引1、索引类型列出常见常⽤的⼏种索引类型,如下:⾮唯⼀索引(最常⽤) NonUnique 唯⼀索引 Unique 位图索引 Bitmap 分区索引 Partitioned ⾮分区索引 NonPartitioned 正常型B树 Normal 基于函数的索引 Function-based2、索引结构B-tree:适合与⼤量的增、删、改(OLTP);不能⽤包含OR操作符的查询;适合⾼基数的列(唯⼀值多)典型的树状结构;每个结点都是数据块;⼤多都是物理上⼀层、两层或三层不定,逻辑上三层;叶⼦块数据是排序的,从左向右递增;在分⽀块和根块中放的是索引的范围;Bitmap:适合与决策⽀持系统;做UPDATE代价⾮常⾼;⾮常适合OR操作符的查询;基数⽐较少的时候才能建位图索引;树型结构:索引头开始ROWID,结束ROWID(先列出索引的最⼤范围)BITMAP每⼀个BIT对应着⼀个ROWID,它的值是1还是0,如果是1,表⽰着BIT对应的ROWID有值1. b-tree索引Oracle数据库中最常见的索引类型是b-tree索引,也就是B-树索引,以其同名的计算科学结构命名。

CREATE INDEX语句时,默认就是在创建b-tree索引。

没有特别规定可⽤于任何情况。

2. 位图索引(bitmap index)位图索引特定于该列只有⼏个枚举值的情况,⽐如性别字段,标⽰字段⽐如只有0和1的情况。

3. 基于函数的索引⽐如经常对某个字段做查询的时候是带函数操作的,那么此时建⼀个函数索引就有价值了。

oracle重建索引注意事项

oracle重建索引注意事项

Oracle重建索引注意事项在Oracle数据库中,索引是提高查询性能的重要工具之一。

当索引出现问题或性能下降时,重建索引是一种解决方法。

本文将详细介绍Oracle重建索引的注意事项,以帮助您正确、高效地进行索引重建操作。

1. 索引重建的目的索引重建是为了优化数据库查询性能而进行的操作。

当索引存在碎片、数据分布不均匀、索引高度不合理等情况时,会导致查询效率下降。

通过重建索引可以重新组织和优化索引结构,提高查询效率和整体性能。

2. 索引选择和分析在进行索引重建之前,需要对当前的索引进行选择和分析。

可以通过以下几个步骤来完成:•使用ANALYZE命令对表进行分析,获取表的统计信息。

•使用EXPLAIN PLAN命令对常见的查询语句进行分析,查看执行计划和相关指标。

•使用DBMS_STATS.GATHER_TABLE_STATS过程收集表的统计信息,并使用DBMS_STATS.GET_INDEX_STATS过程获取当前索引的统计信息。

通过以上步骤可以得到表和索引的详细信息,包括数据分布、空间利用率、IO消耗等指标。

根据这些信息,可以判断是否需要进行索引重建。

3. 索引重建的类型索引重建可以分为在线重建和离线重建两种类型。

•在线重建:在数据库正常运行的情况下进行索引重建,不会影响用户的查询和更新操作。

可以使用ALTER INDEX ... REBUILD命令来实现在线重建。

•离线重建:需要停止数据库或表的访问,进行索引重建。

离线重建可以通过导出数据、删除旧索引、重新导入数据等方式来完成。

选择合适的索引重建类型需要根据具体情况来决定。

如果数据库负载较高,且有足够空闲时间,可以选择离线重建;如果对数据库的可用性有较高要求,可以选择在线重建。

4. 索引创建和维护在进行索引重建之前,需要先创建新的索引结构。

创建新索引时需要注意以下几个方面:•合理选择索引类型:根据查询需求和数据特点选择合适的索引类型,如B树索引、位图索引等。

第6章 Oracle索引(创建、简介、技巧)

第6章 Oracle索引(创建、简介、技巧)

四、管理索引的原则
使用索引的目的是为了提高系统的效率,但同时它也会 增加系统的负担,进行影响系统的性能,因为系统必须在 进行DML操作后维护索引数据。
在新的SQL标准中并不推荐使用索引,而是建议在创建 表的时候用主键替代。因此,为了防止使用索引后反而降 低系统的性能,应该遵循一些基本的原则。
四、管理索引的原则
限制:
6、不能对LONG类型列加约束条件(NULL、NOT NULL、 DEFAULT除外),如:关键字列(PRIMARY KEY)不能是 LONG 数据类型。
7、LONG类型列不能用在Select的以下子句中:where、 group by、order by,以及带有distinct的select语句中。 8、LONG类型列不能用于分布查询。
– Non-Unique:非唯一索引,其索引值可以重复,允许为 NULL。默认情况下,Oracle创建的索引是非唯一索引。
– Reverse Key:反向关键字索引。通过在创建索引时指定 “REVERSE”关键字,可以创建反向关键字索引,被索引的 每个数据列中的数据都是反向存储的,但仍然保持原来数据 列的次序。
3. 位图索引
当创建位图索引时,Oracle会扫描整张表,并为索引列 的每个取值建立一个位图。在这个位图中,对表中每一行 使用一位(bit,取值为0或1)来表示该行是否包含该位图 的索引列的取值,如果为1,则表示该位对应的ROWID所 在的记录包含该位图索引列值。最后通过位图索引中的映 射函数完成位到行的ROWID的转换。
第6章 Oracle_索引
本章内容
6.1 索引概述 6.2 创建索引 6.3 修改索引 6.4 查看索引
6.1 Oracle索引概述
一、索引的概念

Oracle数据库中建立索引的基本方法讲解

Oracle数据库中建立索引的基本方法讲解

Oracle数据库中建⽴索引的基本⽅法讲解怎样建⽴最佳索引?1、明确地创建索引create index index_name on table_name(field_name)tablespace tablespace_namepctfree 5initrans 2maxtrans 255storage(minextents 1maxextents 16382pctincrease 0);2、创建基于函数的索引常⽤与UPPER、LOWER、TO_CHAR(date)等函数分类上,例:create index idx_func on emp(UPPER(ename)) tablespace tablespace_name;3、创建位图索引对基数较⼩,且基数相对稳定的列建⽴索引时,⾸先应该考虑位图索引,例:create bitmap index idx_bitm on class (classno) tablespace tablespace_name;4、明确地创建唯⼀索引可以⽤create unique index语句来创建唯⼀索引,例:create unique index dept_unique_idx on dept(dept_no) tablespace idx_1;5、创建与约束相关的索引可以⽤using index字句,为与unique和primary key约束相关的索引,例:alter table table_nameadd constraint PK_primary_keyname primary key(field_name)using index tablespace tablespace_name;如何创建局部区索引?1)基础表必须是分区表2)分区数量与基础表相同3)每个索引分区的⼦分区数量与相应的基础表分区相同4)基础表的⾃分区中的⾏的索引项,被存储在该索引的相应的⾃分区中,例如create index TG_CDR04_SERV_ID_IDX on TG_CDR04(SERV_ID)Pctfree 5Tablespace TBS_AK01_IDXStorage(MaxExtents 32768PctIncrease 0FreeLists 1FreeList Groups 1)local/如何创建范围分区的全局索引?基础表可以是全局表和分区表create index idx_start_date on tg_cdr01(start_date)global partition by range(start_date)(partition p01_idx vlaues less than ('0106')partition p01_idx vlaues less than ('0111')...partition p01_idx vlaues less than ('0401'))/如何重建现存的索引?重建现存的索引的当前时刻不会影响查询重建索引可以删除额外的数据块提⾼索引查询效率alter index idx_name rebuild nologging;对于分区索引alter index idx_name rebuild partition partition_name nologging;删除索引的原因?1)不再需要的索引2)索引没有针对其相关的表所发布的查询提供所期望的性能改善3)应⽤没有⽤该索引来查询数据4)该索引⽆效,必须在重建之前删除该索引5)该索引已经变的太碎了,必须在重建之前删除该索引语句:drop index idx_name;drop index idx_name partition partition_name;建⽴索引的代价?基础表维护时,系统要同时维护索引,不合理的索引将严重影响系统资源,主要表现在CPU和I/O上。

ORACLE索引,索引的建立、修改、删除

ORACLE索引,索引的建立、修改、删除

ORACLE索引,索引的建⽴、修改、删除原⽂地址⼀、简介索引是关系数据库中⽤于存放每⼀条记录的⼀种对象,主要⽬的是加快数据的读取速度和完整性检查。

建⽴索引是⼀项技术性要求⾼的⼯作。

⼀般在数据库设计阶段的与数据库结构⼀道考虑。

应⽤系统的性能直接与索引的合理直接有关。

⼆、语法2.1 创建索引CREATE INDEXCREATE[unique]INDEX[user.]indexON[user.]table (column[ASC | DESC][,column[ASC | DESC] ] ... )[CLUSTER [scheam.]cluster][INITRANS n][MAXTRANS n][PCTFREE n][STORAGE storage][TABLESPACE tablespace][NO SORT]其中:schema ORACLE模式,缺省即为当前帐户index索引名table创建索引的基表名column基表中的列名,⼀个索引最多有16列,long列、long raw列不能建索引列DESC、ASC缺省为ASC即升序排序CLUSTER 指定⼀个聚簇(Hash cluster不能建索引)INITRANS、MAXTRANS 指定初始和最⼤事务⼊⼝数Tablespace 表空间名STORAGE 存储参数,同create table中的storage.PCTFREE 索引数据块空闲空间的百分⽐(不能指定pctused)NOSORT 不(能)排序(存储时就已按升序,所以指出不再排序)2.1修改索引对于较早的Oracle版本,修改索引的主要任务是修改已存在索引的存储参数适应增长的需要或者重新建⽴索引。

⽽Oracle8I及以后的版本,可以对⽆⽤的空间进⾏合并。

这些的⼯作主要是由管理员来完成。

ALTER[UNIQUE]INDEX[user.]index[INITRANS n][MAXTRANS n]REBUILD[STORAGE n]其中:REBUILD 是根据原来的索引结构重新建⽴索引,实际是删除原来的索引后再重新建⽴。

oracle数据库关于索引建立及使用的详细介绍

oracle数据库关于索引建立及使用的详细介绍

oracle数据库关于索引建⽴及使⽤的详细介绍索引的说明索引是与表相关的⼀个可选结构,在逻辑上和物理上都独⽴于表的数据,索引能优化查询,不能优化DML操作,Oracle⾃动维护索引,频繁的DML操作反⽽会引起⼤量的索引维护。

如果SQL语句仅访问被索引的列,那么数据库只需从索引中读取数据,⽽不⽤读取表。

如果该语句同时还要访问除索引列之外的列,那么,数据库会使⽤rowid来查找表中的⾏。

通常,为检索表数据,数据库以交替⽅式先读取索引块,然后读取相应的表块。

索引的⽬的主要是减少IO,这是本质,这样才能体现索引的效率。

1⼤表,返回的⾏数<5%2经常使⽤where⼦句查询的列3离散度⾼的列4更新键值代价低5逻辑AND、OR效率⾼6查看索引在建在那表、列:select * from user_indexes;select * from user_ind_columns;索引结构oracle索引分为两⼤类结构:B树索引结构<balance>类似于字典查询,最后到leaf block ,存的是数据rowid和数据项1.叶块之间使⽤双向链连接,为了可以范围查询。

2.删除表⾏时,索引叶块也会更新,但只是逻辑更改,并不做物理的删除叶块。

3.索引叶块不保存表⾏键值null的信息。

位图索引结构<bitmap>在oracle中是根据rowid来定位记录的,因此,我们需要引⼊start rowid和end rowid,通过start rowid ,end rowid 和⼆进制位的偏移,我们就可以⾮常快速的计算出⼆进制位所代表的表记录rowid。

位图索引的最终逻辑结构如下图:我们称每⼀单元的<key ,startrowid,end rowid,bitmap>为⼀个位图⽚段。

当我们修改某⼀⾏数据的时候,我们需要锁定该⾏列值所对应的位图⽚段,如果我们进⾏的是更新操作,同时还会锁定更新后新值所在的位图⽚段。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档