网站首页 > 文章中心 > 其它

怎么快速提高oracle

作者:小编 更新时间:2023-09-05 10:43:35 浏览量:483人看过

如何提高oracle的insert速度

一般来说,减少索引和约束(比如如果是唯一索引insert时会进行验证,check也会验证),能提高一部分insert效率.

append参数也有一定的作用.(与高水位标记线有关)

对于数据量很大的insert,进行分批,也有一定的作用.(减少内存征用的等待时间)

表分区也有一些作用.(因为可以同时执行多个insert,每个分区都可以执行一个自己分区的insert,相当于并行)

变插入为导入,比如变为文本然后利用外部表程序导入(这样走的是系统内存和程序内存,而且导入的操作,比dml语句操作快很多)

怎么快速提高oracle-图1

这些都是一般的想法,具体的选择要根据你的实际情况进行.

怎么样才能快速学会oracle?

我觉得吧,oracle的体系太庞大了,对于初学者来说,难免会有些无从下手的感觉,什么都想学,结果什么都学不好,所以把我的经验分享下,希望让刚刚入门的人对oracle有一个总体的认识,少走一些弯路.

acle分两大块,一块是开发,一块是管理.开发主要是写写存储过程、触发器什么的,还有就是用Oracle的Develop工具做form.有点类似于程序员,需要有较强的逻辑思维和创造能力,个人觉得会比较辛苦,是青春饭;管理则需要对oracle数据库的原理有深刻的认识,有全局操纵的能力和紧密的思维,责任较大,因为一个小的失误就会down掉整个数据库,相对前者来说,后者更看重经验. 我的方法就是看书、思考、写笔记、做实验、再思考、再写笔记 .看完理论的东西,自己静下心来想想,多问自己几个为什么,然后把所学和所想的知识点做个笔记;在想不通或有疑问的时候,就做做实验,想想怎么会这样,同样的,把实验的结果记下来.思考和做实验是为了深入的了解这个知识点.而做笔记的过程,也是理清自己思路的过程.发现不懂得可以在相关论坛里面求助,看看别人是怎么分析问题的.你还可以在:里面看看,不会让你失望的哦.希望可以帮到你呢.

如何快速的学习oracle?

首先,学些ORACLE之前,你最好确认一下,对于数据库的基础知识是否掌握,如果还没有,那么我建议你先学数据库的基础知识,然后再对ORACLE进行重点的学习.

其次,oracle也是数据库的一种,所以,所有的数据库应该有的功能它都有,有了数据库的基础知识后,学习oracle是比较简单的(我是说对于一般的编程人员),特别的,多比较多个不同数据库的异同,这样可以很快的指导他们的用处,而且也方便记忆.

怎么快速提高oracle-图2

对于,oracle特有的函数、功能等,如果需要ORACLE深入编程,那肯定是要学习的.

如何加速Oracle大批量数据处理?

如何提高oracle 插入效率

示例表结构和数据集

接受导入数据的表名是 CALLS,表结构如下:

逐条数据插入INSERT

怎么快速提高oracle-图3

数据导入的最简单方法就是编写 INSERT 语句,将数据逐条插入数据库.这种方法只适合导入少量数据,如 SQL*Plus 脚本创建某个表的种子数据.该方法的最大缺点就是导入速度缓慢,占用了大量的 CPU 处理时间,不适合大批量数据的导入;而其主要优点就是导入构思简单又有修改完善的弹性,不需要多做其它的准备就可以使用.如果你有很多时间没法打发,又想折磨一下数据库和 CPU,那这种方法正适合你.:)

逐条数据插入 INSERT,表暂无索引

为什么上一种方法占用了较多的 CPU 处理时间,关键是 CALLS 表中已创建了索引,当一条数据插入到表中时,Oracle 需要判别新数据与老数据在索引方面是否有冲突,同时要更新表中的所有索引,重复更新索引会消耗一定的时间.所以呢提高导入速度的好办法就是在创建表时先不创建索引或者在导入数据之前删除所有索引,在外部文件数据逐条插入到表中后再统一创建表的索引.这样导入速度会提高,同时创建的索引也很紧凑而有效,这一原则同样适用于位图索引(Bitmap Index).对于主要的和唯一的关键约束(key constraints),可以使之先暂时失效(disabling)或者删除约束来获得同样的效果,当然这些做法会对已经存在的表的外键约束产生相关的影响,在删除前需要通盘斟酌.

需要说明的是,这种方法在表中已存在很多数据的情况下不太合适.例如表中已有九千万条数据,而此时需要追加插入一千万条数据,实际导入数据节省的时间将会被重新创建一亿条数据的索引所消耗殆尽,这是我们不希望得到的结果.但是,如果要导入数据的表是空的或导入的数据量比已有的数据量要大得多,那么导入数据节省的时间将会少量用于重新创建索引,这时该方法才可以考虑使用.

加快索引创建是另一个需要考虑的问题.为了减少索引创建中排序的工作时间,可以在当前会话中增加 SORT_AREA_SIZE 参数的大小,该参数允许当前会话在内存的索引创建过程中执行更多的排序操作.同样还可以使用 NOLOGGING 关键字来减少因创建索引而生成的 REDO 日志量,NOLOGGING 关键字会对数据库的恢复和 Standby 备用数据库产生明显的影响,所以在使用之前要仔细斟酌,到底是速度优先还是稳定优先.

