ITPub博客

首页 > Linux操作系统 > Linux操作系统 > nologging建表

nologging建表

原创 Linux操作系统 作者:47328983 时间:2011-04-12 23:35:49 0 删除 编辑
可以采用NOLOGGING模式执行以下操作:
1 索引的创建和ALTER(重建)。
2 表的批量INSERT(通过/*+APPEND */提示使用“直接路径插入“。或采用SQL*Loader直接路径加载)。表数据不生成redo,但是
所有索引修改会生成redo,但是所有索引修改会生成redo(尽管表不生成日志,但这个表上的索引却会生成redo!)。
3 LOB操作(对大对象的更新不必生成日志)。
4 通过CREATE TABLE AS SELECT创建表。
5 各种ALTER TABLE操作,如MOVE和SPLIT。
在一个ARCHIVELOG模式的数据库上,如果NOLOGGING使用得当,可以加快许多操作的速度,因为它能显著减少生成的重做日
志量。假设你有一个表,需要从一个表空间移到另一个表空间。可以适当地调度这个操作,让它在备份之后紧接着发生,这样就能把表
ALTER为NOLOGGING模式,移到表,创建索引(也不生成日志),然后再把表ALTER回LOGGING模式。现在,原先需要X小时才能
完成的操作可能只需要X/2 小时(运行是会不会真的减少50%的时间,这一点我不敢打保票!)。要想适当地使用这个特性,需要DBA的
参与,或者必须与负责数据库备份和恢复(或任何备用数据库)的人沟通。如果这个人不知道使用了这个特性,一旦出现介质失败,就可
能丢失数据,或者备用数据库的完整性可能遭到破坏。对此一定要三思。
使用范例
create table t
NOLOGGING
as
select * from all_objects
关于NOLOGGING操作,需要注意以下几点:
1 事实上,还是会生成一定数量的redo。这些redo的作用是保护数据字典。这是不可避免的。与以前(不使用NOLOGGING)相
比,尽管生成的redo量要少多了,但是确实会有一些redo。
2 NOLOGGING不能避免所有后续操作生成redo。在前面的例子中,我创建的并非不生成日志的表。只是创建表(CREATE TABLE)
这一个操作没有生成日志。所有后续的“正常“操作(如INSERT、UPDATE和DELETE)还是会生成日志。其他特殊的操作(如
使用SQL*Loader的直接路径加载,或使用INSERT /*+ APPEND */语法的直接路径插入)不生成日志(除非你ALTER这个表,
再次启用完全的日志模式)。不过,一般来说,应用对这个表执行的操作都会生成日志。
3 在一个ARCHIVELOG 模式的数据库上执行NOLOGGING 操作后,必须尽快为受影响的数据文件建立一个新的基准备份,从而
避免由于介质失败而丢失对这些对象的后续修改。实际上,我们并不会丢失后来做出的修改,因为这些修改确实在重做日志中;
我们真正丢失的只是要应用这些修改的数据(即最初的数据)。
 
 
Oracle数据库中有多种创建表的方式。如可以通过复制其他表的方式来建立数据库表;而可以利用Select查询语句从其他数据库对象中查询数据并生成新的数据库表。但是如果利用这些形式来建立表的话(即在建立表的时候同时在新表中插入数据),如果数据比较多,则这个建表的速度会比较慢。这主要是因为默认情况下,建立表、插入数据等动作都会先写入到重做日志文件中,然后再建立相关的表并插入记录。也就是说,相当于数据库系统这个动作要操作两遍。这就降低了数据库建表的速度。当记录越多,这速度就会越慢。
  Nologging选项就是让数据库在插入大量数据或者进行其他复杂操作时不写重新操作,而是直接建立表或者插入数据。但是Nologging参数的使用也会受到一定的限制。
  一、 Nologging使用的限制。
  Nologging选项使用的限制主要体现在两个方面,一是并不是所有的语句都支持这个选项;二是其生效的时间跟数据库的归档模式相关。如数据库管理员可能需要一次性更新某个表中上百万条的纪录。此时管理员可以通过Update语句来更新。但是因为这个更新动作会同时写入到重做日志当中。所以当记录比较多(或者表之间关联更新)的时候,执行Update更新语句会花费比较长的时间。此时能否可以采用Nologging语句来提高更新性能呢?答案是否定的,因为Update更新语句不支持Nologging这个选项。故数据库管理员在采用这个参数时,需要知道那些语句支持这个语句,哪些语句不支持。
  另外Nologging参数的生效还跟数据库的运作模式相关。通常情况下数据库运作模式有归档日至模式与非归档日志模式的差异。在非归档日志模式下,数据库将不会对重做日志文件进行归档操作。而在归档模式下,数据库系统将对重做日志文件进行归档操作。即在日志发生切换时,系统进程先要等待归档进程将下一个重做日志文件归档完毕后才写入重做日志文件,覆盖其中的重做日志文件。Nologging选项是否生效,还直接跟这两个操作模式有关。根据笔者的了解,同样是采用了Nologging选项,相对来说在非归档模式下要比在归档模式下效果明显一点。
  再者数据库工程师要明白一个问题,就是direct insert也可以成批插入数据。不过这个插入跟insert插入有区别。前者在插入数据的时候,不会写重做日志。而后者常规插入的话,则会写入重做日志中。此时,nologgin选项对于他们来说是不起作用的。故如果数据库工程师需要插入大量的数据并且要提高插入的速度,则要注意此时nologging选项对于insert语句不起作用。此时数据库工程师只能够通过direct insert语句来提高插入效率。因为这条语句默认情况下是不会写入重做日志的。
  二、 Nologging的典型应用。
  虽然Nologging选贤在使用时受到不少的限制,但是在实际工作中其仍然是一个很有用的工具,特别是数据库在初始化的时候其特别有效。具体的来说在如下几种情况中利用这个参数可以提高操作效率。
  一是当数据库管理员通过CREATE TABLE AS SELECT(即数据库管理员可以通过查询语句来创建表)语句创建表时,笔者建立在语句中加入Nologging选项。特别是当记录比较多的时候。此时加入这个参数,可以避免在创建表的过程中产生过多的重做记录。如此的话,不仅可以节省重做日志文件的存储空间,而且还能够加快表的创建速度。一举多得,值得数据库管理员去尝试。
  二是在创建大表的时候也适宜采用这个参数。通常情况下,Nologging参数更加适合于创建大表时采用。在创建大表(同时需要插入大量数据)时加上这个参数,相对于创建小表来说,能够获得更加明显的速度提升。
  同时数据库工程师需要注意,执行Update更新语句时,这个参数会失效。故有时候数据库管理员会发现一个奇怪的问题,更新一百万条记录比插入同样的一百万条记录速度还慢。这很可能是因为在插入数据的时候采用了Nologging参数或者是采用direct insert语句。他们不会在插入数据的同时写入重做日志。那么如何才能够提高update语句的执行效率呢?这是一个很复杂的问题,三言两语也说不清楚。简单的来说,在update更新语句中,是不能够通过这个参数来限制其重做日志的操作。不过可以通过其他方式来提高其执行效率。如可以把所需要修改数据的数据表中索引等先暂时停用掉,等到数据更新完成后再启用。这就可以比较明显的提高数据更新效率。

