![](/img/trans.png)
[英]How to insert 4 million records from Oracle to Elasticsearch table faster using C#?
[英]Listing more than 10 million records from Oracle With C#
我有一個數據庫,其中包含超過1億條記錄。 我正在運行一個包含超過一千萬條記錄的查詢。 這個過程花費太多時間,所以我需要縮短這個時間。 我想將獲取的記錄列表另存為csv文件。 我怎樣才能做到最快和最優化? 期待您的建議。 謝謝。
我假設您的查詢已經限制在所需的行/列中,並且可以很好地利用索引。
在這樣的規模上,唯一關鍵的事情是您不要嘗試將所有內容立即加載到內存中; 因此,請忘掉諸如DataTable
和大多數全脂ORM(它們通常會嘗試將行與身份管理器和/或變更管理器關聯)之類的東西。 你將不得不為使用原始IDataReader
(從DbCommand.ExecuteReader
),或建立一個任何API非緩沖迭代器最重要的是(有幾個,我偏向短小精悍)。 出於編寫CSV的目的,原始數據讀取器可能很好。
除此之外:由於帶寬受限,您無法使其運行得更快。 更快獲得它的唯一方法是在數據庫服務器上創建CSV文件,這樣就不會造成網絡開銷。
您很可能需要在C#中執行此操作。 這是批量數據加載/導出的領域(通常在數據倉庫方案中使用)。
比起您在任何平台上編寫的工具,許多(免費)工具(我想甚至是Quest Software的Toad)都將更強大,更有效地執行此操作。
我有一種預感,對於最終用戶,您實際上並不需要它(簡單的觀察是部門秘書實際上並不需要郵寄該副本;它太大了,無法以這種方式使用)。
我建議為工作使用正確的工具。 不管你做什么
“這個過程花費了太多時間,所以我需要縮短這個時間。”
此過程包含三個子過程:
這些問題中的任何一個或全部都可能成為瓶頸。 因此,如果要減少總的經過時間,則需要弄清楚時間在哪里花費。 您可能需要檢測C#代碼以獲取指標。
如果事實證明查詢是問題所在,那么您將需要對其進行調整。 在檢索表的很大一部分(> 10%)時,索引在這里無濟於事,因此提高全表掃描的性能將有所幫助。 例如增加內存以避免磁盤排序。 並行查詢可能很有用(如果您擁有Enterprise Edition並且您有足夠的CPU)。 還要檢查問題是否不是硬件問題(主軸爭用,不可靠的互連等)。
可以寫入文件嗎? 也許您的磁盤由於某種原因(例如碎片)而變慢,或者您正在與其他寫入同一目錄的進程競爭。
跨網絡傳輸大量數據顯然是潛在的瓶頸。 您確定只向客戶端發送相關數據嗎?
一種替代的體系結構:使用PL / SQL將記錄寫到數據服務器上的文件中,使用批量收集來檢索可管理的記錄批次,然后通過FTP將文件傳輸到最終需要的位置,也許首先壓縮它。
真正的問題是,為什么需要從數據庫中讀取這么多行(以及很大一部分基礎數據集)。 有許多方法可以避免這種情況,其中明顯的方法是同步處理,消息排隊和預合並。
現在暫且不談...如果您要合並或篩選數據,然后在PL / SQL中實現大量邏輯,就不必在網絡上拖拉數據(即使只是到本地主機,仍然有一個大開銷)。 同樣,如果您只想將其轉儲到平面文件中 ,則在C#中實現此操作不會帶來任何好處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.