2
我对SQL * Loader常规路径的理解是它只是生成INSERT语句并将它们发送到数据库。使用它有没有任何性能好处,而不仅仅是以编程方式生成SQL语句并在数据库中执行它们?为什么我会使用SQL * Loader常规加载路径?
我对SQL * Loader常规路径的理解是它只是生成INSERT语句并将它们发送到数据库。使用它有没有任何性能好处,而不仅仅是以编程方式生成SQL语句并在数据库中执行它们?为什么我会使用SQL * Loader常规加载路径?
SQL * Loader正在生成INSERT语句,但非常关键的是,它使用绑定变量。如果您要加载数千行,则除了反转共享池之外,构建包含字符串文字的INSERT语句的速度要比使用绑定变量慢一个数量级。如果你生成一堆INSERT语句,Oracle必须解析每一条语句 - 这将很快消耗你的加载过程的绝大部分时间。根据共享池的大小,参数CURSOR_SHARING
以及要加载的行数,插入语句文件可以非常容易地对共享池施加足够的压力,即加载进程(和/或其他不相关的进程恰好在需要解析新查询的同一时间运行)会出错,因为共享池中没有足够的连续空间。
您当然可以编写一个与传统路径加载相同的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语句非常不同。
+1很好的答案。 – 2009-08-18 21:18:35