Oracle视图中建立索引的注意事项

合集下载

5.关于Oracle中表的索引的说明

5.关于Oracle中表的索引的说明

数据库索引的重要性
二、位图索引:
如果表中的字段值很少,大部分都重复,例如性 别字段,只有两个不同的值,则需要建立位图索引。 语句如下,要包含关键字BITMAP: 语句如下,要包含关键字BITMAP: CREATE BITMAP INDEX INDEX_RK_CK_XB ON T_RK_CK(XB); 也可以使用STORAGE子句来设置索引的存储参数; 也可以使用STORAGE子句来设置索引的存储参数; 三、反序索引(在oracle rac环境下多用) 三、反序索引(在oracle rac环境下多用) 反序索引能提高某些使用并行服务器的OLAP应用 反序索引能提高某些使用并行服务器的OLAP应用 的性能。创建反序索引要用关键字REVERSE: 的性能。创建反序索引要用关键字REVERSE: CREATE INDEX INDEX_RK_RYID ON T_RK_CK(RYID) TABLESPACE USERS REVERSE; 但不适应于范围扫描
数据库索引的重要性 索引的种类及创建
常用索引类型如下:
B树索引:这是默认的索引类型,也是最常见的。 位图索引: 位图索引:这种索引适合于字段值重复较多的情况; 反序索引:通常在Oracle RAC中使用; 反序索引:通常在Oracle RAC中使用; 聚簇索引:在簇中聚簇字段上创建的索引; 散列索引:在散列簇中的聚簇字段上创建的索引; 全局与本地索引:在分区表上定义的索引; 函数索引:能够在索引中包含预先计算的函数;
数据库索引的重要性 为什么要用索引? 为什么要用么时候用索引?
索引的使用范围和注意事项
怎么使用索引? 怎么使用索引?
建立索引的方法和语句
数据库索引的重要性 为什么要用索引? 为什么要用索引?
首先我们要知道索引的作用,索引就像是书的目 录,有了目录,我们就可以更快的查看书中的内容, 所以创建索引主要是为了加快对表的SQL查询语句 所以创建索引主要是为了加快对表的SQL查询语句 的执行速度。因为利用索引,Oracle可以获得一种 的执行速度。因为利用索引,Oracle可以获得一种 快速访问表中数据的方法。 如果没有索引的话,要查询指定位置的记录要遍 历整个表;有了索引后,就可以在索引中找到符合查 询条件的索引字段值,然后通过保存在索引中的 ROWID(相当于页码)快速找到对应的记录。 ROWID(相当于页码)快速找到对应的记录。 当然也要注意,索引和表一样具有独立的段式存 储结构,需要在表空间中分配实际的存储空间,但其 远远小于表的存储空间。

创建索引原则

创建索引原则

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中有很多陷阱会使一些索引无法使用。

下面讨论一些常见的问题:4.1 使用不等于操作符(<>、!=)下面的查询即使在cust_rating列有一个索引,查询语句仍然执行一次全表扫描。

select cust_Id,cust_namefrom customerswhere cust_rating <> 'aa';把上面的语句改成如下的查询语句,这样,在采用基于规则的优化器而不是基于代价的优化器(更智能)时,将会使用索引。

oracle常用索引分析,使用原则和注意事项

oracle常用索引分析,使用原则和注意事项

oracle常⽤索引分析,使⽤原则和注意事项本⽂参考:索引简介• 索引(index)是数据库对象的⼀种。

索引的关键在于通过⼀组排序后的物理地址作为键来取代默认的全表扫描检索⽅式,就像为书本添加⽬录,通过牺牲物理内存的⽅式提⾼数据的检索效率。

• 它对⽤户时透明的,它的创建不会影响对表的sql操作。

索引⼀旦建⽴,在表上进⾏DML操作时(例如在执⾏插⼊、修改或者删除相关操作时),oracle会⾃动管理索引。

