oracle快速向表插入大量数据[亲测有效]

oracle快速向表插入大量数据[亲测有效]当需要对一个非常大的表INSERT的时候,会消耗非常多的资源,因为update表的时候,oracle需要生成 redo log和undo log;此时最好的解决办法是用insert, 并且将表设置为n

oracle快速向表插入大量数据

   当需要对一个非常大的表INSERT的时候,会消耗非常多的资源,因为update表的时候,oracle需要生成 redo log和undo log;此时最好的解决办法是用insert, 并且将表设置为nologging;当把表设为nologging后,并且使用的insert时,速度是最快的,这个时候oracle只会生成最低限度的必须的redo log,而没有一点undo信息。如果有可能将index也删除,重建
   1.alter table table_name nologging;
   2. insert into table_name select * from xxxx; 

对此有了更好的解决方法:

  1、alter table nologging;
     注释:Nologging的设置跟数据库的运行模式有关
       a、查询当前数据库的归档状态:
            select name,log_mode from v$database;
            默认为 NOARCHIVELOG 非归档
       b、nologging在归档模式下有效,非归档模式nologging不起什么作用
       c、为了提高插入的速度,我们可以对表关闭写log功能。 SQL 如下:

            sql> alter table table_name NOLOGGING; 

            插入/修改,完数据后,再修改表写日志:  

            sql> alter table table_name LOGGING;

       
d、没有写log, 速度会块很多,但是也增加了风险,如果出现问题就不能恢复。

  
e,或    create table table_name nologging as (select * from …);

  2、drop掉索引约束之类的;

  3、 使用直接插入的方式

     insert/*+append+*/into tb_name select colnam1,colname2 from table_name;    

     a,数据库处于归档模式:当表模式为logging状态时,无论是否使用append模式,都会生成redo.当表模式为nologging状态时,只有append模式,不会生成redo。

           数据库处于非归档模式:无论是在logging还是nologing的模式下,append的模式都不会生成redo,而no append模式下都会生成redo。  

     b,建议不要经常使用append,这样表空间会一直在高水位上,除非你这个表只插不删

     c,在使用了append选项以后,insert数据会直接加到表的最后面,而不会在表的空闲块中插入数据。

         使用append会增加数据插入的速度。

         的作用是在表的高水位上分配空间,不再使用表的extent中的空余空间

         append 属于direct insert,归档模式下append+table nologging会大量减少日志,
        非归档模式append会大量减少日志,append方式插入只会产生很少的undo

         不去寻找 freelist 中的free block , 直接在table HWM 上面加入数据。

   4,总结
      测试证明:

         1. 不管哪种模式下append要与nologging方式联用才能达到很好的效果。

         2. 非归档与归档方式,只用NOLOGGING是不起效果的。

         3. 非归档下append已达到不错的效果,但不及与nologging的联用方式。

         4. 归档下单append起不到效果。

        NOLOGGING插完后最好做个备份。

        另外,如果库处在FORCELOGGING模式下,此时的nologging方式是无效的。

 
归档模式与非归档模式

  Oracle数据库有联机重做日志,这个日志是记录对数据库所做的修改,比如插入,删除,更新数据等,对这些操作都会记录在联机重做日志里。一般数据库至少要有2个联机重做日志组。当一个联机重做日志组被写满的时候,就会发生日志切换,这时联机重做日志组2成为当前使用的日志,当联机重做日志组2写满的时候,又会发生日志切换,去写联机重做日志组1,就这样反复进行。
  如果数据库处于非归档模式,联机日志在切换时就会丢弃. 而在归档模式下,当发生日志切换的时候,被切换的日志会进行归档。比如,当前在使用联机重做日志1,当1写满的时候,发生日志切换,开始写联机重做日志2,这时联机重做日志1的内容会被拷贝到另外一个指定的目录下。这个目录叫做归档目录,拷贝的文件叫归档重做日志。
  数据库使用归档方式运行时才可以进行灾难性恢复。
    1.归档日志模式和非归档日志模式的区别
非归档模式只能做冷备份,并且恢复时只能做完全备份.最近一次完全备份到系统出错期间的数据不能恢复.
归档模式可以做热备份,并且可以做增量备份,可以做部分恢复.

原文链接:https://www.cnblogs.com/tdskee/p/8607474.html

redo与undo

1. 什么是redo(用于重做数据)

redo也就是重做日志文件(redo log file),Oracle维护着两类重做日志文件:在线(online)重做日志文件和归档(archived)重做日志文件。这两类重做日志文件都用于恢复;其主要目的是,万一实例失败或介质失败,它们能够恢复数据。 由于数据库缓冲,对磁盘数据的更新不是实时的,但是对redo日志的更新会在commit之后确切发生。 如果在事务提交之后,磁盘数据更新之前,系统发生故障,比如断电,系统重启之后会将那些已经写入redo,但是没有更新到磁盘的数据进行重做,这样系统就恢复到故障点之前了。 redo日志默认3组,循环写入,第一组(每个组所有成员同时写入同样的信息)满了,切换到第二个,第二个满了切换到第三个,当所有组都写满之后,日志进程再次开始写第一个,后面的数据覆盖前面的数据,即为非归档模式。 鉴于redo如此重要,需要将已写满的日志归档,即复制内容到其他地方,即开启归档日志模式,但是会影响系统性能。

