大批量資料處理操作小記

to_be_Dba發表於2013-03-19

 


向資料庫中插入大批量的資料時,由於資源的限制,可能無法實時地監控語句執行。以下是我的一些看法和經驗。


執行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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章