• oracle创建主键时会⾃动创建索引添加索引1.创建默认索引CREATE UNIQUE INDEX (索引名称) ON 表名 (列名1,列名2...) ; --unique(默认)表⽰唯⼀索引2.修改索引alter index (旧索引名称) rename to(新索引名称);3.删除索引drop index (索引名称);4.查看索引查看某表的所有索引:select index_name,index-type, tablespace_name, uniqueness from all_indexes where table_name =(表名);常⽤的2种索引及适⽤场景1.b树索引(默认索引,保存排序过的索引列和对应的rowid值)b树索引是oracle最常见的的索引,它的原理是利⽤了b-树的数据结构(b树的原理:)b树索引结构图:b树的所有叶⼦节点拥有相同的深度,oracle将索引列和对应的rowid值存⼊叶⼦节点上,因此所有的检索速度基本都是相同的。

b树索引的不适⽤场景:不适合键值较少的列(重复数据较多的列)假如索引列TYPE有5个键值,如果有1万条数据,那么 WHERE TYPE = 1将访问表中的2000个数据块。

再加上访问索引块,⼀共要访问⼤于200个的数据块。

如果全表扫描,假设10条数据⼀个数据块,那么只需访问1000个数据块,既然全表扫描访问的数据块少⼀点,肯定不会利⽤b树索引了。

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索引,索引的建⽴、修改、删除索引,索引的建⽴、修改、删除2007-10-05 13:29 来源: 作者:⽹友评论 0 条浏览次数 2986索引索引是关系数据库中⽤于存放每⼀条记录的⼀种对象,主要⽬的是加快数据的读取速度和完整性检查。

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

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

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

下⾯给出建⽴索引的⽅法和要点。

§3.5.1 建⽴索引1. CREATE INDEX命令语法: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]Advanced其中: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.建⽴索引的⽬的:建⽴索引的⽬的是:l 提⾼对表的查询速度;l 对表有关列的取值进⾏检查。

但是,对表进⾏insert,update,delete处理时,由于要表的存放位置记录到索引项中⽽会降低⼀些速度。

oracle创建索引

oracle创建索引

oracle创建索引数据库索引是为了提⾼查询速度的⼀种数据结构。

索引的创建语句索引的创建语句⾮常简单。

CREATE INDEX 索引名 ON 表名(列名);除了单列索引,还可以创建包含多个列的复合索引。

CREATE INDEX 索引名 ON 表名(列名1, 列名2, 列名3, ...);删除索引也⾮常简单。

DROP INDEX 索引名;查看某个表中的所有索引也同样简单。

SELECT * FROM ALL_INDEXES WHERE TABLE_NAME = '表名'还可以查看某个表中建⽴了索引的所有列。

SELECT * FROM ALL_IND_COLUMNS WHERE TABLE_NAME = '表名'索引的建⽴原则1.索引应该建⽴在WHERE⼦句中经常使⽤的列上。

如果某个⼤表经常使⽤某个字段进⾏查询,并且检索的啊⾏数⼩于总表⾏数的5%,则应该考虑在该列上建⽴索引。

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

3.如果经常在某表的⼀个字段上进⾏Order By的话,则也应该在这个列上建⽴索引。

4.不应该在⼩表上建⽴索引。

索引的优缺点索引主要是为了提⾼数据的查询速度,这就是索引的优点。

但是当进⾏增删改的时候,会更新索引。

因此索引越多,增删改的速度就会越慢,因为有⼀个维护索引的过程。

创建索引之前需要权衡该字段是否经常发⽣增删改操作,否则可能会带来负优化的问题。

索引的优点1.很⼤地提⾼了数据的检索速度。

2.创建唯⼀索引能保证数据库表中每⼀⾏数据的唯⼀性(唯⼀性约束)。

3.提⾼表与表之间的连接速度。

索引的缺点1.索引需要占⽤物理空间。

2.当对表中的数据进⾏增加、删除和修改的时候,索引也要动态地进⾏维护,降低数据的维护速度。

