簡體   English   中英

使用C#列出超過1000萬條Oracle記錄

[英]Listing more than 10 million records from Oracle With C#

我有一個數據庫,其中包含超過1億條記錄。 我正在運行一個包含超過一千萬條記錄的查詢。 這個過程花費太多時間,所以我需要縮短這個時間。 我想將獲取的記錄列表另存為csv文件。 我怎樣才能做到最快和最優化? 期待您的建議。 謝謝。

我假設您的查詢已經限制在所需的行/列中,並且可以很好地利用索引。

在這樣的規模上,唯一關鍵的事情是您不要嘗試將所有內容立即加載到內存中; 因此,請忘掉諸如DataTable和大多數全脂ORM(它們通常會嘗試將行與身份管理器和/或變更管理器關聯)之類的東西。 你將不得不為使用原始IDataReader (從DbCommand.ExecuteReader ),或建立一個任何API非緩沖迭代器重要的是(有幾個,我偏向短小精悍)。 出於編寫CSV的目的,原始數據讀取器可能很好。

除此之外:由於帶寬受限,您無法使其運行得更快。 更快獲得它的唯一方法是在數據庫服務器上創建CSV文件,這樣就不會造成網絡開銷。

您很可能需要在C#中執行此操作。 這是批量數據加載/導出的領域(通常在數據倉庫方案中使用)。

比起您在任何平台上編寫的工具,許多(免費)工具(我想甚至是Quest Software的Toad)都將更強大,更有效地執行此操作。

我有一種預感,對於最終用戶,您實際上並不需要它(簡單的觀察是部門秘書實際上並不需要郵寄該副本;它太大了,無法以這種方式使用)。

我建議為工作使用正確的工具。 不管你做什么

  • 不要滾動自己的數據類型轉換
  • 將CSV與帶引號的文字一起使用,並考慮轉義其中的雙引號
  • 考慮區域選項(愛荷華州:始終使用InvariantCulture進行導出/導入!)

“這個過程花費了太多時間,所以我需要縮短這個時間。”

此過程包含三個子過程:

  1. 檢索> 1000萬條記錄
  2. 將記錄寫入文件
  3. 跨網絡傳輸記錄(我的假設是您正在針對遠程數據庫使用本地客戶端)

這些問題中的任何一個或全部都可能成為瓶頸。 因此,如果要減少總的經過時間,則需要弄清楚時間在哪里花費。 您可能需要檢測C#代碼以獲取指標。

如果事實證明查詢是問題所在,那么您將需要對其進行調整。 在檢索表的很大一部分(> 10%)時,索引在這里無濟於事,因此提高全表掃描的性能將有所幫助。 例如增加內存以避免磁盤排序。 並行查詢可能很有用(如果您擁有Enterprise Edition並且您有足夠的CPU)。 還要檢查問題是否不是硬件問題(主軸爭用,不可靠的互連等)。

可以寫入文件嗎? 也許您的磁盤由於某種原因(例如碎片)而變慢,或者您正在與其他寫入同一目錄的進程競爭。

跨網絡傳輸大量數據顯然是潛在的瓶頸。 您確定只向客戶端發送相關數據嗎?

一種替代的體系結構:使用PL / SQL將記錄寫到數據服務器上的文件中,使用批量收集來檢索可管理的記錄批次,然后通過FTP將文件傳輸到最終需要的位置,也許首先壓縮它。

真正的問題是,為什么需要從數據庫中讀取這么多行(以及很大一部分基礎數據集)。 有許多方法可以避免這種情況,其中明顯的方法是同步處理,消息排隊和預合並。

現在暫且不談...如果您要合並或篩選數據,然后在PL / SQL中實現大量邏輯,就不必在網絡上拖拉數據(即使只是到本地主機,仍然有一個大開銷)。 同樣,如果您只想將其轉儲到平面文件中 ,則在C#中實現此操作不會帶來任何好處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM