2012-02-15 11 views
2

私は約10,000,000行でかなり大きいテーブルを持っています。私はC#アプリケーションからこのテーブルを参照する必要があります。私はNHibernateを使用しています。私startIdが7,000,000より大きい場合外に私が運転結局回、それを実行するとNhibernate大きなテーブル(10,000,000行)のページングパフォーマンス

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

:私はこのコード例を使用しようとしました。私が使用しているpageSizeは200です。私は、このメソッドを1000行未満の非常に小さなテーブルで使用しています。

質問は、このような大きなテーブルでNHibernateを使用してこれを達成する良い方法はありますか?

+0

どのrdbmsですか?またはSQLの外観はどうですか?たぶんそこにOrderByを投げてみてください... – dotjoe

+0

それはMSSQL2005です。今注文をしようとしています。 – Dave

+0

注文は実際には何の違いもありませんでしたが、startIdを低い値に変更すると操作が完了することができました。それは約700万以上のstartId値でチョークするようです。低いものは遅いですが、少なくとも終了します。 – Dave

答えて

2

一度に1000万行ずつページを移動しようとしていますか?どうして?人間はそれほど多くのデータをページするつもりはない。

最初にデータセットをフィルタ処理し、次に小さなデータセットにTSQLスタイルのページングを適用する必要があります。 Here are some methods that will work。何らかのフィルタリング(WHERE句、CTE、または派生テーブル)を使用して、1000万行未満になるように変更してください。

+0

ニースのリンク。私はまた、そのページのコメントに関して "あなたは何をしたいのですか?"と多くのことを見てきました。多くの場合、それは単にビジネス要件です。私は、フラット・テキスト・ファイル(数十万行を含むもの)をインポートするシステムに取り組んでいます。私たちは一度インポートされたファイルを見るための機能を提供しています。私はそれらを見るためにすべての行をロードするつもりはないので、ページングは​​理想的なソリューションのようです。ユーザーがさまざまな列で並べ替えることができるようにするため、ファイル全体をページングする必要はないものの、データを表示するためのメカニズムが必要です。 –

+0

私は以前にその要件を持っていました。誰もデータをページしません。 1ページあたり1秒と仮定すると、それを通過するには138時間かかります。彼らが望むのは、サンプルセットを見て、利用可能な1000万があることを確認することです。彼らに良い索引付けと重要なフィールドを検索する方法を提供し、彼らは幸せになるはずです。あなたは、それが必要であると言っているように、これまで使用されていないことを解決するために懸命に働いています。私はこれらの要件を掘り下げて洗練されたものにする。彼らがどれほど狂っているかを見せてください。代替案を説明し、説明する。あなたは部屋の知識を持った人です。 –

+2

10Mのレコードを読み込もうとしているわけではありませんが、最後の数百だけを見たいと思うかもしれません。たぶんあなたはこれのための代替戦略を提案することができます。 – Dave

1

面白いのですが、私は同じ問題を抱えています。私の問題はNHibernateを使用したページングとは関係ありませんが、まっすぐなT-SQLを使うだけです。

いくつかのオプションがあるようです。私のインスタンスでは非常に便利だとわかったのは、ページングに関する質問にはthis answerでした。 ROW_NUMBER()を使用してランク付けした結果を返すのではなく、 "キーセット駆動型ソリューション"を使用する方法について説明します。私はNHibernateがこのインスタンスで何を使用するのか、またはあなたが発行したクエリに基づいて生成するSQLを見ることができるかどうか分かりません(私はあなたがHibernateでできることは知っていますが、NHibernateは使用していません)。

SQL SERVERを使用してROW_NUMBERに基づいてランク付けされた結果が返されたことに気付かない場合は、十分に調べる価値があります。多くの人が、ページングの仕方については、this articleを参照しているようです。私はいくつかの後の投稿がSET ROWCOUNTの使用を妨げているのを見てきました。しかし、動的パラメータでTOPを使用することに賛成です - SELECT TOP(@NumOfResults)。

これについては、ここにはたくさんの投稿がありますが、私が見る限り、それについては最善の方法で決定的な答えはありません。私は他の人が何を示唆しているかを見るために、この投稿に注目していきます。

1

これは、アイソレーションレイヤの問題による可能性があります。

私も同様の問題がありました。 読み込み元のテーブルが常に更新されている場合、アップデータはテーブルの一部をロックし、タイムアウトしてテーブルから読み込みます。 SetIsolationLayer(ReadUncommitted)を追加すると、データが少し汚れている可能性があることに注意する必要があります。

+0

提案のおかげで、isolationLayerはすでにReadUncommitedに設定されていました。 – Dave

関連する問題