关于查询优化器当Oracle拿到SQL语句的时候,会使⽤查询优化器去分析该语句,并根据分析结果⽣成查询执⾏计划。

也就是说,数据库是执⾏的查询计划,⽽不是SQL语句。

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数据库使用索引来提高查询的速度。

本文我们主要介绍一些使用索引时应该注意的事项,接下来就让我们一起来了解一下吧。

一、Oracle的索引陷阱一个表中有几百万条数据,对某个字段加了索引,但是查询时性能并没有什么提高,这主要可能是oracle 的索引限制造成的。

Oracle的索引有一些索引限制,在这些索引限制发生的情况下,即使已经加了索引,oracle 还是会执行一次全表扫描,查询的性能不会比不加索引有所提高,反而可能由于数据库维护索引的系统开销造成性能更差。

1、使用不等于操作符(<>, !=)下面这种情况,即使在列dept_id有一个索引,查询语句仍然执行一次全表扫描:select * from dept where staff_num <> 1000; 有!通过把用or 语法替代不等号进行查询,就可以使用索引,以避免全表扫描:上面的语句改成下面这样的,就可以使用索引了。

select * from dept shere staff_num < 1000 or dept_id > 1000;2、使用is null 或is not null使用is null 或is nuo null也会限制索引的使用,因为数据库并没有定义null值。

如果被索引的列中有很多null,就不会使用这个索引(除非索引是一个位图索引,关于位图索引,会在以后的blog文章里做详细解释)。

在sql语句中使用null会造成很多麻烦。

解决这个问题的办法就是:建表时把需要索引的列定义为非空(not null) .3、使用函数如果没有使用基于函数的索引,那么where子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。

下面的查询就不会使用索引:select * from staff where trunc(birthda te) = '01-MAY-82'; select * from staff where birthdate < (to_date('01-MAY-82') + 0.9999);4、比较不匹配的数据类型下面的例子中,dept_id是一个varchar2型的字段,在这个字段上有索引,但是下面的语句会执行全表扫描。

oracle 索引原则

oracle 索引原则

oracle 索引原则
Oracle索引的原则包括以下几点:
1. 唯一性原则:索引的值必须是唯一的,确保在索引字段上不存在重复值。

这可以通过在创建索引时添加UNIQUE约束来实现。

2. 精确性原则:索引应该被正确地定义和使用,以确保在查询时只返回需要的结果,并且能够准确地匹配查询条件。

使用合适的数据类型和大小限制可以提高索引的精确性。

3. 冗余性原则:索引应该避免对重复或冗余数据进行索引。

对于经常被查询的字段,可以考虑创建索引,而对于很少被查询的字段,则可以避免创建索引,以提高性能。

4. 支持性原则:索引应该能够支持常见的查询模式和条件,以提高查询性能。

合理选择索引字段和顺序,可以使索引更好地支持常用的查询操作。

5. 可管理性原则:索引应该易于管理,包括创建、修改和删除索引。

不需要的索引应该及时删除,以减少数据库的维护工作和存储空间占用。

6. 统计信息原则:索引应该基于准确和实时的统计信息进行优化。

Oracle提供了收集统计信息的机制,可以通过收集和更新统计信息来帮助数据库优化器选择最佳的查询计划。

综上所述,索引的原则是确保唯一性、精确性、避免冗余、支持常用查询模式、易于管理和基于准确统计信息进行优化。

这些原则有助于提高数据库的性能和可用性。

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创建索引的实际操作中有一些限制条件。

就是说表或是列建立的相关索引并不是越多越好,而是相关索引建的越多,反而会影响到Oracle数据库在运行中的整体性能,所以,在建立索引的时候,仍然会有一些限制条件。

一是不要对一些记录内容比较少的表建立索引在一个应用系统设计的时候,如设计一个ERP系统的数据库,其虽然有几千张表。

但是,并不是每张表都有大量记录的。

相反,其中有近一半左右的数据表,可能其存储的数据不会超过百条。

如员工登陆帐户密码表、企业部门信息表等等。

对于这些记录内容比较少的表,我们建立最好不要为其建立索引。

无论是表上的,还是字段上,都不要Oracle建立索引。

二是若表中的内容比较大但是,这个表基本上不怎么查询的时候,则只需要在表上建立索引即可;而不需要在字段上建立索引。

如现在在ERP系统中,有一张表是“AD_Table”。

其存储的是这个数据库中相关表的信息。

这张表只有在数据库设计的时候才会用到。

故这张表中的记录虽然比较多,但是由于用户用的比较少,所以,一般没有必要为这张表建立列级别上的索引。

而直接用表索引来代替。

三是在一些NULL字段上要根据实际情况来判断是否要建立索引。

如现在有一张人事档案的表格,其上面有两个字段,分别为“身份证号码”与“地区”。

有时会为了某个原因,企业需要所有员工都在系统中登记他们的身份证号码,以方便他们办工资卡、社会保险等等。

所以人事管理可能需要经常的查询系统,看看有没有没有身份证号码的员工信息。

此时,就需要利用条件“IS NULL”来查询我们所需要的记录。

故为了提高查询效率,若某个记录可能为空,并且经常需要以NULL为条件进行查询的时候,则最好给这个字段添加一个索引,并且最好建立位图索引。

相反,若虽然可能会以NULL这个条件作为查询的限制语句,但是,用的不是很多的时候,则就没有必要为其建立索引。

建议三:多表连接查询的索引设计如现在有一个人事管理系统。

人事经理想知道员工的社保缴纳情况。

Oracle数据库索引

Oracle数据库索引

Oracle数据库索引[什么是索引]其实索引的作⽤就如同图书的⽬录,我们可以根据⽬录中的页码快速的找到所需的内容。

在关系型数据库中,索引是⼀种和表有关的数据结构(⼀般是树结构例如 Oracle数据库使⽤树算法处理索引; Berkerly DB , sqlite , mysql 数据库都使⽤了算法处理索引),它们都可以使查询的sql语句执⾏的更快编写⼀本书,只有章节内容定好之后再设置⽬录;数据库索引也是⼀样,只有先插⼊好数据,再建⽴索引。

[为何索引可提⾼查询效率]因为DB在执⾏⼀条sql语句的时候,默认的⽅式是根据搜索条件进⾏全表扫描,遇到匹配条件就加⼊搜索结果集合。

如果我们对某⼀字段增加索引,查询时就会先去索引列表中⼀次定位到特定值的⾏数,⼤⼤减少遍历匹配的⾏数,所以能明显增加查询的速度。

[索引的类型][索引的类型]1.全表扫描全表扫描(FULL TABLE SCANS) 时所有⾏、所有数据快均会被读到,是效率最低的⼀种,⼀般会在表缺少索引、读取⼤量数据、访问⼩表或⾼并发时发⽣2. ROWID扫描ROWID扫描是通过rowid中数据⽂件和块位置访问数据⾏。

⼀般作为访问索引后的第⼆步,如果访问的列全部包含在索引中,则不会执⾏rowid扫描3. 索引扫描索引扫描包括全索引扫描(full index scan FIS)、快速全索引扫描(fast full index scan FFIS)、索引范围扫描(index range scan)、索引唯⼀扫描(index unique scan)、索引跳跃式扫描(index skip scan)、位图索引扫描(bitmap index scan)[如何创建索引]创建表:create table person (id int, sex char(1), name char(10));创建索引:create index person_index on person (id);查看创建的表与索引:select object_name, object_type from user_objects;除了可以根据单个字段创建索引,也可以根据多列创建索引:create index person_index2 on person (sex, name);删除索引:drop index person_index;[创建索引的注意事项]1. 建⽴索引的⽬的是为了提⾼查询效率,但建⽴的索引过多会影响插⼊和删除数据的速度,这是因为我们修改表数据时,索引也要跟着修改,所以创建索引的时候我们需要权衡是查询多还是修改多。

