大批量資料處理操作小記
向資料庫中插入大批量的資料時,由於資源的限制,可能無法實時地監控語句執行。以下是我的一些看法和經驗。
執行insert append操作前,儘量將所有的約束暫時禁用或清除,索引刪除(待插入後重建)。這樣可以極大地改善插入的效率。
在插入過程中,我們可能希望看到資料插入的進度。這時,如果使用了索引,可以通過檢視索引的nextval值來獲取插入進度。
資料插入結束後,為了保證後續操作的正常,應該啟用(enable)主鍵約束。因為在進行統計量收集、update操作之前都會首先進行一個select count(1)的操作。若事務比較大,該過程通
過v$session和v$sql的關聯可以看到。
大批量插入資料前,適當增大redo log日誌檔案的大小,保證其切換頻率在10~15分鐘左右;若使用了序列,將序列的cache值調整的稍大一些。
進行update操作,索引的影響更加強烈。應該堅決刪除不必要的索引,以防止update過程中對索引的維護成本和索引的葉子塊分裂造成的空間膨脹。
對上千萬資料的表按照另外一張表進行update,且表上沒有分割槽,可以暫時建立分割槽索引來提高效能。如果可以按照某一列進行分批操作,可以建立全域性的分割槽索引;如果任何一列都不能使
操作的內容分批,可以嘗試使用hash分割槽索引。
從依賴表中每次fetch1000~10萬資料(根據機器效能等因素)到遊標中,用forall語句進行update。
==============================================================================================================
資料處理的同時,對正在操作的表再進行跟蹤查詢操作可能使效能受到很大影響。我們可以藉助資料字典表來監控進度、保證效能。
將下面語句的XXXX替換為當前使用者,可以看到當前使用者都在進行著哪些操作。
select * from v$sql where sql_id in (select sql_id from v$session where status='ACTIVE' and username='XXXX');
根據從上面語句中獲得的sql_text,可以知道儲存過程執行到哪個語句了;而通過sql_id,可以用以下語句看到執行計劃:
select * from table(dbms_xplan.display_cursor('sql_id的值',0));
比如,有如下程式碼段:
open b_trans;
loop
fetch b_trans bulk collect into lis_trans_seq,lis_bill_period,lis_sales_nm
limit 8000;
v_count:=lis_trans_seq.count;
forall i in lis_sales_nm.first..lis_sales_nm.last
update BILL_P set trans_seq=lis_trans_seq(i)
where sales_nm=lis_sales_nm(i)
and bill_period=lis_bill_period(i);
commit;
exit when v_count=0;
end loop;
close bsdtrans;
作用是將BILL_P表中的trans_Seq按照sales_nm、bill_period進行update。每次從遊標b_trans中獲取八千條資料進行批量更新,直到全部更新為止。
通過v$sql,我們可以看到update語句的執行次數,進而得到更新的進度。
執行:select executions from v$sql where sql_text='UPDATE BILL_P SET TRANS_SEQ=:B1 WHERE SALES_NM=:B3 AND BILL_PERIOD=:B2 '
得到的執行次數為113次,而每次fetch的數量是8000,則已經更新的數量就是8000*113(前提是以前沒有執行過此語句)。然而,這種方式並不準確,只可以作為我們監控的一個參考。
實際操作中發現,查詢顯示某個sql執行了40多次,而根據40*8000的方式計算,早已經超過了表中資料量,但仍沒有執行完成。根據ROWS_PROCESSED的結果似乎是正確的。
通常來說,檢視累積的結果意義不大,檢視兩個時間點間統計量的差值更有意義。
比如檢視每隔十分鐘檢視該語句的執行次數,由差值計算出來的結果是比較準確的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26451536/viewspace-756674/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料清洗處理-常用操作
- 【Pandas學習筆記02】處理資料實用操作筆記
- 微信小程式資料處理微信小程式
- pandas 資料處理 一些常用操作
- JSP筆記-XML 資料處理JS筆記XML
- 小程式處理大量資料列表的方法
- Python資料處理(二):處理 Excel 資料PythonExcel
- 資料處理
- 【影像處理筆記】小波變換筆記
- 機器學習筆記---資料預處理機器學習筆記
- 海量資料處理
- python 處理資料Python
- springmvc 資料處理SpringMVC
- Panda資料處理
- 資料預處理
- Excel 資料處理Excel
- javascript - 資料處理JavaScript
- 資料分析--資料預處理
- 資料預處理-資料清理
- 資料清洗和資料處理
- Spark在處理資料的時候,會將資料都載入到記憶體再做處理嗎?Spark記憶體
- YOLOv3學習筆記之資料處理YOLO筆記
- Python資料處理(一):處理 JSON、XML、CSV 三種格式資料PythonJSONXML
- pandas(進階操作)-- 處理非數值型資料 -- 資料分析三劍客(核心)
- 請求資料處理
- 海量資料處理2
- 雨滴譜資料處理
- flutter json資料處理FlutterJSON
- 資料預處理 demo
- 流資料處理利器
- Hive處理Json資料HiveJSON
- 0701-資料處理
- 資料預處理-資料歸約
- 表格資料處理的2種寫法,偽元素和操作dom
- 使用Python構建MySQL資料處理系統的操作方法PythonMySql
- ES 筆記三十七:處理併發讀寫操作筆記
- 維度處理-資料倉儲-讀書筆記(四)筆記
- 【Pandas學習筆記02】-資料處理高階用法筆記
- CSS 小結筆記之文字溢位處理CSS筆記