2012-02-15 19 views
2

我有一個表格,大約在10,000,000行左右。我需要從我的C#應用​​程序翻閱此表。我使用NHibernate。我曾嘗試使用此代碼示例:當我執行它的操作最終超時,如果我的startId超過7000000更大了大桌面上的Nhibernate分頁性能(10,000,000行)

return session.CreateCriteria(typeof(T)) 
       .SetFirstResult(startId) 
       .SetMaxResults(pageSize) 
       .List<T>(); 

。我使用的pageSize是200.我在小於1000行的小表上使用了這種方法,它的工作原理和執行速度很快。

的問題是,在這樣一個大的表有沒有更好的方式來完成這項使用NHibernate?

+0

哪個rdbms?或者SQL的外觀如何?也許嘗試在那裏扔OrderBy ... – dotjoe 2012-02-15 22:33:26

+0

這是MSSQL2005。立即嘗試訂單。 – Dave 2012-02-15 22:43:07

+0

訂單實際上沒有什麼區別,但我確實發現將startId更改爲更低的值可以使操作完成。它似乎窒息了大約7,000,000或更高的startId值。更低的速度是緩慢的,但至少會結束。 – Dave 2012-02-15 22:55:09

回答

2

您試圖一次翻頁1000行200?爲什麼?沒有人會翻閱那麼多的數據。

您需要先篩選數據集,然後應用TSQL風格尋呼較小的數據集。 Here are some methods that will work。只需修改它們,以便通過某種過濾(WHERE子句,CTE或派生表)獲得不到1000萬行的行。

+0

不錯的鏈接。我也看到了關於分頁的評論「..你爲什麼要..」。在很多情況下,這只是一項業務需求。我正在研究一個導入平面文本文件的系統(一些文件包含數十萬行)。我們提供了一個功能來查看導入後的文件,並且我不打算加載所有行以供他們查看,因此分頁似乎是理想的解決方案。這是由於用戶希望能夠按各種列進行排序,因此雖然他們可能不想遍歷整個文件,但他們需要一些機制來查看數據。 – 2012-02-16 02:13:42

+0

我以前有這樣的要求。沒有人會翻閱數據。假設每頁1秒,則需要138小時才能完成。他們想要的是看一個樣本集,並看到有1000萬個可用。爲他們提供良好的索引和搜索重要領域的方法,他們應該感到高興。你正在努力解決一些永遠不會被用到的方式。我會深入研究這些要求,讓他們精煉。告訴他們他們有多瘋狂。解釋並展示替代品。你是在房間裏有知識的人。 – 2012-02-16 12:11:47

+2

這並不是說我們試圖讀取10M記錄,但我們可能只想看看最後幾百個記錄。也許你可以爲此提出一個替代策略。 – Dave 2012-02-16 15:11:10

1

有趣的是你應該提出這個問題,因爲我有同樣的問題。我的問題與使用NHibernate的分頁無關,但更多的只是使用直接的T-SQL。

看起來好像有幾個選項。我發現在我的實例中很有用的一個是this answer,它涉及到有關尋呼的問題。它討論了使用「..keyset驅動的解決方案」,而不是通過使用ROW_NUMBER()來返回排名結果。我不確定NHibernate會在這個實例中使用什麼,或者如果可以根據你發出的查詢(我知道你可以在Hibernate中,但我沒有使用過NHibernate)來查看它生成的SQL。

如果你不知道該使用SQL Server的基於ROW_NUMBER返回排列好的結果,那麼這是值得研究的。關於如何去尋呼,很多人似乎都參考了this article。我已經看到一些後來的帖子勸阻使用SET ROWCOUNT,儘管贊成使用TOP與動態參數 - SELECT TOP(@NumOfResults)。

有很多在這裏SO對此職位的,但最好的辦法沒有明確的答案,據我可以看到去了解它。我會密切關注這篇文章,看看其他人的建議。

1

它可能通過隔離層問題。

我有類似的問題。 如果您讀取的表不斷更新,更新程序會鎖定表的一部分,導致超時,然後從表中讀取數據。 添加SetIsolationLayer(ReadUncommitted),您必須注意數據可能有點髒。

+0

感謝您的建議,isolationLayer已被設置爲ReadUncommited。 – Dave 2012-02-16 15:11:57