oracle 索引 添加 原则

oracle 索引 添加 原则

oracle 索引添加原则索引是数据库中一种重要的对象,对于查询和数据的获取过程有着重要的作用。

因此,对于索引的添加原则必须要有所掌握。

本文将从以下几个方面来探讨oracle索引的添加原则。

一、索引的选择原则oracle索引添加的第一原则是选择合适的索引。

选择合适的索引需要考虑到几个因素:(1)数据的唯一性。

如果数据具有唯一性,就应该选择唯一性索引。

否则如果选择非唯一性索引,则会导致性能的降低。

(2)数据类型。

索引的类型要根据数据类型来选择。

(3)数据分布情况。

如果数据分布均匀,就不应该建立索引。

反之,如果数据分布极不均匀,就应该建立索引。

(4)数据访问方式。

建立索引时要综合考虑数据的访问方式,避免创建不必要的索引。

二、索引的原则索引的主键是数据库的一个关键组件,要遵循以下几个原则:(1)保证索引的唯一性。

主键索引必须保证数据的唯一性,避免出现重复数据的情况。

(2)保证索引的稳定性。

主键索引一旦建立后,就不能轻易地修改或者删除。

否则会影响数据库的稳定性。

(3)保证索引的实用性。

主键索引必须要实用,要符合数据库的实际情况。

否则建立了没有意义的主键索引,会浪费资源和时间。

三、索引的创建原则在创建索引时,需要考虑以下几个方面:(1)尽量选择合适的列作为索引列。

一般来说,主键列和外键列都可以作为索引列。

(2)对于最常用的搜索条件,建立特殊索引。

例如:联合索引、覆盖索引、分区索引等等。

(3)在建立索引时,需要注意索引的长度。

索引长度过长会导致查询速度变慢。

(4)建立索引前,需要考虑到表中数据的行数。

如果数据行数较少,不建议建立索引。

(5)建立索引后,需要定期维护和优化索引。

需要经常性的清除索引空间,以提高查询效率。

四、批量删除索引的原则删除索引是在数据库中进行维护和优化的重要工作,但需要遵循以下几个原则:(1)避免错误删除索引。

在删除索引前,需要卸载外键和约束。

(2)删除索引前,要确保需要删除的索引没有任何数据依赖关系。

oracle索引建立原则

oracle索引建立原则

oracle索引建立原则
索引是数据库中一种很重要的数据结构,能够提高查询速度和性能。

在Oracle数据库中,索引的建立需要遵循一定的原则。

1. 针对查询频率高的列建立索引
对于经常被查询的列,建立索引能够大大提高查询速度和效率。

在数据库设计时,需要考虑到经常被查询的列,如主键列、外键列、经常作为查询条件的列等,都需要建立索引。

2. 避免对小表建立索引
对于小表来说,建立索引可能会降低性能而不是提高性能。

因为小表的数据量很少,查询速度本来就很快,如果再建立索引,反而会增加额外的开销,降低性能。

3. 建立复合索引
复合索引是指建立在多个列上的索引。

如果在查询中需要同时使用多个列作为查询条件,建立复合索引能够大大提高查询效率。

但是需要注意,复合索引的列顺序需要考虑到查询中的顺序,才能最大程度地提高查询效率。

4. 避免对频繁更新的列建立索引
对于频繁更新的列,如时间戳、日志等,建立索引会增加额外的开销,降低性能。

因此,在设计表结构时,需要根据实际情况选择是否建立索引。

5. 定期维护索引
索引是需要定期维护的,因为索引随着数据库的使用而变得越来
越庞大,可能会导致查询性能下降。

定期维护索引可以删除不必要的索引、优化索引等,提高查询性能。

总之,在Oracle数据库中,索引的建立需要根据实际情况进行,需要考虑到查询频率、表大小、列的更新频率等因素,才能最大程度地提高查询效率和性能。

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>为⼀个位图⽚段。

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

