Oracle 创建索引

合集下载

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-创建索引分区

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原理

oracle create index online原理
Oracle使用在线索引(Online Index)的原理主要是通过直接在表上创建索引,同时允许用户继续对该表执行其他操作,从而极大地提高了工作效率。

在Oracle中,在线索引可以通过以下两种方式创建:
1、使用ALTER INDEX语句:这是非在线创建索引的方式,需要先锁定要操作的表,然后再执行创建索引的操作。

2、使用CREATE INDEX语句:这是在线创建索引的方式,可以在创建索引的同时,允许其他用户继续对表进行操作,从而极大地提高了工作效率。

在创建索引的过程中,Oracle会根据索引的类型以及表的行数自动选择最优的策略来创建索引。

如果表的数据量非常大,还可以使用并行创建索引的技术来加快创建索引的速度。

oracle物化视图及创建索引

oracle物化视图及创建索引

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创建索引

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视图中建立索引的注意事项在视图上创建索引需要三个条件:一、视图必须绑定到架构。

要做到这点,在 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索引详解

一.索引介绍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数据库索引的三个标准

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

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

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

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

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

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

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

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

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

这个认识是错误的。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

而且在打表上建立索引,其索引的开销要比普通的表大的多。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

相关文档
最新文档