効果的な方法でページングを実装する方法は?


9

大きな結果セットになるデータベースクエリがあります。データを表示するクライアントはネットワークを介してデータを受信するため、データベースから最初の50件の結果のみを取得してクライアントに送信することにより、転送されるデータの量を最小限に抑えるという考えでした。次に、2番目のページにジャンプして次の50件の結果などを取得する可能性を提供します(例:グーグルが提供するものと同様のもの)

問題は、ページングを実装する効果的な方法は何ですか。mssqlが可能な限りキャッシュを使用し、ページングを変更するたびに同じことが再度実行されないようにしたいと思います。

同時にデータベースをクエリしているクライアントが他にもあります。使用されているSQLエンジン:MS SQL 2005

私の考えは:

  • 準備されたSQLステートメントを使用して、実行プランの共有を確保する
  • ROW_COUNT変数を使用して、必要な行のみを取得します

しかし、それは本当に最も効果的な方法でしょうか?または、結果セット全体を取得して、データをクライアントに送信するコードにページングを実装する方が良いと思いますか?

ヒントをありがとう!

よろしく、トーマス

回答:


7

クエリは毎回実行されます。SQL Serverは結果をキャッシュしません。

適切なページングは​​SQL Server 2011まで実装されませんが、それまでは(識別したとおり)オプションは次のとおりです。

  • ROW_NUMBER()とオンデマンドクエリ
  • クライアントキャッシング

準備されたSQLステートメントも毎回実行されます。

ファットクライアントがある場合、キャッシュはクライアントに対してローカルです。たとえば、数百万のブロブがない限り、これはほとんど問題ありません。

Webクライアントでは、すべての結果をレンダリングしますが、上位100のみを表示し、[すべて表示]ボタンを使用して、101以上の行を持つ非表示のDIVを展開します。Webサーバーにはキャッシュせず、ページングも提供しません。


ありがとう。また、ユーザーが並べ替え基準を変更した場合、より良いアプローチは何ですか?新しい条件でもう一度クエリを実行するか、クライアントで結果を並べ替える必要がありますか?
Tomas Walek

1
私はクライアントを分類します。データはすでに存在しています。はい、データベースはソートに適していますが、データが同じで利用可能な場合は、なぜ別の呼び出しを行うのですか?jQueryアドオンを使用して、ブラウザーでの並べ替えを有効にします:-)
gbn

4

環境によって異なります。私は両方の方法を使用してテストをセットアップし、どちらがあなたに最適かを確認します。個人的には、サーバーでページングします。回線上のデータとクライアントのRAM内のデータが少ないほど、優れています。クライアントマシンの仕様を制御できる場合、すべてのトラフィックは不飽和LANを経由し、クライアントは常に複数のページをすばやくページングするため、クライアントでページングすることができます。


ありがとう。実際には両方が必要です。サーバーとクライアント間の通信はWCFに実装されているため、メッセージの最大サイズがあり、結果のセットがこのサイズを超える場合は、さらに多くのメッセージを送信して完全なデータをクライアントに転送する必要があります。クライアントは、複数のページをすばやくページングすることも好みます... :(
Tomas Walek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.