回覆列表
  • 1 # TonyDeng

    不懂Oracle,就演算法原理上說,插入跟追加是有區別的。根據你“越來越慢”的描述,應該是用了插入機制,但不影響速度的卻是追加。大量資料灌庫,優先選擇追加,不用管排序,灌入後再建立索引得到邏輯排序。

    插入使用物理排序,若使用前插方式,則每插一筆記錄要把後面的所有記錄往後搬移,騰出一處空行供插入資料,後面的記錄少時沒什麼,但若後面的記錄多起來,搬移的速度肯定越來越慢。根據現象描述,這是極可能的情形。我建議你動手測試看看這個資料庫的insert實現到底是怎麼做的。

    若資料庫沒append指令,看看insert有沒有Alfter之類的引數,避免預設before。

    多執行緒在理論上不能解決問題,除非資料庫本身是分物理磁碟存放的,若是在同一檔案中,始終要按順序寫入庫檔案,也無法讓磁碟並行讀寫。

    另一種解決的演算法,當非要物理前插不可的時候,可以一次挪出足夠的空間,然後灌入資料。

    這些方案取決於資料庫如何最佳化SQL語句的實現,但若程式設計師自己沒有手動程式設計操縱過資料庫管理的經驗,根本不知道可能有什麼最佳化方案。SQL是標準語法,但只規定語法的標準形式,具體實現如何是資料庫系統由編制者決定,不同的資料庫實現同一條SQL語句的方式極可能不同,這與網頁瀏覽器實現HTML標準的情形相似,也與C編譯器編譯C程式碼的情形相似。

    這種往資料庫中新增資料的原理,實際上與C++的vector型別機制相似,永遠是末尾追加的效率最高,插入資料是劣質選擇。想象一個模型,資料庫就如多米諾骨牌,每條記錄是一個骨牌,新增記錄最快的方法當然在後面加骨牌,不論加多大量的骨牌,速度只與擺放的效率有關,要在中間插功夫就多了,縱然多CPU作業,每個CPU也要等前面的擺好了才能擺下一個,磁碟的寫入也是寫好一塊才能寫下一塊,除非是不同的物理磁碟,這樣能快到哪去,頂多把需要新增的資料更快地讀到記憶體罷了,記憶體不夠更糟糕。大型資料庫的管理,不會神化到何等程度,它要提高效率,無非如vector一樣事先預留增長空間,新增越多,預留的幅度越大,故這類資料庫往往資料量不多但體積龐大。學C、學演算法、學資料結構,都是為了明白這些道理,資料庫、SQL再高階,也繞不過這些最基本的東西。

  • 2 # avatasia

    不存在這個問題

    既然是大量資料插入 它是一個批處理 你怎麼知道越來越慢的 要麼就直接跑幾個小時 怎麼就越來越啦?

    資料插入 無非是加鎖 寫日誌 寫熱資料 後來定時回盤

    如果比以往慢 一般就是還有其他大事務

  • 3 # 皇家救星

    加快oracle資料庫插資料速度方法:

    從程式設計角度考慮:

    1 使用繫結變數,達到一次預編譯多次執行的效果。如果不使用繫結變數,資料庫每次都要對sql進行分析,消耗資源。

    2 使用oracle提供的批次介面,這樣可以減少網路傳輸次數,加快效率

    3 適當增加commit間隔,commit指令比較消耗資料庫資源,儘量多插入一些資料再提交。建議一千條以上。

    4 使用hint(如+append),使用insert 語句 nologging選項,減少資料庫日誌登記。

    5 考慮使用多程序插入或者使用並行hint插入

    從資料庫角度考慮:

    1 把表改成nologging模式,這樣不用登記回滾日誌

    2 對錶進行分割槽,讓不同分割槽落在不同硬碟

    4 增大資料庫緩衝區

    5 使用ssd儲存等高效硬碟作為資料庫儲存

    其他細節:

    例如把程式部署到資料庫伺服器再操作,減少網路消耗

    插入資料程式輸出日誌重定向到硬碟

  • 中秋節和大豐收的關聯?
  • 如果因為一些身體或其他原因,無法母乳餵養,應該給寶寶喂什麼呢?