回覆列表
-
1 # TonyDeng
-
2 # avatasia
不存在這個問題
既然是大量資料插入 它是一個批處理 你怎麼知道越來越慢的 要麼就直接跑幾個小時 怎麼就越來越啦?
資料插入 無非是加鎖 寫日誌 寫熱資料 後來定時回盤
如果比以往慢 一般就是還有其他大事務
-
3 # 皇家救星
加快oracle資料庫插資料速度方法:
從程式設計角度考慮:
1 使用繫結變數,達到一次預編譯多次執行的效果。如果不使用繫結變數,資料庫每次都要對sql進行分析,消耗資源。
2 使用oracle提供的批次介面,這樣可以減少網路傳輸次數,加快效率
3 適當增加commit間隔,commit指令比較消耗資料庫資源,儘量多插入一些資料再提交。建議一千條以上。
4 使用hint(如+append),使用insert 語句 nologging選項,減少資料庫日誌登記。
5 考慮使用多程序插入或者使用並行hint插入
從資料庫角度考慮:
1 把表改成nologging模式,這樣不用登記回滾日誌
2 對錶進行分割槽,讓不同分割槽落在不同硬碟
4 增大資料庫緩衝區
5 使用ssd儲存等高效硬碟作為資料庫儲存
其他細節:
例如把程式部署到資料庫伺服器再操作,減少網路消耗
插入資料程式輸出日誌重定向到硬碟
不懂Oracle,就演算法原理上說,插入跟追加是有區別的。根據你“越來越慢”的描述,應該是用了插入機制,但不影響速度的卻是追加。大量資料灌庫,優先選擇追加,不用管排序,灌入後再建立索引得到邏輯排序。
插入使用物理排序,若使用前插方式,則每插一筆記錄要把後面的所有記錄往後搬移,騰出一處空行供插入資料,後面的記錄少時沒什麼,但若後面的記錄多起來,搬移的速度肯定越來越慢。根據現象描述,這是極可能的情形。我建議你動手測試看看這個資料庫的insert實現到底是怎麼做的。
若資料庫沒append指令,看看insert有沒有Alfter之類的引數,避免預設before。
多執行緒在理論上不能解決問題,除非資料庫本身是分物理磁碟存放的,若是在同一檔案中,始終要按順序寫入庫檔案,也無法讓磁碟並行讀寫。
另一種解決的演算法,當非要物理前插不可的時候,可以一次挪出足夠的空間,然後灌入資料。
這些方案取決於資料庫如何最佳化SQL語句的實現,但若程式設計師自己沒有手動程式設計操縱過資料庫管理的經驗,根本不知道可能有什麼最佳化方案。SQL是標準語法,但只規定語法的標準形式,具體實現如何是資料庫系統由編制者決定,不同的資料庫實現同一條SQL語句的方式極可能不同,這與網頁瀏覽器實現HTML標準的情形相似,也與C編譯器編譯C程式碼的情形相似。
這種往資料庫中新增資料的原理,實際上與C++的vector型別機制相似,永遠是末尾追加的效率最高,插入資料是劣質選擇。想象一個模型,資料庫就如多米諾骨牌,每條記錄是一個骨牌,新增記錄最快的方法當然在後面加骨牌,不論加多大量的骨牌,速度只與擺放的效率有關,要在中間插功夫就多了,縱然多CPU作業,每個CPU也要等前面的擺好了才能擺下一個,磁碟的寫入也是寫好一塊才能寫下一塊,除非是不同的物理磁碟,這樣能快到哪去,頂多把需要新增的資料更快地讀到記憶體罷了,記憶體不夠更糟糕。大型資料庫的管理,不會神化到何等程度,它要提高效率,無非如vector一樣事先預留增長空間,新增越多,預留的幅度越大,故這類資料庫往往資料量不多但體積龐大。學C、學演算法、學資料結構,都是為了明白這些道理,資料庫、SQL再高階,也繞不過這些最基本的東西。