文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/7_databases/oracle/oraclexl/20100624/211503.html
 
一、 Nologging选贤的缺陷及应对措施。
  如果在创建表的时候采用了Nologging参数,需要注意此时数据库系统将不会保留创建记录式的重做记录。也就是说,无法利用重做日志文件来重现表的创建过程。假设在创建表之后突然出现了数据库故障,此时数据库工程师就不能够通过重做日志把数据库数据恢复到故障的那个点,因为这个创建表的记录没有保存在重做日志文件中。
  为了避免这种情况,笔者的建议是如果不允许丢失表的话,则数据库管理员应当在表创建之后立即进行一次数据库完全备份。那么即使出现了以上的这个意外事件,则通过恢复这个完全备份以及重做事务日志,就可以把数据库恢复到故障的那个点上。
  二、 提高大表创建效率的其他措施。
  利用Nologging参数更加适合于在创建大表时使用。相对于小表来说,创建大表时采用这个参数可以取得更加明显的性能提升。那么除了这个方法外,还有其他提高大表操作效率的措施吗?笔者在这里就再介绍几个措施。
  如需要为大表分配足够多的临时空间。如果应用程序在访问大表时需要执行规模比较大的排序操作,就必须保证数据库中有一个比较大的临时空间。在数据库对记录进行排序时,默认情况下排序后的纪录是保存在高速数据缓存中。但是当高速数据缓存中保存不了这么多的数据是,就会把排序结果保存在临时空间中。而对于一些大表的排序往往高速数据缓存无法满足这么大的空间要求。为此针对大表的排序操作结果往往需要保存在临时空间中。故为大表分配足够多的临时空间,来应对排序时的空间需求,就可以非常明显的提高大表的排序操作。
  如还可以把大表与他的索引分开存放。大表应为其记录比较多,所以其对应的索引通常也比较大。故笔者建议数据库工程师将表和它的索引分别存储在不同的表空间中。如果有硬盘多的话,甚至可以分别存储在不同的硬盘中。如此在重建索引的过程中(如为了更新的需要,要先禁用索引然后再重新激活索引,此时数据库系统需要重新建立索引),索引能够更加容易的获得比较连续的存储空间,并且可以提高查询时的输入输出效率。
  另外如果企业数据库中存在大量的大表,如60%以上的数据表都是大表,此时即使采用了以上几种措施,能够取得的效果也不是很对。针对这种情况笔者的建议是数据库工程师要跟企业的系统管理员商量,尽量在数据库服务器中实现磁盘阵列。由于磁盘阵列可以同时往多个硬盘中存取数据,故可以提高数据的存储效率。这对于大表管理来说,就非常有用。为此,如果企业数据库中存在比较多的大表,并且需要对他们进行频繁的操作(包括数据查询、更新、排序等等),采用磁盘阵列是一个首选的建议。如果大表比较少或者针对这个大表的操作比较少的话,那么采用如上这些措施效果还是比较明显的。
  笔者最后再强调一句,如果采用了Nologging选项的话在重做日志中将不会保留操作记录。故采用这个参数进行操作后,一定要及时进行数据库备份操作。否则的话,数据容易丢失。

文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/7_databases/oracle/oraclexl/20100624/211502.html

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/241379/viewspace-692367/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-03-07

  • 博文量
    111
  • 访问量
    333217