簡體   English   中英

如何遍歷Oracle表中的所有行?

[英]How to loop through all rows in an Oracle table?

我有一個包含大約30,000,000行的表,我需要迭代,分別操作每行的數據,然后將數據從行保存到本地驅動器上的文件中。

使用SQL for Oracle循環遍歷表中所有行的最有效方法是什么? 我一直在谷歌搜索,但沒有看到這樣做的直接方式。 請幫忙。 請記住,我不知道確切的行數,只是估計。

編輯澄清:

我相信我們正在使用Oracle 10g。 行數據包含blob數據(壓縮文本文件和xml文件),這些數據將被讀入內存並加載到自定義對象中,然后使用.Net DOM訪問類進行更新/轉換,重新壓縮並存儲到本地驅動器上。

我沒有太多的數據庫經驗 - 我計划在ADO.Net + OracleCommands中使用直接的SQL語句。 沒有性能限制。 這是供內部使用的。 我只是想以最好的方式做到這一點。

您需要從Oracle DB讀取30m行,並將每行中的BLOB(每行一個BLOB列中的一個壓縮XML /文本文件?)中的30m文件寫入本地計算機上的文件系統?

顯而易見的解決方案是在SELECT * FROM tbl WHERE <range>上打開ADO.NET DataReader,以便您可以批量處理。 從閱讀器讀取BLOB到您的API,做你的東西並寫出文件。 我可能會嘗試編寫程序,以便它可以從許多計算機上運行,​​每個計算機都有自己的范圍 - 你的瓶頸很可能是解壓縮,操作和重新壓縮,因為許多消費者可能會從該表中流式傳輸數據服務器對服務器性能沒有明顯影響。

我懷疑你是否能夠通過Oracle數據庫內部基於集合的操作來做到這一點,我也會考慮文件系統以及你將如何組織這么多文件(以及你是否有空間 - 請記住文件系統上的文件占用的大小始終是文件系統塊大小的偶數倍。

您可以嘗試使用rownum查詢來獲取塊,直到您獲取不存在的塊。

這是關於rownum查詢的好文章: http//www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html

如果您不想閱讀,請直接跳到末尾的“使用ROWNUM分頁”部分進行示例查詢。

我最初的解決方案是做這樣的事情,因為我可以訪問id號(偽代​​碼):

            int num_rows = 100;
            int base = 0;
            int ceiling = num_rows;

            select * from MY_TABLE where id >= base and id < ceiling;
            iterate through retrieved rows, do work,
            base = ceiling; 
            ceiling += num_rows;
            select * from MY_TABLE where id >= base and id < ceiling;
            iterate through retrieved rows, do work,
            ...etc.

但我覺得這可能不是最有效或最好的方式......

在處理大量行時,最好使用基於集合的操作。

然后,您將享受到性能優勢。 處理完數據后,您應該能夠一次性將表中的數據轉儲到文件中。

這種可行性取決於您需要對行執行的處理,盡管在大多數情況下可以避免使用循環。 是否有一些特定的要求會阻止您一次處理所有行?

如果迭代遍歷行是不可避免的,使用批量綁定可能是有益的:FORALL批量操作或BULK COLLECT用於“選擇進入”查詢。

這聽起來像你需要整個數據集,你可以做任何數據操作之前 ,因為它是一個BLOB>。 我只是使用DataAdapter.Fill,然后將數據集交給自定義對象進行迭代,執行操作,然后將結束對象寫入磁盤,然后壓縮。

暫無
暫無

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

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