0

いくつかの、たとえば5つの異なる検索画面を備えたWebアプリ(Java、Spring、Hibernate、Sybase as DB)がある場合、ユーザーの基準に基づく検索結果が制限、たとえば1000行を超えるかどうかを最初に数えたいと思います。ユーザーが妥当なフィルターと基準を提供したとしても、1000を超える巨大な結果が発生する可能性があります。

このようにすることをお勧めしますか?

  1. ここでテーブル--clausesなどからcount(*)を選択します
  2. 次に、1000を超える場合は、実際の検索を行わずに戻り、制限エラーを表示します(検索を絞り込むようにユーザーに指示します)
  3. それ以外の場合、1000未満の場合は、実際の検索を実行し、結果セットをユーザーに返します

または、これを処理するためのより良い解決策はありますか?

これが進むべき道である場合、私のフォローアップの質問は、SQLクエリの重複をどのように回避できるかということです。私はこれを行うことを理解しているので、select句にcount(*)のみが含まれることを除いて、同じ検索SQLを宣言する必要があります。

更新

さらに、2つのことを避けたいと思います:1。実際のSQLの実行からの処理2. ORMによるドメインオブジェクトのロード/マッピング(この場合はHibernate) *カウントが>であることを検出すると、1と2の両方が回避されます1000。

4

3 に答える 3

2

を実行するのCOUNT(*)ではなく、。を使用してクエリを実行するだけLIMIT 1001です。カウントでまったく同じ結果セットを生成している可能性があり(つまり、COUNTを実行するには、結果セットを生成する必要があります)、次のヒットはキャッシュからのものであるか、最悪の場合、再計算する必要があります。同じ仕事を2回しているだけです

于 2012-07-25T05:03:46.960 に答える
0

アプリケーションについても同じ手順に従いました。はい、唯一の違いは、SQLで*の代わりにcount(1)を配置することです。

ただし、場合によっては、カウントクエリが結果のサブセットをフェッチするよりも時間がかかることを理解する必要があります。

于 2012-07-25T05:01:02.800 に答える
0

行セットから行を取得する方法に応じて、そのレベルで結果を単純にフィルタリングできます。

すなわち

int rowIndex = 0;
while (rs.hasNext() && rowIndex < 1000) {
    // ... Extract results
    rowIndex++;
}

結果セットがトリミングされていることをユーザーに警告することもできます;)

于 2012-07-25T05:01:55.090 に答える