现在的位置: 首页 > 综合 > 正文

Sqlldr性能参数

2013年01月17日 ⁄ 综合 ⁄ 共 3420字 ⁄ 字号 评论关闭

最有效地使用 SQL*Loader 直接路径装载

 

作者:Richard Phillips,技术组顾问;Jim Stenoish,技术组主要成员;Oracle 公司
发布于:2004 年 9 月
 

有四个 SQL*Loader 直接路径装载参数直接影响着直接路径装载操作的使用时间:
READSIZE 是缓冲区的大小,该缓冲区应用于从输入数据文件中读取数据。
COLUMNARRAYSIZE 是一个两维数组的行数,该数组用于保存从数据文件记录中所收集的字段信息。数组中的每行都保存该行的字段信息。
STREAMBUFFERSIZE 是客户端缓冲区大小,该客户端缓冲区用于将转换的原始数据传递到服务器。
MULTITHREADING 是一个可选项,允许在数据库服务器进行数据装载时并发地执行一些 SQL*Loader 客户端操作。如果关闭多线程选项,则 SQL*Loader 客户端将一直处于等待状态,直到服务器完成数据装载才会继续工作。如果打开多线程选项,则某些对服务器的调用将由客户端的“装载线程”来执行,同时客户端的“主线程”继续转换数据并创建流缓冲区。
在装载简单数据类型且少于 256 列的表时,默认值可使性能达到最佳。但是如果需要提高装载性能,则 DBA 可以对这些参数进行调整,确定对于特定装载的最佳值。
 

本技术说明将着重讨论在不同情况下更改这些参数默认值对性能的影响。虽然更改这些值可能会提高装载的性能,但它们也可能不会影响性能,而在某些情况下甚至会降低性能。
 

COLUMNARRAYROWS、STREAMSIZE 与 READSIZE 参数之间的相互作用
 

以下步骤简要描述了在执行直接路径装载时 SQL*Loader 如何使用这些参数。
SQL*Loader 客户端将数据从输入数据文件读入到缓冲区中。缓冲区大小由 READSIZE 参数控制。
SQL*Loader 解析它在缓冲区中找到的每条逻辑记录,根据 SQL*Loader 控制文件中所指定的字段定义来分隔数据字段。这种解析称为“字段设置”。字段设置结果被保存在“列数组”中。列数组保存着表中每个被装载列的信息。列数组中的行数由 COLUMNARRAYROWS 参数控制。
字段设置持续地进行,直到列数组已满、检测到读缓冲区结束或者完成要装载的行数为止。
解析到列数组中的行被转换到一个流缓冲区中。流缓冲区的大小由 STREAMSIZE 参数控制。在处理完列数组中所有行之前可以对流进行填充。
流缓冲区数据发送到服务器。
服务器解析原始数据并将其装载到目标表中。
在装载完流数据后,客户端的流缓冲区被重置为空。
如果在列数组中有更多数据需要转换,则 SQL*Loader 从第 4 步执行。否则前进到第 9 步。
在处理了列数组中的数据之后,SQL*Loader 在读缓冲区中寻找更多的记录。如果有更多记录,则 SQL*Loader 客户端从第 2 步继续执行。否则前进到第 10 步。请注意来自两个读缓冲区的数据不会在出现在同一个列数组或流缓冲区中。
如果已经处理了读缓冲区中的所有记录,则 SQL*Loader 会将更多数据装载到读缓冲区中(第 1 步)。
在这些步骤中所描述的过程持续进行,直到装载了所需的行数、达到错误极限或者处理完所有输入数据为止。
 

以下伪代码是对上面所述装载过程的高级描述。错误限度检查没有被显示出来,但是当达到错误限度时,装载过程将会终止。
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 列,这些列被单独处理)。

抱歉!评论已关闭.