从事IT基础架构多年,发现自己原来更合适去当老师……喜欢关注新鲜事物,不仅限于IT领域。
分类: Oracle
2007-02-01 09:18:00
for each data file { while more data in the data files { fill read buffer with more data for each record in the read buffer { do field setting add row to column array if column array is full OR row limit reached OR no more complete records in read buffer { while more rows in column array to process { convert column array to data stream buffer load data stream buffer } if row limit reached load done } } } }MULTITHREADING 参数 如果 MULTITHREADING 命令行参数被设置为 TRUE(多 CPU 客户端的默认值),则 SQL*Loader 将利用流转换来叠加流装载。如果主线程已经将数据从列数组转换到流中,并且在处理完列数组中所有数据之前对该流进行了填充,则装载线程将会装载该流,同时主线程继续进行,将列数组转换到另一个流缓冲区中。当列数组中最后一条记录被转换到流缓冲区中时,主线程将装载该流缓冲区。请注意,如果列数组中的所有数据适合装入一个流缓冲区中,则不会使用装载线程,性能也不会提高。 SQL*Loader 日志文件将报告由装载线程和主线程所装载的行数。以下是一个 SQL*Loader 日志文件中的部分内容摘录,显示关于一次装载的信息:
Total stream buffers loaded by SQL*Loader main thread: 47 Total stream buffers loaded by SQL*Loader load thread: 180由主线程所装载的流缓冲区计数包括列数组的最后一个流,还包括由于服务器在处理流数据时遇到错误而需要重新装载流的次数(例如出现校验约束错误)。由装载线程所装载的流缓冲区计数是在主线程将列数组数据转换到流时所装载的流缓冲区总数。 在多线程处于打开状态时的总 CPU 使用时间与多线程处于关闭状态时的 CPU 闲置时间大致相同。但是,当需要进行很多字符集、数值或日期转换并且多线程处于打开状态时,可以显著地减少使用时间。在 SQL*Loader 客户端使用多线程会有一些开销,因此当只有少量列需要转换时,禁用多线程可以略微提高性能。 调整参数 READSIZE 参数确定由 SQL*Loader 所使用的输入数据缓冲区大小。更大的 READSIZE 允许读入更多的记录。读缓冲区在重新填充之前将会被完全地使用。因此,如果只有相当少的记录适合装入读缓冲区时,不能充分利用非常大的列数组或流缓冲区。一般而言,当一次可以处理更多输入记录时,性能将得到提高。 COLUMNARRAYROWS 值确定读缓冲区中一次可以解析和转换的最大记录数量。更大的 COLUMNARRAYROWS 值的影响受到读缓冲区大小的限制。也就是说,READSIZE 参数(它确定读缓冲区可以保存多少记录)应该被设置为足够大的值,至少可以保存由 COLUMNARRAYROWS 值所确定的记录数。 STREAMSIZE 确定向服务器一次发送的转换流数据的数量。所有的转换由 SQL*Loader 客户端完成,作为将输入数据移动到流缓冲区的工作的一部分。大流缓冲区的影响受到列数组的行数和被转换数据大小的限制。一般而言,一次向数据库发送的转换数据越多,性能会越好。但是有一个限度,超过此限度时性能不会提高。该限度取决于每次不同装载的具体情况。同样,为了提高多线程的性能,每个列数组需要多个流缓冲区装载。因此,如果将流大小设置得更小,则性能将会提高。 读缓冲区可装入的记录的合适数量取决于输入记录的大小,而不是发送到服务器的转换列数据的大小。输入记录中的某些数据可能被字段设置完全地忽略。同样,发送到服务器的转换过的流数据可能需要比输入数据更多或更少的空间,这取决于所需要的转换、数据库列大小及其数据类型。例如,装载只有几个输入字符的 CHAR(2000) 列将会导致向服务器发送相对于输入记录大小而言多得多的流数据。 只有在为一个列数组向服务器发送多个流并且需要很多数据转换时,多线程操作才会减少所使用的时间。如果能够一次将列数组中所有的行都转换到一个流缓冲区中时,将不使用这种优化方法。如果装载线程没有装载很多流,则尝试增加列数组的行数、输入读缓冲区的大小,或者二者都增加。 在更改这些参数时应该小心,因为增加这些参数值会需要更多的物理内存。如果这样做会导致页面操作,则不应该增加其默认值。实际上,如果检测到 SQL*Loader 客户端的进行分页操作,或者 SQL*Loader 客户端进程看来正在使用大量内存,则要降低这些参数的值。请从降低 COLUMNARRAYROWS 参数值开始,特别是在每条逻辑记录的装载操作涉及到多条物理记录,或是在每行要装载大量列数据的情况下(除了 LOB 或 LONG 列,这些列被单独处理)。