Oracle索引

Oracle索引

Oracle索引
在正确使用索引的前提下,索引可以提高检索相应的表的速度。

当用户考虑在表中使用索引时,应遵循下列一些基本原则。

(1)在表中插入数据后创建索引。

在表中插入数据后,创建索引效率将更高。

如果在装载数据之前创建索引,那么插入每行时oracle都必须更改索引。

(2)索引正确的表和列。

如果经常检索包含大量数据的表中小于15%的行,就需要创建索引。

为了改善多个表的相互关系,常常使用索引列进行关系连接。

(3)主键和唯一关键字所在的列自动具有索引,但应该在与之关联的表中的外部关键字所在的列上创建索引。

(4)合理安排索引列。

在createindex语句中,列的排序会影响查询的性能,通常将最常用的列放在前面。

创建一个索引来提高多列的查询效率时,应该清楚地了解这个多列的索引对什么列的存取有效,对什么列的存取无效。

例如:在A,B,C三列上创建索引A有效AB有效ABC有效(5)限制表中索引的数量。

尽管表可以有任意数量的索引,可是索引越多,在修改表中的数据时对索引做出相应更改的工作量也越大,效率也就越低。

同样,目前不用的索引应该及时删除。

(6)指定索引数据块空间的使用。

创建索引时,索引的数据块是用表中现存的值填充的,直到达到PCTFREE为止。

如果打算将许多行插入到被索引的表中,PCTFREE就应设置得大一点,不能给索引指定PCTUSED。

(7)根据索引大小设置存储参数。

创建索引之前应先估计索引的大小,以便更好地促进规划和管理磁盘空间。

单个索引项的最大值大约是数据块大小的一半。

转:创建oracle索引时需要注意的7个事项

转:创建oracle索引时需要注意的7个事项

转:创建oracle索引时需要注意的7个事项在创建索引时,有⼀些问题使我们需要注意的,下⾯就为您介绍创建索引的⼀些注意事项,希望对您学习创建Oracle索引⽅⾯能有所帮助。

1、⼀般来说,不需要为⽐较⼩的表创建索引;2、即使是⼤表,如果经常需要查询的数据不超过10%到15%的话,那就没有必要为其建⽴索引的必要。

因为此时建⽴索引的开销可能要⽐性能的改善⼤的多。

这个⽐例只是⼀个经验的数据。

如果管理员需要得出⼀个⽐较精确的结论,那么就需要进⾏分析。

3、如对于⼀些重复内容⽐较少的列,特别是对于那些定义了唯⼀约束的列。

在这些列上建⽴索引,往往可以起到⾮常不错的效果。

如对于⼀些null值的列与⾮Null值的列混合情况下,如果⽤户需要经常查询所有的⾮Null值记录的列,则最好为其设置索引。

如果经常需要多表连接查询,在⽤与连接的列上设置索引可以达到事半功倍的效果。

4、数据库管理员,需要隔⼀段时间,如⼀年,对数据库的索引进⾏优化。

该去掉的去掉,该调整的调整,以提⾼数据库的性能。

5、通常来说,表的索引越多,其查询的速度也就越快。

但是,表的更新速度则会降低。

这主要是因为表的更新(如往表中插⼊⼀条记录)速度,反⽽随着索引的增加⽽增加。

这主要是因为,在更新记录的同时需要更新相关的索引信息。

为此,到底在表中创建多少索引合适,就需要在这个更新速度与查询速度之间取得⼀个均衡点。

6、对于⼀些数据仓库或者决策型数据库系统,其主要⽤来进⾏查询。

相关的记录往往是在数据库初始化的时候倒⼊。

此时,设置的索引多⼀点,可以提⾼数据库的查询性能。

同时因为记录不怎么更新,所以索引⽐较多的情况下,也不会影响到更新的速度。

