proc 是oracle提供的一種資料庫操作的api。它是基於esql技術的,需要預編譯後才可以變成普通c**,非常不直觀,使用起來不太方便,閱讀也存在困難。
下面以乙個簡單需求進行舉例說明:
要求把db1裡面一張資料表tbl_hch_test的資料匯出到db2的同名表。
最快的方法當然是使用oracle的資料幫浦工具進行壓縮匯出再匯入,但expdp/impdp對資料庫環境有特別要求,所以我們需要使用proc程式設計,先從db1取出資料,再insert到db2裡面。
簡單實現:
開啟乙個游標,從db1迴圈fetch資料出來,再使用sprintf拼裝成insert語句,到db2使用exec sql指令執行插入並提交資料庫。
優化:
雖然上面的做法可以完成需求,但在效率上存在不優化空間。下面依次進行介紹:
1 使用繫結變數代替sprintf拼裝sql
實踐證明sprintf函式在對效率要求比較高的場景下容易成為效能瓶頸,使用繫結變數可以避免sprintf呼叫。
並且,由於資料庫裡面執行的sql是相同的,不需要每次重新分析sql生成執行計畫,也能大大減輕資料庫負擔,提高執行效率。
2 對insert語句進行預編譯,一次編譯多次執行,避免使用隱性游標,每次都要重新編譯。
同上,預編譯是比較消耗cpu的操作。如果sql相同,可以復用游標,減少效能開支。
3 使用批量操作,每次取數和插入資料都使用陣列進行繫結。
批量操作可以減少客戶端與伺服器之間互動次數,加快運算元據。
4 適當加大事務提交間隔(insert多行記錄commit一次)
oracle提交資料庫事務時需要將日誌從記憶體刷回磁碟並等待磁碟操作完成才返回,提高事務提交間隔可以減少等待消耗。
優化前後效率測試對比:
相同的操作,從23s降低到1.3s
其它提高效率措施:
以上是在程式設計上的一些優化,結合oracle一些特性,速度還能再提公升,簡單介紹幾個優化技巧:
1 先刪除目標表索引,insert完資料後再重建
2 關閉表的日誌, 減少redo日誌,alter table tbl_hch_test nologing。裝載完資料再改回來。
4 使用並行(parallel)查詢,或者使用分割槽查詢(select * from tab parttion(par_name))加快查詢速度。
5 如果可能,盡量在資料庫伺服器上執行程式,減少網路傳輸開銷
關鍵**參考:
另外,附上幾個平時使用proc容易出現誤區。
1 使用char陣列儲存資料庫varchar2型別欄位的值
proc的char陣列對應的資料庫型別是char,varchar結構體對應的型別才是varchar2。使用char陣列儲存資料庫varchar2型別欄位的值,會導致取出的資料像char型別一樣,在末尾自動新增空格。
解決方法可以使用exec sql var/ exec sql type同等化變數或者資料型別。或者在預編譯時指定char_map=string一勞永役
2 需要注意proc的一些命令是預編譯命令,只在預編譯期間生效,與c語言的巨集十分相似。例如以下命令:。
exec sql context use
esec sql whenever sqlerror do
下面舉乙個常見的錯誤進行說明:
要完全搞明白proc的原理,建議多分析.pc檔案與porc預編譯後生成的.c檔案**區別。
3 proc指標變數
proc可以正確識別指標與普通變數,使用指標做為繫結變數與使用普通變數的方法一樣,在變數前面加上冒號即可。
官方文件是這樣說的:
有一些程式設計師不清楚怎麼在proc使用指標,會使用memcpy把資料複製多一遍,增加無謂消耗。
4 proc與c語言巨集
proc能識別c語言的一些簡單的巨集,但如果有複雜的巨集(如不定引數巨集),proc在預編譯時會報錯。
此時可以考慮使用gcc –e先對.pc檔案進行預處理,之後再使用proc進行預編譯。
oracle proc 插入操作效能優化實踐
student 表中 10萬條資料。從 student 表中取出所有資料,插入到 student his 表中 1.批量插入 效果明顯 2.批量查詢 效果不明顯 3.批量提交 效果不明顯 4.預編譯 sql 語句 效果不明顯 10萬條資料,普通方法 27 秒,優化後 8 秒 create table...
Oracle Pro C程式設計系列 小輝作品
oracle pro c程式設計系列 1 對oracle程式設計進行了概述,給大家展示了第乙個簡單的pro c的例子,非常易懂 oracle pro c程式設計系列 2 對pro c程式設計中的變數和變數轉換進行了全面的闡述 oracle pro c程式設計系列 3 講述了pro c程式設計中的一些...
FLASH ActionScript 效能優化
一.圖形方面的優化 1.減少同時在螢幕上物體的個數 2.儘量減少螢幕需要重畫的範圍。3.盡量避免全屏滾動 4.保持幀數在16 20,每一幀都連續,比將幀數設定的很高,但是每一幀的計算超過幀時間,讓人感覺更舒服。5.如果乙個物體不需要顯示,盡量將他從螢幕上刪除,而不是將他設定成不可見。因為即使不可見的...