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