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