2016-08-24 24 views
0

我目前正在開發一個程序,用於根據數據表檢索數據庫中的記錄。從oracle數據庫中選擇多條記錄的有效方法(或在短時間內)

這是我的sql cmd字符串。

select distinct a.id, 
       a.name, 
       b.status, 
       b.date 
from table1 a 
left join table2 b 
    on a.id = b.id where #$%^$#%@ 

而一些表格有大約5000萬條記錄或以上。在大多數情況下,套接字不會返回超時錯誤,因爲用戶將輸入他們想要的where子句。但是,當程序試圖從數據庫中檢索所有記錄時,它將顯示套接字錯誤,因爲它需要太多時間來檢索不允許的記錄。

我的一個經歷是限制使用rownum檢索的行,因爲用戶可能不需要從表中獲取如此多的數據。例如,用戶可以輸入他們想要檢索10行和記錄的最大行數。我會將10000條記錄還給他們。但我未能通過使用rownum < 10000檢索相同的確切數量的記錄,我不知道它是如何工作的...

因此,我在這裏要求來自專業開發人員的任何建議。請幫忙!非常感謝!!!!

+0

請記住,限制或傳呼並不總是作爲一種快捷方式作爲操作的工作可能需要完全完成。這可能是一種排序或某些集合操作的情況。除此之外,設置一個請求限制和一個'SELECT * from()WHERE ROWNUM <1000)'(都在一起)確實允許表達式快捷。你也可以先使用'select cound(*)'。除此之外,不用硬性的陳述這些陳述可能是一個想法,但可以使用低價位的消費者羣體,並與(甲骨文)資源經理一起放置失控的會話。 – eckes

回答

2

首先你要清楚(自己),你需要什麼樣的數據。

如果您需要生成整體統計數據,那麼您需要所有數據。保存中間結果可能會有所幫助,但您仍然需要閱讀所有內容。在這種情況下,將套接字超時設置爲大約24小時,只要確保您的SELECT不阻止其他進程。

但是,如果你正在製作一個客戶端應用程序(在HTML表格中顯示一些數據),那麼你肯定不需要一切。設計您的應用程序,以便用戶首先應用過濾器,然後他們收到第一個結果頁面,然後收到第二個結果頁面...瞭解谷歌搜索或電子商店的工作原理 - 首先獲得空白主頁(可能有一些促銷)開始過濾。

其次,技術思路:

  • 限制在甲骨文12實現的,所以你可以使用SELECT * FROM table OFFSET 0 ROWS FETCH NEXT 10000 ROWS ONLY。對於舊版本,您必須使用舊的WHERE rownum <= 10000,這與ORDER BY不適用。
  • 在使用聚合等時保存中間結果
  • 儘量減少JOIN的需求(非規範化)。
0

其他兩個答案已經提到,您可以使用order by子句和rownum這樣實現分頁:

select * from (
    SELECT *, rownum rnum FROM (SELECT foo FROM Foo ORDER BY OFR_ID) WHERE rownum <= stopOffset 
) where rnum >=startOffset 

或現代的Oracle使用OFFSET。 我想指出的其他事情,當你想要檢索許多(如hundrend數千至數百萬)行處理它們在應用程序,它顯示了 - 一定要設置足夠大的(通常爲1000 <獲取大小? < 5000)在你的應用程序中。通常情況下,當您檢索具有默認抓取大小的結果時,執行時間會有很大差異,而在知道存在大量行時,會以較大的抓取大小檢索結果。例如,在Java中,你可以明確地制定一個查詢時設置FETCHSIZE您Statement對象:

PreparedStatement statement = connection.prepareStatement(query); 
statement.setFetchSize(1000); 
+1

不好的例子,因爲如果你通過rownum取消並在相同的子查詢中排序 - 它可能不會返回實際數據。請參閱文檔https://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm –

相關問題