有些新手在Oracle数据库中创建索引时往往不会使用可选项。其实,有时候在合适的场合使用一些可选项,可以提高索引的创建速度。如为了大批量导入数据,我们往往会先取消索引其以提高插入的速度。然后等数据导入完毕后再重新创建索引。在这个过程中如果能够采用一些可选项,则可以缩短索引创建的时间。在Oracle数据库中提供了丰富的可选项。我们常用的可选项主要有以下这些。
可选项一:NOSORT,记录排序可选项。
默认情况下,在表中创建索引的时候,会对表中的记录进行排序,排序成功后再创建索引。但是当记录比较多的是,这个排序作业会占用比较多的时间,这也就增加了索引建立的时间(排序作业是在索引创建作业中完成)。有时候,我们导入数据的时候,如采用insert into 语句插入数据过程中同时采用Order by子句对索引字段进行了排序。此时如果在索引创建过程中再进行排序的话,就有点脱裤子放屁,多此一举了。为此在重新创建索引时,如果表中的数据已经排好序了(按索引字段排序),那么在创建索引时就不需要为此重新排序。此时在创建索引时,数据库管理员就可以使用NOSORT可选项,告诉数据库系统不需要对表中当记录进行重新排序了。
采用了这个选项之后,如果表中的记录已经按顺序排列,那么在重新创建索引的时候,就不会重新排序,可以提高索引创建的时间,节省内存中的排序缓存空间。相反,如果表中的记录是不按索引关键字排序的话,那么此时采用NOSORT关键字的话,系统就会提示错误信息,并拒绝创建索引。所以在使用NOSORT可选项的时候,数据库管理员尽管放心大胆的使用。因为其实在不能够使用这个选项的时候,数据库也会明确的告知。为此其副作用就比较少,数据库管理员只需要把这个可选项去掉然后重新执行一次即可。不过这里需要注意的是,如果表中的记录比较少的话,那么使用NOSORT选项的效果并不是很明显。当采用insert into批量导入数据,并在这个过程中采用了Order by子句对索引关键字进行了排序的话,则此时采用NOSORT选项的话,往往能够起到比较好的效果。
可选项二:NOLOGGING,是否需要记录日志信息。
在创建索引的时候,系统会把相关的信息存储到日志信息中去。如果表中的记录比较多,则需要一一的把这些信息记录到日志文件中,这显然会让数据库增加很大的工作量。从而增加索引创建的时间。为此在创建索引的过程中,如果有必要时,我们可以采用NOLOGGING选项,让数据库在创建索引的过程中,不产生任何重做日志信息。此时当表中的记录比较多时,就可以明显提高速度。
但是默认情况下,数据库在在创建索引时,是不采用这个选项的,即会把相关的信息保存到重做日志中去。这虽然降低了索引创建的效率,但是如果遇到什么意外的话,却可以利用重做日志来进行恢复。所以,此时数据库管理员就比较难以抉择了。一方面是数据的安全,另一方面是索引创建的速度。根据笔者的经验,只要数据库服务器比较稳定,而数据库中约束机制又比较完善的话,那么在创建索引的过程中一般不会出现问题,可以放心大胆的使用这个可选项。
但是如果数据库已经使用了好几年了。后来因为某种原因需要重建索引。在这种情况下,由于数据库使用过程中很多因素数据库管理员无法控制。此时为这种类型的数据库创建索引时,为了保险起见还是不要采用这个选项好。因为此时遇到错误的几率相对来说会搞一点。为此此时牺牲一下索引创建的速率,而提高数据的安全性还是有必要的。万一遇到什么问题时,可以通过重做日志来及时的恢复数据,为企业用户减少损失。
可选项三:COMPUTE STATISTICS,是否生成统计信息。
如果管理员在创建索引时采用了这个选项,则数据库将在创建索引的过程中以非常小的代价直接生成关于索引的相关统计信息,然后把这些信息存储在数据字典中。这就可以避免以后对索引进行分析统计,而且优化器在优化SQL语句的时候可以随机使用这些统计信息,以确定是否生成使用该索引的执行计划。通常情况下,在生成索引的过程中统计索引的相关信息,其所花的代价是最小的。无论从时间上,还是从硬件资源的耗费上,都是非常小的。所以,在创建索引的过程中统计相关的索引信息是非常有用的。
但是默认情况下,数据库是不采用这个选项的。这主要是因为一些事物处理系统,索引的信息是经常需要发生变化的。如果在索引创建的过程中统计了相关信息。这些信息随着索引的调整等等原因会很快的过时。所以说,其在默认情况下没有采用这个选项。可见这个选项并不是在任何情况下都能够起到效果。但是如果这个数据库系统是一个决策支持系统。其数据、索引等等在一段时间内基本上是稳定不变的。此时在创建索引时可以使用这个选项。如此的话,在生成索引时可以以最小的代价生成这些统计信息,方便优化器使用。笔者在部署数据库应用的时候,对于事务型的数据库系统,一般不会启用这个选项。但是对于一些决策性的数据库系统或者数据仓库中,创建索引时则笔者喜欢采用这个选项。这有助于提高数据库的性能。因为优化器在生成执行计划时,可以直接采用这个统计信息。所以,数据库能够在最短的时间内确定需要采用的执行计划。而且在执行计划制定中参考了这个索引统计信息,为此所生成的执行计划在同等条件下可能更加的合理。
可选项四:ONLINE,DML操作与创建索引操作是否可以同时进行。
默认情况下,数据库系统是不允许DML操作与创建索引的操作同时进行的。也就是说,在创建索引的过程中,是不允许其他用户对其所涉及的表进行任何的DML操作。这主要是因为对基础表进行DML操作时,会对基础表进行加锁。所以在基础表上的DDL事务没有递交之前,即没有对基础表进行解锁之前,是无法对这基础表创建索引的。反之亦然。显然此时数据库没有采用这个ONLIE选项,继之DML操作与创建索引操作同时进行,主要是从创建索引的效率出发的。防止因为两个作业相互冲突,从而延长某个作业的运行时间。
但是有时会我们必须允许他们进行同时操作。如用户可能一刻都不能够离开数据库系统,需要时时刻刻对数据库基础表进行DML操作。而此时由于某些原因,数据库管理员又需要重新建立索引时,那么不得不在创建索引的语句中加入这个ONLINE选项。让他们同时运行。此时虽然可能会延长索引创建作业的时间,但是可以保障用户DML操作能够正常进行。有时候牺牲这个代价是值得的。用户是不能够等的,而我们数据库管理员则可以勉强的等一会儿。
当然,如果用户对于这个DML操作及时性没有这么高。如数据库管理员在晚上员工没有使用数据库时创建索引时,则可以不带这个选项。在限制用户对基础表进行DML操作的同时,提高数据库创建索引的效率。
可选项五:PARALLEL,多服务进程创建索引。
默认情况下,Oracle数据库系统不采用这个选项。这并不是说这个选项不可用,而是因为大多数情况下企业部署Oracle数据库时所采用的数据库服务器往往只有单个CPU。此时数据库系统是用一个服务进程来创建索引的。
如果企业的服务器有多个CPU的话,则可以在创建索引时采用这个选项。因为只要采用了这个选项,则数据库就会使用多个服务进程来并行的创建索引,以提高索引创建的速度。为此,在同等条件下,多服务并行创建进索引并单服务创建索引速度要快的多。所以如果服务器中有多个CPU,而且需要创建的索引比较多或者基础表中记录比较多的话,则采用这个选项能够大幅度的提高索引的创建效率。
故笔者建议,如果采用多CPU的服务器时,最好在创建索引时使用这个选项。不能够浪费了服务器的CPU呀。不然的话,多CPU服务器的优势就体现不出来了。为此采用这个选项,也是物尽其用。
分享到:
相关推荐
为了理解如何优化创建索引的过程,首先需要了解Oracle创建索引时涉及的主要I/O操作: 1. **RA**:对源表加X类型的表级DDL锁。 2. **RB**:读取源表数据块的I/O。 3. **RC**:索引键排序,如果内存中无法容纳所有的...
总之,Oracle的索引学习涵盖了从索引创建、选择合适的索引类型、理解数据操作对索引的影响,到使用Autotrace和DBMS_XPLAN进行性能分析等多个方面。深入理解和实践这些知识点,能帮助我们更好地管理和优化Oracle...
自从Oracle 7.3版本开始引入了这一特性,允许用户通过Oracle服务器提供的上下文(ConText)选项来执行基于文本的数据查询。随着版本的迭代,该功能在Oracle 8i中被重命名为InterMediaText,在Oracle 9i中则进一步...
Oracle 创建数据库表空间 Oracle 是一种流行的关系数据库管理系统,创建数据库表空间是 Oracle 数据库管理员的一项基本任务。本文将详细介绍如何在 Linux 环境下创建和删除 Oracle 表空间及用户。 一、创建临时表...
当在WHERE子句中使用了函数或者表达式来处理索引列时,Oracle可能无法有效地利用该索引。例如,使用`SUBSTR`, `DECODE`, `INSTR`等函数来处理索引字段。 **解决办法**: - 尝试重构SQL语句,避免在索引列上使用这些...
创建索引时,可以选择特定的表空间,并设置适当的存储参数,如pctfree、initrans、maxtrans、minextents和maxextents,以优化空间利用率。 在处理大型表时,可以考虑并行创建索引,这可以显著减少创建时间并提高...
首先,创建索引的语法是关键。在Oracle中,索引可以通过`CREATE INDEX`语句来创建,可以选择`UNIQUE`或`BITMAP`类型,其中`UNIQUE`确保索引值的唯一性,`BITMAP`适用于数据仓库环境。可以对一或多列创建索引,并指定...
创建索引时,Oracle Text可使用若干个默认值,但在大多数情况下要求用户通过指定首选项来配置索引。每个索引的许多选项组成功能组,称为"类",每个类集中体现配置的某一方面,可以认为这些类就是与文档数据库有关的...
其中,`index_name`是为索引指定的名称,`table_name`是要在其上创建索引的表名,`column_name`是索引将基于其值进行排序的列名。 然而,在实验的第10步中,使用`DROP INDEX`语句错误地删除了名为`ss`的索引,实际...
Oracle Spatial设计时考虑了这一点,提供了灵活的索引管理选项。 综上所述,Oracle Spatial通过其完备的组件和索引机制为管理和分析空间数据提供了强大的支持。无论是处理大规模的空间数据集还是执行复杂的查询任务...
`ONLINE`选项表示在创建索引时是否允许其他用户对表进行读写操作。 总的来说,Oracle全文检索技术提供了强大的文本搜索和分析能力,使得在大规模文本数据中快速定位相关信息成为可能。它结合了词法分析、索引优化和...
在Oracle数据库中,表空间(Tablespace)是存储数据的主要单位,它由一个或多个数据文件组成,用于容纳数据库对象如表、索引等。在Oracle企业管理器(Oracle Enterprise Manager,简称Oracle EM)中创建表空间是...
在Oracle数据库管理中,创建表空间和用户是基础但至关重要的操作,这直接影响到数据库的性能、安全性和数据管理效率。以下将详细解析如何在Oracle数据库中创建表空间和用户,以及这一过程中涉及的关键概念和步骤。 ...
- 使用nologging选项创建索引,以节省重做日志空间和提高效率。 6. **最佳实践**: - 使用`CREATE INDEX`语句创建索引,指定表空间、存储参数等。 - 创建基于函数的索引,如`UPPER`、`LOWER`等,以提高查询效率...
函数索引允许在创建索引时应用函数,使得索引基于计算后的值而非原始数据值。这在处理复杂的查询条件时非常有用。 **特点:** - 支持在索引定义中使用函数。 - 提高了基于计算字段的查询性能。 - 可以用于优化复杂...
在选择Oracle基目录时,还需输入全局数据库名(例如`orcl`)和管理员口令(例如`password`)。注意,Oracle建议的管理员口令应符合特定的安全标准,即使输入的口令不符合建议,仍可以选择继续。 在执行先决条件检查...
Oracle Text完全集成在Oracle数据库中,使得文本索引的创建与管理更加便捷高效,并且可以通过SQL查询实现无缝搜索。此外,Oracle Text还提供了许多额外服务,帮助用户根据特定搜索条件更快地访问数据库。 #### ...
对于大表,可以考虑并行创建索引和使用nologging选项以减少重做日志的使用,加快创建速度。 创建最佳索引的方法包括: - 明确定义索引,例如指定表空间、存储参数和是否唯一。 - 使用函数索引,如在包含字符串的列...
在Oracle数据库中,题目涉及了多个关键知识点,包括SQL语句的使用、数据库约束、DDL语句、视图创建、事务处理以及更新查询等。以下是对这些知识点的详细解释: 1. ORA-02292错误:当尝试更新一个具有外键约束的表时...