即使在起初的时候需要导⼊⼤量的数据,此时也可以先将索引禁⽤掉。

等到数据导⼊完毕后,再启⽤索引。

可以通过这种⽅式来减少索引对数据更新的影响。

相反,如果那些表中经常需要更新记录,如⼀些事务型的应⽤系统,数据更新操作是家常便饭的事情。

此时如果在⼀张表中建⽴过多的索引,则会影响到更新的速度。

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

Oracle视图中建立索引的注意事项
在视图上创建索引需要三个条件:
一、视图必须绑定到架构。

要做到这点,在 CREATE VIEW 语句中,必须加上 WITH SCHEMABINDING,如果是使用企业管理器,则在设计界面的空白处点击右键,属性,选中“绑定到架构”。

二、索引必须是唯一索引。

要做到这点,在 CREATE INDEX 中必须指定 UNIQUE。

三、索引必须是聚集索引。

要做到这点,在 CREATE INDEX 中必须指定 CLUSTERED。

例:
CREATE VIEW viewFoo WITH SCHEMABINDING
AS
SELECT id...
CREATE UNIQUE CLUSTERED INDEX index_viewFoo ON viewFoo(id)
在视图上创建聚集索引之前,该视图必须满足下列要求:
当执行 CREATE VIEW 语句时,ANSI_NULLS 和 QUOTED_IDENTIFIER 选项必须设置为 ON。

OBJECTPROPERTY 函数通
过 ExecIsAnsiNullsOn 或 ExecIsQuotedIdentOn 属性为视图报告此信息。

为执行所有 CREATE TABLE 语句以创建视图引用的表,ANSI_NULLS 选项必须设置为 ON。

视图不能引用任何其它视图,只能引用基表。

视图引用的所有基表必须与视图位于同一个数据库中,并且所有者也与视图相同。

必须使用 SCHEMABINDING 选项创建视图。

SCHEMABINDING 将视图绑定到基础基表的架构。

必须已使用 SCHEMABINDING 选项创建了视图中引用的用户定义的函数。

表和用户定义的函数必须由 2 部分的名称引用。

不允许使用 1 部分、3 部分和 4 部分的名称。

视图中的表达式所引用的所有函数必须是确定性的。

OBJECTPROPERTY 函数
的 IsDeterministic 属性报告用户定义的函数是否是确定性的。

有关更多信息,请参见确定性函数和非确定性函数。

视图中的 SELECT 语句不能包含下列 Transact-SQL 语法元素:
选择列表不能使用 * 或 table_name.* 语法指定列。

必须显式给出列名。

不能在多个视图列中指定用作简单表达式的表的列名。

如果对列的所有(或只有一个例外)引用是复杂表达式的一部分或是函数的一个参数,则可多次引用该列。

例如,下列选择列表是非法的:
SELECT ColumnA, ColumnB, ColumnA
下列选择列表是合法的:
SELECT ColumnA, COUNT(ColumnA), ColumnA + Column B AS AddColAColB F ROM T1
SELECT SUM(ColumnA), ColumnA % ColumnB AS ModuloColAColB, COUNT_BIG (*) FROM T1 GROUP BY ColumnA
派生表。

行集函数。

UNION 运算符。

子查询。

外联接或自联
接。

TOP 子句。

ORDER BY 子句。

DISTINCT 关键字。

COUNT(*)(允许 COUNT_BIG(*)。

) AVG、MAX、MIN、STDEV、STDEVP、VAR 或 VARP 聚合函数。

如果在引用索引视图的查询中指定 AVG、MAX、MIN、STDEV、STDEVP、
VAR 或 VARP,如果视图选择列表包含以下替换函数,则优化器会经常计算需要的结果。

