2

我对 SQL*Loader 的常规路径的理解是,它只是简单地生成 INSERT 语句并将它们发送到数据库。使用它而不是仅以编程方式生成 SQL 语句并针对数据库执行它们是否有任何性能优势?

4

1 回答 1

5

SQL*Loader 正在生成 INSERT 语句,但非常关键的是,它正在使用绑定变量。如果您要加载数千行,那么构建包含字符串文字的 INSERT 语句将比使用绑定变量慢一个数量级,此外还会破坏共享池。如果您生成一堆 INSERT 语句,Oracle 必须解析每条语句——这将很快消耗您加载过程的大部分时间。根据共享池的大小,您的CURSOR_SHARING参数,以及您正在加载的行数,插入语句文件可以很容易地对共享池施加足够的压力,使加载进程(和/或恰好同时运行的其他一些不相关的进程需要parse a new query) 将出错,因为共享池中没有足够的连续空间。

对于常规路径加载,您当然可以编写一个性能与 SQL*Loader 一样的应用程序。您的应用程序需要执行类似的操作

Prepare the statement
Loop
  Read the next row of data
  Split the next row of data into columns
  Bind the data to the bind variables in the prepared statement
  Execute the prepared statement
End loop

这与仅仅针对数据库释放数千个单独的 INSERT 语句非常不同。

于 2009-08-18T20:53:46.803 回答