2. 什么是undo(用于回滚数据)

从概念上讲,undo正好与redo相对。你对数据执行修改时,数据库会生成undo信息,这样万一你执行的事务或语句由于某种原因失败了,或者如果你用一条ROLLBACK语句请求回滚,就可以利用这些undo信息将数据放回到修改前的样子。redo用于在失败时重放事务(即恢复事务),undo则用于取消一条语句或一组语句的作用。 undo保存在undo表空间中,且包含在redo日志中。 当执行DML操作时,旧数据会写入undo中。 事务回滚,未提交时,rollback,把undo中的旧数据重新写回数据段中;已提交时,进行闪回(flashback)操作 ,大多都是基于undo数据实现的。读一致性:用户检索数据时,ORACLE总是使用户只能看到被提交过的数据(当前事务中的其他语句可以看到未提交的数据),或者特定时间点的数据(select语句时间点)。当某个用户在此查询点之后修改了数据,此查询读到这个数据时,就是通过在undo中读取来实现的。 oracle使用scn来实现读一致性,系统变化号(SCN)是一个数据结构,它定义了一个给定时刻提交的数据库版本,SCN可以被认为是oracle的逻辑时钟,每一次提交数值都要增加。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/8564.html

(0)
上一篇 2023-02-26 11:30
下一篇 2023-02-26

相关推荐

  • int型参数的SQL注入

    int型参数的SQL注入类似PHP语言的 mysql_real_escape_string() 的函数,在用来防范SQL注入的时候,可能会遇到int型注入成功的情况。 mysql_real_escape_string()用法

    2023-02-10
    175
  • PHP实现redis订阅和发布(用于异步任务处理)[亲测有效]

    PHP实现redis订阅和发布(用于异步任务处理)[亲测有效]1.概念名称及含义channel 频道:生产者和消费者直接操作的对象publish 生产者:向channel发送消息subscribe 消费者:订阅一个或多个channelpsubscribe 消费者

    2023-02-20
    150
  • Python分割字符串实现

    Python分割字符串实现在Python编程中经常遇到需要将一个字符串分成多个部分来进行操作的情况。这个时候,我们就需要使用字符串分割操作。Python为我们提供了多种分割字符串的方法,我们可以根据具体的需求来选择使用哪种方法。

    2024-06-14
    50
  • Python编程技巧:如何高效的切割字符串?

    Python编程技巧:如何高效的切割字符串?在Python开发中,处理字符串是非常常见的一个问题。字符串的切割是其中比较常见和重要的一个操作,正确高效的切割字符串不仅能提高代码的性能,还能增加代码的可读性。因此,在这篇文章中,我们将为大家介绍如何在Python中高效的切割字符串。我们将从多个方面对这个问题进行详细的阐述。

    2024-04-12
    71
  • Python os.path join函数的用法及示例说明

    Python os.path join函数的用法及示例说明在Python的os.path模块中,join()函数被广泛应用于路径的组合,它使用操作系统特定的分隔符将多个路径组合成一个。在不同的操作系统中,路径的分隔符是不同的,在Windows中是”\\”,在Linux和Unix中是”/”。使用os.path.join()函数,我们可以轻松地处理这些不同的细节,生成可以在不同操作系统上运行的路径。

    2024-03-06
    98
  • 使用Python生成1-n数字列表

    使用Python生成1-n数字列表Python提供了内置函数range(),它可以生成一系列的数字,并且可以设置起始点、终止点和步长。通过使用range()函数,可以很轻松地生成1-n的数字列表。

    2024-02-07
    91
  • Mysql逻辑备份恢复-mysqldump使用

    Mysql逻辑备份恢复-mysqldump使用用法: 备份单个数据库:mysqldump -u 用户名 -p 数据库名 >filename.sql –no-data(-d) 只备份表结构 -t 只备份表数据 –databases 指定主机上…

    2023-02-27
    151
  • Python中的字符串大写转换方法

    Python中的字符串大写转换方法在Python中,字符串是一种非常重要的数据类型,字符串的处理对于文本处理、字符串处理等方面非常重要。其中的一个方法就是将字符串中的字母全部转换为大写形式,这对于处理某些场景,例如文本匹配、数据清洗等会非常有用。在本文中我们将介绍Python中的字符串大写转换方法,让读者了解其用法,以提高代码的可读性和可维护性。

    2024-03-03
    92

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注