Oracle 创建索引
oracle数据库创建索引例子
![oracle数据库创建索引例子](https://img.taocdn.com/s3/m/641670d7112de2bd960590c69ec3d5bbfd0ada0f.png)
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-创建索引分区](https://img.taocdn.com/s3/m/50033bc4370cba1aa8114431b90d6c85ec3a88d5.png)
Oracle-创建索引分区对⼤数据量索引进⾏分区同样能够优化应⽤系统的性能。
⼀般来说,如果索引所对应的表的数据量⾮常⼤,⽐如⼏百万甚⾄上千万条数据,则索引也会占⽤很⼤的空间,这时,建议对索引进⾏分区。
Oracle索引分区分为本地索引分区和全局索引分区两种:全局索引不反映基础表的结构,因此,若要分区就只能进⾏范围分区;⽽局部索引反映基础表的结构。
本地索引分区 本地索引分区就是使⽤和分区表同样的分区键进⾏分区的索引,也就是说,索引分区所采⽤的列与该表的分区所采⽤的列是相同的,本地索引有以下优点:如果只有⼀个分区需要维护,则只有⼀个本地索引受影响⽀持分区独⽴性只有本地索引能够⽀持单⼀分区的装⼊和卸载表分区和各⾃的本地索引可以同时恢复本地索引可以单独重复位图索引仅由本地索引⽀持如:创建⼀个表分区,然后根据这个表分区创建本地索引区1.⾸先创建3个表空间,分别存放到3不同磁盘分区中,分别为ts_1,ts_2,ts_32.创建⼀个存储学⽣成绩的分区表studentgrade,该表共有3个分区,分别位于表空间 ts_1,ts_2,ts_3create table studentgrade(id number primary key,name varchar2(10),subject varchar2(10),grade number)partition by range(grade)(partition par_nopass values less than(60) tablespace ts_1,partition par_pass values less than(70) tablespace ts_2,partition par_good values less than(maxvalue) tablespace ts_3)/3.根据表分区创建本地索引分区,与表分区⼀样,索引分区也是3个分区(p1,p2,p3)create index grade_index on studentgrade(grade)local(partition p1 tablespace ts_1,partition p2 tablespace ts_2,partition p3 tablespace ts_3)/4.最后,⽤户可以通过查询dba_ind_partitions视图来查看索引分区信息select partition_name,tablespace_name from dba_ind_partitions where index_name='GRADE_INDEX';全局索引区 全局索引就是没有与分区表相同分区键的分区索引。
oracle create index online原理
![oracle create index online原理](https://img.taocdn.com/s3/m/8fb609cb7d1cfad6195f312b3169a4517723e5cd.png)
oracle create index online原理
Oracle使用在线索引(Online Index)的原理主要是通过直接在表上创建索引,同时允许用户继续对该表执行其他操作,从而极大地提高了工作效率。
在Oracle中,在线索引可以通过以下两种方式创建:
1、使用ALTER INDEX语句:这是非在线创建索引的方式,需要先锁定要操作的表,然后再执行创建索引的操作。
2、使用CREATE INDEX语句:这是在线创建索引的方式,可以在创建索引的同时,允许其他用户继续对表进行操作,从而极大地提高了工作效率。
在创建索引的过程中,Oracle会根据索引的类型以及表的行数自动选择最优的策略来创建索引。
如果表的数据量非常大,还可以使用并行创建索引的技术来加快创建索引的速度。
oracle物化视图及创建索引
![oracle物化视图及创建索引](https://img.taocdn.com/s3/m/b75c79fd4793daef5ef7ba0d4a7302768f996f55.png)
oracle物化视图及创建索引物化视图是⼀种特殊的物理表,“物化”(Materialized)视图是相对普通视图⽽⾔的。
普通视图是虚拟表,应⽤的局限性⼤,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询。
这样对整体查询性能的提⾼,并没有实质上的好处。
1、物化视图的类型:ON DEMAND、ON COMMIT⼆者的区别在于刷新⽅法的不同,ON DEMAND顾名思义,仅在该物化视图“需要”被刷新了,才进⾏刷新(REFRESH),即更新物化视图,以保证和基表数据的⼀致性;⽽ON COMMIT是说,⼀旦基表有了COMMIT,即事务提交,则⽴刻刷新,⽴刻更新物化视图,使得数据和基表⼀致。
2、ON DEMAND物化视图物化视图的创建本⾝是很复杂和需要优化参数设置的,特别是针对⼤型⽣产数据库系统⽽⾔。
但Oracle允许以这种最简单的,类似于普通视图的⽅式来做,所以不可避免的会涉及到默认值问题。
也就是说Oracle给物化视图的重要定义参数的默认值处理是我们需要特别注意的。
物化视图的特点:(1) 物化视图在某种意义上说就是⼀个物理表(⽽且不仅仅是⼀个物理表),这通过其可以被user_tables查询出来,⽽得到佐证;(2) 物化视图也是⼀种段(segment),所以其有⾃⼰的物理存储属性;(3) 物化视图会占⽤数据库磁盘空间,这点从user_segment的查询结果,可以得到佐证;创建语句:create materialized view mv_name as select * from table_name 默认情况下,如果没指定刷新⽅法和刷新模式,则Oracle默认为FORCE和DEMAND。
物化视图的数据怎么随着基表⽽更新? Oracle提供了两种⽅式,⼿⼯刷新和⾃动刷新,默认为⼿⼯刷新。
也就是说,通过我们⼿⼯的执⾏某个Oracle提供的系统级存储过程或包,来保证物化视图与基表数据⼀致性。
这是最基本的刷新办法了。
oracle创建索引
![oracle创建索引](https://img.taocdn.com/s3/m/a82d35342e60ddccda38376baf1ffc4ffe47e2c2.png)
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视图中建立索引的注意事项](https://img.taocdn.com/s3/m/4745e0a40029bd64783e2c98.png)
Oracle视图中建立索引的注意事项在视图上创建索引需要三个条件:一、视图必须绑定到架构。
要做到这点,在 CREATE VIEW 语句中,必须加上 WITH SCHEMABINDING,如果是使用企业管理器,则在设计界面的空白处点击右键,属性,选中“绑定到架构”。
二、索引必须是唯一索引。
要做到这点,在 CREATE INDEX 中必须指定 UNIQUE。
三、索引必须是聚集索引。
要做到这点,在 CREATE INDEX 中必须指定 CLUSTERED。
例:CREATE VIEW viewFoo WITH SCHEMABINDINGASSELECT 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 属性报告用户定义的函数是否是确定性的。
Oracle索引详解
![Oracle索引详解](https://img.taocdn.com/s3/m/68ae26f40875f46527d3240c844769eae009a305.png)
一.索引介绍1.1 索引的创建语法:CREATE UNIUQE | BITMAP INDEX <schema>.<index_name>ON <schema>.<table_name>(<column_name> | <expression> ASC | DESC,<column_name> | <expression> ASC | DESC,...)TABLESPACE <tablespace_name>STORAGE <storage_settings>LOGGING | NOLOGGINGCOMPUTE STATISTICSNOCOMPRESS | COMPRESS<nn>NOSORT | REVERSEPARTITION | GLOBAL PARTITION<partition_setting>相关说明1) UNIQUE | BITMAP:指定UNIQUE为唯一值索引,BITMAP为位图索引,省略为B-Tree索引。
2)<column_name> | <expression> ASC | DESC:可以对多列进行联合索引,当为expression 时即“基于函数的索引”3)TABLESPACE:指定存放索引的表空间(索引和原表不在一个表空间时效率更高)4)STORAGE:可进一步设置表空间的存储参数5)LOGGING | NOLOGGING:是否对索引产生重做日志(对大表尽量使用NOLOGGING来减少占用空间并提高效率)6)COMPUTE STATISTICS:创建新索引时收集统计信息7)NOCOMPRESS | COMPRESS<nn>:是否使用“键压缩”(使用键压缩可以删除一个键列中出现的重复值)8)NOSORT | REVERSE:NOSORT表示与表中相同的顺序创建索引,REVERSE表示相反顺序存储索引值9)PARTITION | NOPARTITION:可以在分区表和未分区表上对创建的索引进行分区1.2 索引特点:第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
创建Oracle数据库索引的三个标准
![创建Oracle数据库索引的三个标准](https://img.taocdn.com/s3/m/9de267d6ad51f01dc281f191.png)
在Oracle数据库中,创建索引虽然比较简单。
但是要合理的创建索引则比较困难了。
笔者认为,在创建索引时要做到三个适当,即在适当的表上、适当的列上创建适当数量的索引。
虽然这可以通过一句话来概括优化的索引的基本准则,但是要做到这一点的话,需要数据库管理员做出很大的努力。
具体的来说,要做到这个三个适当有如下几个要求。
一、根据表的大小来创建索引。
虽然给表创建索引,可以提高查询的效率。
但是数据库管理员需要注意的是,索引也需要一定的开销的。
为此并不是说给所有的表都创建索引,那么就可以提高数据库的性能。
这个认识是错误的。
恰恰相反,如果不管三七二十一,给所有的表都创建了索引,那么其反而会给数据库的性能造成负面的影响。
因为此时滥用索引的开销可能已经远远大于由此带来的性能方面的收益。
所以笔者认为,数据库管理员首先需要做到,为合适的表来建立索引,而不是为所有的表建立索引。
一般来说,不需要为比较小的表创建索引。
如在一个ERP系统的数据库中,department表用来存储企业部门的信息。
一般企业的部分也就十几个,最多不会超过一百个。
这100条记录对于人来说,可能算是比较多了。
但是对于计算机来说,这给他塞塞牙缝都还不够。
所以,对类似的小表没有必要建立索引。
因为即使建立了索引,其性能也不会得到很大的改善。
相反索引建立的开销,如维护成本等等,要比这个要大。
也就是说,付出的要比得到的多,显然违反常理。
另外,就是对于超大的表,也不一定要建立索引。
有些表虽然比较大,记录数量非常的多。
但是此时为这个表建立索引并一定的合适。
如系统中有一张表,其主要用来保存数据库中的一些变更信息。
往往这些信息只给数据库管理员使用。
此时为这张表建立索引的话,反而不合适。
因为这张表很少用到,只有在出问题的时候才需要查看。
其次其即使查看,需要查询的纪录也不会很多,可能就是最近一周的更新记录等等。
对于对于一些超大的表,建立索引有时候往往不能够达到预计的效果。
而且在打表上建立索引,其索引的开销要比普通的表大的多。
Oracle数据库——索引、视图、序列和同义词的创建
![Oracle数据库——索引、视图、序列和同义词的创建](https://img.taocdn.com/s3/m/e0f524210166f5335a8102d276a20029bd64636d.png)
Oracle数据库——索引、视图、序列和同义词的创建⼀、涉及内容 1.理解索引的概念和类型。
2.掌握创建索引的命令。
3.理解视图的概念和优点。
4.理解可更新视图应具备的特点。
5.掌握创建⼀般视图和可更新视图的命令。
6.理解序列和同义词的概念和作⽤。
7.掌握序列的创建与应⽤。
8.掌握同义词的创建与应⽤。
⼆、具体操作(实验)1.在数据库中创建Student表,包括学号Id、姓名Name、性别Sex、班级编号Class_id。
利⽤该表创建如下索引:(1)在Id字段上创建唯⼀的B树索引。
(2)在Name字段上创建普通的B树索引。
(3)在Sex 字段上创建位图索引。
语句:--建表:create table Student(Id char(6),Name varchar2(8),Sex char(2),Class_id char(4));create unique index index_id on Student(Id);create index index_name on Student(Name);create bitmap index index_sex on Student(Sex);截图:2.利⽤scott.emp 表创建视图并完成以下操作:(1)创建简单视图。
语句:conn scott/tiger;grant insert,update,delete on emp to system;conn system/orcl1234;create or replace VIEW v_empasselect empno,ename,job,hiredate,deptnofrom scott.emp;截图:(2)查看视图的结构。
语句:SQL> desc v_emp;截图:(3)从视图中查询数据。
语句:SQL> select * from v_emp where deptno=10;截图:(4)查看视图中各字段的可更新性。
oracle创建hash索引的语句
![oracle创建hash索引的语句](https://img.taocdn.com/s3/m/298ef55ffe00bed5b9f3f90f76c66137ee064fcb.png)
一、概述在Oracle数据库中,可以通过使用CREATE INDEX语句创建hash 索引。
hash索引是一种特殊的索引类型,它通过将索引列的值经过散列函数计算,将计算得到的散列值与对应的行存储在索引中。
相比于传统的B-tree索引,hash索引在某些特定场景下有着更好的性能表现。
接下来,我们将介绍在Oracle数据库中创建hash索引的语法和使用方法。
二、语法在Oracle数据库中,使用CREATE INDEX语句创建hash索引的语法如下所示:```SQLCREATE INDEX index_nameON table_name (column_name)TABLESPACE tablespace_nameHASHKEYS hash_key_number;```其中,各个参数的含义如下:- index_name:指定要创建的索引的名称。
- table_name:指定要在哪张表上创建索引。
- column_name:指定要创建索引的列名。
- tablespace_name:指定索引所在的表空间。
- hash_key_number:指定散列桶的数量。
三、示例下面我们通过一个具体的示例来演示如何在Oracle数据库中创建hash索引。
假设我们有一个名为employee的表,其中包含了id和name两个字段。
我们希望为name字段创建一个hash索引,语句如下:```SQLCREATE INDEX name_indexON employee (name)TABLESPACE index_tablespaceHASHKEYS 100;```在这个示例中,我们为employee表的name字段创建了一个名为name_index的hash索引,该索引存储在index_tablespace表空间中,并且指定了100个散列桶。
四、注意事项在使用CREATE INDEX语句创建hash索引时,需要注意以下几点:1. 散列桶数量的选择:散列桶的数量直接影响了hash索引的性能,通常情况下应该选择一个合适的值来平衡索引的分布和查询性能。
oracle建立主键与索引【转】
![oracle建立主键与索引【转】](https://img.taocdn.com/s3/m/75412dad0129bd64783e0912a216147917117ef3.png)
oracle建⽴主键与索引【转】此⽂转⾃:/s/blog_439f80c4010094n1.html创建主键:alter table T add primary key (V)T是表名,V是列名创建索引:create index F2009100000NMINFOSYS_XIANG on f2009100000nminfo( SYS_XIANG );创建⼀般索引,索引名为表名+列名create unique index F2009100000NMINFO SYS_ZDM on f2009100000nminfo( SYS_ZDM );创建唯⼀索引create BITMAP index F2009100000NMINFOSYS_XIANG on f2009100000nminfo( SYS_XIANG );创建位图索引完整语法如下:CREATE (UNIQUE|BITMAP) INDEX [⽤户名.]索引名 ON [⽤户名.]表名 (列名 [ ASC | DESC], [列名 [ ASC | DESC]]...) [ TABLESPACE 表空间名 ][ PCTFREE 正整型数 ][ INITRANS 正整型数 ][ MAXTRANS 正整型数 ][ 存储⼦句 ][ LOGGING | NOLOGGING ][ NOSORT ]Oracle中怎么知道表没有建⽴主键?⼀般的情况下,表的主键是必要的,没有主键的表可以说是不符合设计规范的。
SELECT table_name FROM User_tables t WHERE NOT EXISTS(SELECT table_name FROM User_constraints c WHERE constraint_type = 'P' AND t.table_name=c.table_name)其它相关数据字典解释user_tables 表user_tab_columns 表的列user_constraints 约束user_cons_columns 约束与列的关系user_indexes 索引Oracle建⽴⾃增主键⾸先,你要有⼀张表!CREATE TABLE example(ID Number(4) NOT NULL PRIMARY KEY,NAME VARCHAR(25),PHONE VARCHAR(10),ADDRESS VARCHAR(50));如果对于以上的建表语句还有疑问的话,建议您不要继续了!有那么些时间您还不如去看看⾦庸读读琼瑶!然后,你需要⼀个⾃定义的sequenceCREATE SEQUENCE emp_sequenceINCREMENT BY 1 -- 每次加⼏个START WITH 1 -- 从1开始计数NOMAXVALUE -- 不设置最⼤值NOCYCLE -- ⼀直累加,不循环NOCACHE -- 不建缓冲区以上代码完成了⼀个序列(sequence)的建⽴过程,名称为emp_sequence,范围是从1开始到⽆限⼤(⽆限⼤的程度是由你机器决定的),nocycle 是决定不循环,如果你设置了最⼤值那么你可以⽤cycle 会使seq到最⼤之后循环.对于nocache顺便说⼀下如果你给出了cache值那么系统将⾃动读取你的cache值⼤⼩个seq,这样在反复操作时会加快运⾏速度,但如果遭遇意外情况如当机了或oracle死了,则下次取出的seq值将和上次的不连贯.(如果连不连贯⽆所谓建议⽤cache,因为时间就是⾦钱呀!跑题了!)书接上⽂,你只有了表和序列还不够,还需要⼀个触发器来执⾏它!代码如下:CREATE TRIGGER "触发器名称" BEFOREINSERT ON example FOR EACH ROW WHEN (new.id is null)beginselect emp_sequence.nextval into: new.id from dual;end;打完收⼯!下⾯你就试试插⼊数据吧!INSERT INTO example(Name,phone,address) Values('Cao','56498543','Heibei');Primary Key与Unique KeyPrimary key 与Unique Key都是唯⼀性约束。
Oracle数据库_7.Oracle索引和视图创建(1)
![Oracle数据库_7.Oracle索引和视图创建(1)](https://img.taocdn.com/s3/m/6e92aeaccc22bcd126ff0c9e.png)
(1)索引创建与管理
本章内容
1 2 索引概述 创建索引
3
4
修改索引
查看索引
1 Oracle索引概述
一、索引的概念
索引是建立在表上的可选对象,设计索引的目的是为 了提高查询的速度。但同时索引也会增加系统的负担,进 行影响系统的性能。 目录可以帮助读者快速查找所需要的内容,数据库中的 索引就类似于书的目录。有了索引,DML操作就能快速找 到表中的数据,而不需要扫描整张表。因此,对于包含大 量数据的表来说,设计索引,可以大大提高操作效率。在 书中,目录是内容和页码的清单,而在数据库中,索引是 数据和存储位置的列表。
四、管理索引的原则
使用索引的目的是为了提高系统的效率,但同时它也会 增加系统的负担,进行影响系统的性能,因为系统必须在 进行DML操作后维护索引数据。 在新的SQL标准中并不推荐使用索引,而是建议在创建 表的时候用主键替代。因此,为了防止使用索引后反而降 低系统的性能,应该遵循一些基本的原则。
四、管理索引的原则
在创建索引时,Oracle会将索引的定义信息存放在数据字典 中,可以通过查询数据字典视图DBA_INDEXES、ALL_ INDEXES和USER_ INDEXES来查看。
命令查看: desc user_indexes desc all_indexes select index_name ,index_type,table_name,uniqueness From user_indexs;
四、管理索引的原则
6.LONG和LONG RAW列不能创建索引。 7.经常进行连接查询的列上应该创建索引。 8.在使用CREATE INDEX语句创建查询时,将最常查询 的列放在其他列前面。 9.维护索引需要开销,特别时对表进行插入和删除操作 时,因此要限制表中索引的数量。对于主要用于读的表, 则索引多就有好处,但是,一个表如果经常被更改,则索 引应少点。 10.在表中插入数据后创建索引。如果在装载数据之前创 建了索引,那么当插入每行时,Oracle都必须更改每个索 引。
第6章 Oracle索引(创建、简介、技巧)
![第6章 Oracle索引(创建、简介、技巧)](https://img.taocdn.com/s3/m/f1b270a96394dd88d0d233d4b14e852458fb39f5.png)
四、管理索引的原则
使用索引的目的是为了提高系统的效率,但同时它也会 增加系统的负担,进行影响系统的性能,因为系统必须在 进行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数据库中建立索引的基本方法讲解](https://img.taocdn.com/s3/m/12ceee12a7c30c22590102020740be1e650eccb5.png)
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重建索引](https://img.taocdn.com/s3/m/bdacc60603d8ce2f0066232c.png)
Oracle 重建索引当我们创建索引时,oracle会为索引创建索引树,表和索引树通过rowid(伪列)来定位数据。
当表里的数据发生更新时,oracle会自动维护索引树。
但是在索引树中没有更新操作,只有删除和插入操作。
例如在某表id列上创建索引,某表id列上有值“101”,当我将“101”更新为“110”时,oracle同时会来更新索引树,但是oracle先将索引树中的“101”标示为删除(实际并未删除,只是标示一下),然后再将“110”写到索引树中。
如果表更新比较频繁,那么在索引中删除标示会越来越多,这时索引的查询效率必然降低,所以我们应该定期重建索引。
来消除索引中这些删除标记。
一般不会选择先删除索引,然后再重新创建索引,而是rebuild索引。
在rebuild期间,用户还可以使用原来的索引,并且rebuild新的索引时也会利用原来的索引信息,这样重建索引会块一些。
这个实验来察看索引中的删除标记,并且如何重建索引。
试验环境:oracle 8.1.7一、创建表、插入记录和创建索引SQL> create table ind (id number,name varchar2(100));表已创建。
SQL> create or replace procedure sp_insert_ind2 is3 begin4 for i in 1..10000 loop5 insert into ind values(i,to_char(i)||'aaaaaaaaaa');6 end loop;7 end;8 /过程已创建。
SQL> exec sp_insert_indPL/SQL 过程已成功完成。
SQL> create index ind_id_idx on ind(id);索引已创建。
二、收集索引信息--收集信息,没有更新数据字典,所以没有信息SQL> select lf_rows,lf_rows_len,del_lf_rows,del_lf_rows_len from index_stats;未选定行--更新数据字典SQL> ANALYZE INDEX ind_id_idx VALIDATE STRUCTURE;索引已分析--参数含义:--LF_ROWS Number of values currently in the index--LF_ROWS_LEN Sum in bytes of the length of all values--DEL_LF_ROWS Number of values deleted from the index--DEL_LF_ROWS_LEN Length of all deleted valuesSQL> select lf_rows,lf_rows_len,del_lf_rows,del_lf_rows_len from index_stats;LF_ROWS LF_ROWS_LEN DEL_LF_ROWS DEL_LF_ROWS_LEN---------- ----------- ----------- ---------------10000 149801 0 0--察看索引中已经标示为删除的行除以总共的行的数量,目前为0SQL> SELECT (DEL_LF_ROWS_LEN/LF_ROWS_LEN) * 100 AS index_usage FROM index_stats;INDEX_USAGE-----------三、更新索引,并且重新察看信息--更新表中1000行记录,这时会更新索引树SQL> update ind set id=id+1 where id>9000;已更新1000行。
ORACLE索引,索引的建立、修改、删除
![ORACLE索引,索引的建立、修改、删除](https://img.taocdn.com/s3/m/94cfd1eb760bf78a6529647d27284b73f24236aa.png)
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数据库的字段上建立索引](https://img.taocdn.com/s3/m/c153eae50b4c2e3f5627631a.png)
如何在ORACLE数据库的字段上建立索引?Oracle中建立索引,会提高查询速度:create index 索引名on 表名(列名);例如:create index index_userid on tbl_detail(userid);如何找数据库表的主键字段的名称?SELECT * FROM user_constraints WHERE CONSTRAINT_TYPE='P' and table_name='AAA';select * from dba_cons_columns where CONSTRAINT_NAME='SYS_AAA';Oracle 在创建主键(可以不加constraint SYS_AAA),会为库表自动创建索引,索引的列为主键列。
并且当库表某些列名或者库表名改变时候,Oracle自动创建的索引SYS_AAA,中的索引列也会自动更新(类似于视图),并且SYS_AAA会与名字更改后的库表还是保持索引关系。
关键系统库表:desc dba_constraintsdesc dba_cons_columnsdesc dba_indexesdesc dba_ind_columnsdesc DBA_TAB_COLUMNS例子1:更改库表的列名ALTER TABLE AAA RENAME COLUMN ID TO AAA_ID;create table AAA (ID NUMBER(8),NAME CHAR(20),constraint SYS_AAA primary key(ID));.n ] )[ WITH < index_option > [ ,...n] ][ ON filegroup ]< index_option > ::={ PAD_INDEX |FILLFACTOR = fillfactor |IGNORE_DUP_KEY |DROP_EXISTING |STATISTICS_NORECOMPUTE |SORT_IN_TEMPDB参数UNIQUE为表或视图创建唯一索引(不允许存在索引值相同的两行)。
Oracle建立索引及SQL优化
![Oracle建立索引及SQL优化](https://img.taocdn.com/s3/m/15c47039bc64783e0912a21614791711cc797927.png)
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重建索引](https://img.taocdn.com/s3/m/8a13a434cc17552706220818.png)
重建索引有多种方式,如drop and re-create、rebuild、rebuild online等。
下面简单比较这几种方式异同以及优缺点:首先建立测试表及数据:SQL> CREATE TABLE TEST AS SELECT CITYCODE C1 FROM CITIZENINFO2;Table createdSQL> ALTER TABLE TEST MODIFY C1 NOT NULL;Table alteredSQL> SELECT COUNT(1) FROM TEST;COUNT(1)----------16000000一、drop and re-create和rebuild首先看看正常建立索引时,对表的加锁情况。
suk@ORACLE9I> @show_sidSID----------14suk@ORACLE9I> CREATE INDEX IDX_TEST_C1 ON TEST(C1);索引已创建。
SQL> SELECT obxxxxject_NAMELMODE FROM V$LOCK LDBA_obxxxxjectS O WHERE O.obxxxxject_ID=L.ID1 AND L.TYPE='TM' AND SID=14;obxxxxject_NAME LMODE------------------------------ ----------OBJ$ 3TEST 4可见,普通情况下建立索引时,oracle会对基表加share锁,由于share锁和 row-X是不兼容的,也就是说,在建立索引期间,无法对基表进行DML操作。
对于删除重建索引的方法就不介绍了,它与上面的描述是一样的,下面我们看看用rebuild的方式建立索引有什么特别。
suk@ORACLE9I> ALTER INDEX IDX_TEST_C1 REBUILD;索引已更改。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle创建索引
Oracle在创建索引时要遵循以下的原则:
●平衡查询和DML的需要。
在易挥发(DML操作频繁)的表上尽量减少索引的数量,
因为索引虽然加快了查询的速度,但却降低了DML操作速度。
●将其放入单独的表空间,不要与表、临时段或还原(回滚)段放在一个表空间,因为索
引段会与这些段竞争输入/输出(I/O)。
●使用统一的EXTENT尺寸:数据块尺寸的5倍,或表空间的MINIMUM EXTENT的尺
寸。
这样做的目的是为了减少系统的转换时间。
●对大索引可以考虑使用NOLOGGING。
这样做的目的是通过减少REDO操作来提高系
统的效率,但是如果一旦系统发生崩溃,则该索引一般是无法进行完全灰度的。
不过问题也不是很大,因为真正的数据还在表中,所以可以通过重建该索引来恢复与之前完全相同的效果。
●索引的INITRANS参数通常应该比相对应表的高。
以为索引项要比表中的数据行小的
多,所以一个数据块可以存放更多的索引项(记录)。
创建索引的命令格式:
CREATE (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:在索引中不能说明该参数。
因为索引记录必须以正确的顺序存放,所以用
户不能控制何时向索引块中插入索引数据行
使用数据字典的dba_indexes获取有关scott用户的索引基于表、所在的表空间、索引的类型和索引的状态等信息。
SQL> select index_name,table_name,tablespace_name,index_type,
uniqueness,status from dba_indexes
where owner = 'SCOTT' AND INDEX_NAME not like 'SYS%'
INDEX_NAME TABLE_NAME TABLESPACE_NAME INDEX_TYPE UNIQUENES STATUS -------------------- ---------- --------------- ---------- --------- ------
PK_DEPT DEPT USERS NORMAL UNIQUE VALID PK_EMP EMP USERS NORMAL UNIQUE VALID 使用数据字典dba_ind_columns获得scott用户的索引所基于表和列的等信息。
SQL>select index_name,table_name,column_name,index_owner,table_owner
2 from dba_ind_columns
3* where table_owner = 'SCOTT' and index_name not like 'SYS%'
INDEX_NAME TABLE_NAME COLUMN_NAME INDEX_OWNER TABLE_OWNER -------------------- ---------- --------------- ------------ -----------
PK_EMP EMP EMPNO SCOTT SCOTT
PK_DEPT DEPT DEPTNO SCOTT SCOTT 创建索引:
SQL> CREATE INDEX scott.emp_ename_idx
2 ON scott.emp(ename)
3 PCTFREE 20
4 STORAGE(INITIAL 100K NEXT 100K
5 PCTINCREASE 0 MAXEXTENTS 100)
6* TABLESPACE PIONEER_INDEX
索引已创建。
SQL> CREATE BITMAP INDEX scott.emp_job_idx
2 ON scott.emp(job)
3 PCTFREE 20
4 STORAGE(INITIAL 100K NEXT 100K
5 PCTINCREASE 0 MAXEXTENTS 100)
6 TABLESPACE PIONEER_INDEX;
查看所创建的索引的存储参数是不是按着命令设置的:
SQL> select index_name,pct_free,pct_increase,initial_extent,next_extent
2 from dba_indexes
3 where owner = 'SCOTT' AND INDEX_NAME not like 'SYS%';
INDEX_NAME PCT_FREE PCT_INCREASE INITIAL_EXTENT NEXT_EXTENT -------------------- ---------- ------------ -------------- -----------
PK_DEPT 10 65536
PK_EMP 10 65536
EMP_ENAME_IDX 20 0 106496 1048576
EMP_JOB_IDX 20 0 106496 1048576。