批量插入,表暂无索引

需要提醒的是,通过 OCI 接口确实可以执行数据批量导入操作,但是许多工具和脚本语言却不支持使用此功能.如果要使用该方法,需要研究你所使用的开发工具是否支持 OCI 批量操作功能.导入程序需要进行复杂的编码并可能存在错误的风险,缺乏一定的弹性.

需要注意的是,你可以在查询语句中将 External Table 与数据库中其他表进行连接(Join),但是不能给 External Table 加上索引,并且不能插入/更新/删除数据,毕竟它不是真正的数据库表.另外,如果与数据库相关联的外部文件被改变或者被删除,这会影响到 External Table 返回查询结果,所以在变动前要先跟数据库打招呼.

这种方法为导入数据打开了新的一扇门.你可以很容易的将外部文件与数据库相关联,并且在数据库中创建对应的 External Table,然后就可以立即查询数据,就象外部数据已经导入到数据库表中一样.唯一的不足需要明确,数据并未真正导入到数据库中,当外部文件被删除或覆盖时,数据库将不能访问 External Table 里的数据,而且索引没有被创建,访问数据速度将有所缓慢.创建 CALLS_EXTERNAL(External Table表)如下,使之与外部数据文件关联:

然后将 External Table 与真正被使用的表 CALLS 关联同步,删除 CALLS 表并重建它:

因为 CALLS 表是真正的数据库表,可以创建索引来加快访问,表中的数据将被保留,即使外部数据文件被更新或被删除.在建表语句中NOLOGGING关键字用于加快索引重建.

上一种方法演示了如何创建与外部数据文件关联的数据库表,其表的数据是由外部数据文件映射过来.缺点是数据库表需要被先删除再重建来保持与外部数据文件的一致和同步,对导入增量的数据而不需要删除已有数据的情况不合适.针对这种需求,Oracle 提供了 INSERT 语句外带 APPEND 提示来满足.

INSERT /*+ APPEND */ INTO calls (call_id, call_date, emp_id, call_type, details) SELECT call_id, call_date, emp_id, call_type, details FROM calls_external;

该语句读取引用外部数据文件的 CALLS_EXTERNAL 表中内容,并将之增加到表 CALLS 中.Append 提示告诉 Oracle 使用快速机制来插入数据,同时可以配合使用表的 NOLOGGING 关键字.

可以预见这种方法与前一方法消耗了相同的时间,毕竟它们是使用 External Table 特性导入数据的不同阶段解决方法.如果目标表不是空的,那将会消耗稍微长的时间(因为要重建更长的索引),而前一 CREATE TABLE as SELECT 方法是整体创建索引.

SQL*Loader的强大功能

SQL*Loader 是 Oracle 提供的导入实用程序,特别针对从外部文件导入大批量数据进入数据库表.该工具已经有多年的历史,每一次版本升级都使其更加强大、灵活和快捷,但遗憾的是它的语法却是神秘而不直观,并且只能从命令行窗口处进行调用.

尽管它有不直观的缺点,但却是最快最有效的导入数据方法.缺省情况下它使用 "conventional path" 常规选项来批量导入数据,其性能提高度并不明显.我建议使用更快速的导入参数选项,在命令行添加"direct=true" 选项调用 "direct path" 导入选项.在 "direct path" 导入实现中,程序在数据库表的新数据块的 high water mark 处直接写入导入数据,缩短了数据插入的处理时间,同时优化使用了非常有效的B+二叉树方法来更新表的索引.

由此可见,尽管表中的索引在数据导入之前并没有被删除,使用SQL*Loader的direct path 导入选项仍然是快速和有效的.当然它也有缺点,就像NOLOGGING关键字一样该方法不生成REDO日志数据,导入进程出错后将无法恢复到先前状态;在数据导入过程中表的索引是不起作用的,用户此时访问该表时将出现迟缓,当然在数据导入的过程中最好不要让用户访问表.

分区交换 (Partition Exchange)

在一个被分区过的表中,呈现给用户的表是多个分区段(segments)的集合.分区可以在需要时被添加,在维护时被卸载或删除,分区表可以和数据库中的表交换数据,只要它们的表结构和字段类型是一致的,交换后的分区表将拥有与之互动的表的数据.需要注意的是,这种交换只是在Oracle数据库的数据字典层面上进行,并没有数据被实际移动,所以分区表交换是极其快速的.

结论

以上探讨了Oracle数据库的多种数据导入方法,每种方法都有其优缺点和适用环境,能够满足你不同的导入需求,当然你需要在了解了这些方法后,在速度、简易性、灵活性、可恢复性和数据可用性之间寻求最佳导入方案.

为了对比各种方法的效果,我们创建了一个实例来展示各种方法的导入效率和效果,从中你可以选择最适合的方法用于今后的数据导入工作.同时请记住,本文并未囊括所有的ORACLE数据导入技术(比如并行数据导入技术),这需要我们继续不懈的探索和尝试.

如何提高oracle 数据库查询效率

①.:影响最大的是在数据库端家索引.

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章