暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

oracle 使用直接装载方法

原创 不吃草的牛_Nick 2023-06-29
443

迄今为止,我们都是从传统装载的观点来看SQL*Loader实用程序。前面提到过,传统装载方法使用SQL INSERT语句将数据插入到表中,一次插入一个绑定数组大小的数据。

直接装载不使用SQL INSERT语句将数据装载到表中,而是格式化Oracle数据块,然后再直接把它们写入数据库文件。这种直接写入的过程省去了执行装载表的SQL语句的大量开销。因为直接路径装载方法不争夺数据库资源,所以比传统数据装载要快得多。对于量更大的数据装载,用直接路径装载方法最好,而且在传统装载所需时间超出要求时,它是唯一可用的方法。

除了装载时间短这个明显的优点外,直接装载还有助于重建索引和预排序数据。相对于传统装载方法,使用直接路径装载方法具有以下优点:
★ 比传统装载方法快,因为装载不使用SQL INSERT语句;
★ 直接装载使用多块同步I/O写数据库,因此写入很快:
★ 直接装载可选择使用有效的排序例程对数据进行预排序;
★ 通过设置UNRECOVERABLE=Y参数,直接装载中可避免写重做信息;
★ 使用临时存储,直接装载能够比传统装载方法更有效地建立索引。

注解 传统装载忍要生成重做项,而直接装载方法只在特定的条件下生成重做项。直接装载不会触发任何插入触发器,而传统装载在装载中要触发插入触发器.用直接装载方法,用户在表的装载过程中不能做任何更改,而用传统装载方法时可以.

不过,直接装载也受到一些限制。在下列条件下,不能使用直接路径装载方法:
★ 正在使用群表:
★ 正同时装载父表和子表;
★ 正装载VARRAY或BFILE列;
★ 正在异构平台上使用Oracle Net执行装载;
★ 装载中要使用SQL函数。

注解 在直接装载中,不能使用SQL函数.如果需要进行大量的数据装载,而且在装载中还要转换数据,使用直接装载会存在问题.传统数据装载允许使用SQL函数转换数据,但此方法与直接装载相比非常慢。因此,对于大型数据装载,可考虑使用某种较新的装载/转换技术,如外部表或表函数等.

13.2.6.1 直接装载选项
有几个SQL*Loader选项是专门用于直接装载的,或者用于直接装载比用于传统装载更有意义。下列选项与直接路径装载方法相关。
★ DIRECT:为使用直接路径装载方法,必须将DIRECT子句设置为true(DIRECTSrue)。
★ DATA_CACHE:如果在直接装载中多次装载相同的日期或时间戳值,则DATA_CACHE参数可派上用场。SQL*Loader在每次遇到日期和时间戳数据时,都必须转换它们。如桌数据中有重复的日期和时间戳值时,可指定DATA_CACHE参数来减少不必要的数据转换,从而减少处理时间。默认赋予DATA_CACHE参数值1000。姑果数据中没有重复的日期和时间戳值,或者这样的重复很少,可将DATA_CACHE参数设为零以禁用DATA_CACHE参数(DATA_CACHE-0)。
★ ROWS。ROWS参数很重要,因为可利用它在插入到表之前,指定SQL*Loader将从输入数据文件中读入多少行。可用它来设置在一个运行时间很长的SQL*Loader中,因为实例失败所丢失的数据量的上限。在SQL*Loader读取了ROWS参数指定的行数时,它将停止装裁数据,直到所有数据缓冲区成功写到数据文件为止。这个过程称为数据保存(data save)过程。例如,如果SQL*Loader每分钟可装载大约10000行,则设置RQWS=150000,每15分钟保存数据一次。
★ UNRECOVERABLE。如果希望最小化重做日志的使用,可在直接装栽中使用UNRECOVERABLE参数(在控制文件中指定UNRECOVERABLE).
★ SKIP_INDEX_MAINTENANCE。在打开时(SKIP_INDEX_HMNTENANCE=true),
SKIP_INDEX_MAINTENANCE参数指示SQL*Loader不在装载中维护索引。SKIP_INDEX_MAINTENANCE的默认宿为false。
★ SKIP_UNUSABLE_INDEXES。将SKIP_UNUSABLE_INDEXES参数设置为true,保证SQL*Loader将装载带有处于不可用萩态的索引的表。但是,SQL*Loader不维护这些索引。此参数的就认取决于SKIP_UNUSABLE_INDEXES初始化参数的设置,SKIP_UNUSABLE_INDEXES初始化参数的駄认值为true。
★ SORTED_INDEXES:SORTED_INDEXES参数通知SQL*Loader,数据根据一个指定的索引排序,这有助于改善装载的性能。
★ COLUMNARRAYROWS:此参数确定在建立流缓冲区前装载的行的数目。例如,COLUMNARRAYROWS=100000首先装载100000行。直接路径列数组的大小由这个参数确定。在我的UNIX服务器上此参数的默认值为5000.
★ STREAMSIZE:STREAMSIZE参数允许设置流缓冲区的大小。例如,在我的服务器上,默认为256000,我可以用STREAMSIZE参数来增加它,如STREAMSIZE=512000.
★ MULTITHREADING:在MULTITHREADING(多线程状态)下,对流缓冲区列数组和流缓冲区装载的转换并行执行。在有多个CPU的机器上,默认打开多线程(true)。如果愿意,可设置MULTITHREADING=false来关闭它。

13.2.6.2 直接装载和约束/触发器管理
直接装载方法通过格式化数据块直接将数据插入到数据文件。通过绕过INSERT语句机制,在直接装载中不系统化地应用表约束和触发器。禁用所有触发器和儿个完整性约束。SQL*Loader自动禁用所有外部键和检査约束,但SQL*Loader仍然维持非空、唯一和主键约束。如果指定了REENABLE子句,则随着SQL*Loader执行的完成,SQL*Loader自动启用被禁用的约束。否则,被禁用的约束必须手动启用。被禁用的触发器自动在装载完成后启用。

使用SQL*Loader技巧
下面的提示将有助于在數据装载中优化使用SQL*Loader,特别是在装载大数据和/或在数据库中表上具有多个索引和约束时.
★ 尽可能使用直接装载方法,因为它比传统数据装载要快得多.
★ 尽有可能使用UNRECOVERABLE=true选项(在直接装载中).这将节省许多时间,因为不需要在重做日志文件中记录新装载的数据.介质恢复对数据库中所有其他用户仍然有用,如果有问题总是能启动一个新的SQL*Loader执行.
★ 尽量避免使用NULLIF和DEFAULTIF参数.这些子句必须对它们使用的每个行进行测试.
★ 使数据类型和字符集转换最少,因为它们会降低处理的速度。
★ 只要有可能,就使用位置字段而不是分隔字段.如果给出了字段的位置,SQL*Loader能很快地从一个字段移到另一个字段.
★ 在一对一的基础上映射物理和逻辑记录.
★ 在装载前禁用约束,因为约束会降低装栽的速度.当然,在禁用约束时,有时也可能会由于错误而终止,不过相对于快得多的数据装栽,这只是一种很小的代价,对于大型表来说更是如此.
★ 如果采用直接路径装载方法,则应该指定SORTED_INDEXES子句以优化装载的性能.
★ 如果进行大型数据装载,最好是在装载前删除灰丄的索引,因为索引维护会降低SQL*Loader会话的速度.如果不能删除这些索引,可以使它们不可用并在装载中使用SKIP_UNUSABLE_INDEXES子句.如果进行直接装载,应该使用SKIP_INDEX_MAINTENANCE子句.

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论