复杂聚合函数替代简单聚合函数
AVG(X)
SUM(X), COUNT_BIG(X)
STDEV(X)
SUM(X), COUNT_BIG(X), SUM(X**2)
STDEVP(X)
SUM(X), COUNT_BIG(X), SUM(X**2)
VAR(X)
SUM(X), COUNT_BIG(X), SUM(X**2)
VARP(X)
SUM(X), COUNT_BIG(X), SUM(X**2)
例如,索引视图选择列表不能包含表达式 AVG(SomeColumn)。

如果视图选择列表包含表达式 SUM(SomeColumn) 和 COUNT_BIG(SomeColumn),
则 SQL Server 可为引用视图并指定 AVG(SomeColumn) 的查询计算平均数。

引用可为空的表达式的 SUM 函数。

全文谓词 CONTAINS 或 FREETEXT。

COMPUTE 或 COMPUTE BY 子句。

如果没有指定 GROUP BY,则视图选择列表不能包含聚合表达式。

如果指定了 GROUP BY,则视图选择列表必须包含 COUNT_BIG(*) 表达式,并且,视图定义不能指定 HAVING、CUBE 或 ROLLUP。

通过一个既可以取值为 float 值也可以使用 float 表达式求值的表达式而生成的列不能作为索引视图或表的索引的键。

CREATE INDEX 语句的要求
在视图上创建的第一个索引必须是唯一聚集索引。

在创建唯一聚集索引后,可创建其它非聚集索引。

视图上的索引命名规则与表上的索引命名规则相同。

唯一区别是表名由视图名替换。

有关更多信息,请参见 CREATE INDEX。

除了一般的 CREATE INDEX 要求外,CREATE INDEX 语句还必须满足下列要求:
执行 CREATE INDEX 语句的用户必须是视图的所有者。

当执行 CREATE INDEX 语句时,下列 SET 选项必须设置为 ON:
ANSI_NULLS ANSI_PADDING ANSI_WARNINGS ARITHABORT CONCAT_NULL_YIEL DS_NULL QUOTED_IDENTIFIERS
必须将选项 NUMERIC_ROUNDABORT 选项设置为 OFF。

视图不能包含 text、ntext 或 image 列,即使在 CREATE INDEX 语句中没有引用它们。

如果视图定义中的 SELECT 语句指定了一个 GROUP BY 子句,则唯一聚集索引的键只能引用在 GROUP BY 子句中指定的列。

注意事项
创建聚集索引后,对于任何试图为视图修改基本数据而进行的连接,其选项设置必须与创建索引所需的选项设置相同。

如果这个执行语句的连接没有适当的选项设置,则 SQL Server 生成错误并回滚任何会影响视图结果集的 INSERT、UPDATE 或 DELETE 语句。

有关更多信息,请参见影响结果的 SET 选项。

若除去视图,视图上的所有索引也将被除去。

若除去聚集索引,视图上的所有非聚集索引也将被除去。

可分别除去非聚集索引。

除去视图上的聚集索引将删除存储的结果集,并且优化器将重新象处理标准视图那样处理视图。

尽管 CREATE UNIQUE CLUSTERED INDEX 语句仅指定组成聚集索引键的列,但视图的完整结果集将存储在数据库中。

与基表上的聚集索引一样,聚集索引
的 B 树结构仅包含键列,但数据行包含视图结果集中的所有列。

若想为现有系统中的视图添加索引,必须计划绑定任何想要放入索引的视图。

可以:
除去视图并通过指定 WITH SCHEMABINDING 重新创建它。

创建另一个视图,使其具有与现有视图相同的文本,但是名称不同。

优化器将考虑新视图上的索引,即使在查询的 FROM 子句中没有直接引用它。

说明不能除去参与到用 SCHEMABINDING 子句创建的视图中的表或视图,除非该视图已被除去或更改而不再具有架构绑定。

另外,如果对参与具有架构绑定的视图的表执行 ALTER TABLE 语句,而这些语句又会影响视图定义,则这些语句将会失败。

必须确保新视图满足索引视图的所有要求。

这可能需要更改视图及其所引用的所有基表的所有权,以便它们都为同一用户所拥有。

相关文档
最新文档