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常⽤索引分析,使⽤原则和注意事项本⽂参考:索引简介• 索引(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在创建索引时要遵循以下的原则:●平衡查询和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索引,索引的建⽴、修改、删除索引,索引的建⽴、修改、删除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创建索引数据库索引是为了提⾼查询速度的⼀种数据结构。
索引的创建语句索引的创建语句⾮常简单。
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 则会⾃动在相应的约束列上建议唯⼀索引。
数据库索引主要进⾏提⾼访问速度。
建设原则: 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 还是会执行一次全表扫描,查询的性能不会比不加索引有所提高,反而可能由于数据库维护索引的系统开销造成性能更差。
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型的字段,在这个字段上有索引,但是下面的语句会执行全表扫描。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 语句,而这些语句又会影响视图定义,则这些语句将会失败。
必须确保新视图满足索引视图的所有要求。
这可能需要更改视图及其所引用的所有基表的所有权,以便它们都为同一用户所拥有。