-1

私は Struts 2 フレームワークを使用していますが、この質問は Struts 2 関連だけではありません。

私は自分のウェブサイトにある種のページネーションを持たせようとしています。ページに表示したいレコードのリストがあるとします。リストには 150 件のレコードがありますが、各ページに 50 件を表示したいので、この場合は 3 ページになります。もちろん、リストはDBから取得されます。

ひねりを加えたのは、クエリに 7 秒以上かかると強制終了されるという制限があることです(質問しないでください)。したがって、150 件のレコードをすべて同時に取得すると、クエリに 7 秒以上かかっていることになります。そのため、毎回 50 レコードを取得することにしました。したがって、この場合、DB に 3 回アクセスします (50 50 50)。最初に合計 (150) をフェッチするので、DB に何回戻る必要があるかがわかります。

このような事態にどのように対処するかについて、あなたの考えを共有できますか? ストアド プロシージャまたはクエリを微調整することが最善の策であると言う人もいるかもしれませんが、SP とクエリが大量にあるため、それは困難な道です。

例をいただければ幸いです。

4

3 に答える 3

1

最初に実際のフェッチを行う必要はありません。カウントのみをフェッチできます (集計関数クエリ)。ライブのページ分割されたリストは、特に非常に大きなデータセットで一般的です。唯一の問題は、ページの状態が保証されないことです。つまり、レコードが前のページの順序で挿入される可能性があるため、古いレコードが新しいページにプッシュされ、その逆も同様です。ただし、これを使用することは一般的に許容されます。

于 2009-04-21T12:15:23.060 に答える
0

ページングの処理方法に関する一般的なヒントをお探しですか? クエリを小さく保つためにデータベースから必要なレコードのみを取得する必要があると考えるのは正しい方向に進んでいます。

RDBMS が異なれば、レコードの列挙とページングに対するアプローチも異なります。MySQL にはこのLIMITキーワードがあり、MS SQL Server 2005 以降にはROW_NUMBER()機能があり、Oracle にはROWNUM特別な列があります。RDBMS によっては、これらの機能の使用例を簡単に見つけることができます。

于 2009-04-21T12:13:23.923 に答える
0

限られた数のレコードのみを取得するようなページネーションのクエリの例は次のとおりです:-

select * from records limit $start,50

ここでは、元のクエリが select * from records であると想定しています。元のクエリに「limit $start,50」を追加するだけです。ここで、最初の 50 レコードを取得する場合は start を 0 に、50 ~ 100 レコードをフェッチするには start を 50 に、100 ~ 150 レコードの場合は start を 100 に等しくする必要があります。クエリは、レコード番号 $start から始まる 50 レコードを取得します。これでページネーションの問題が解決することを願っています。

于 2009-04-21T12:47:22.627 に答える