[解決済み] OFFSET / FETCH NEXTからの総行数取得
2022-10-15 03:48:36
質問
私の Web サイトでページングを実装したいレコードの数を返す関数があります。 これを達成するために、SQL Server 2012 のオフセット/フェッチ ネストを使用することを提案されました。 ウェブサイトでは、レコードの総数と、その時点でどのページにいるのかをリストするエリアを設けています。
以前は、レコードセット全体を取得し、それに基づいてプログラム的にページングを構築することができました。 しかし、FETCH NEXT X ROWS ONLY の SQL 方法を使用すると、X 行しか返されないので、レコード セットの合計が何であるか、最小および最大ページをどのように計算するかがわかりません。 私が知っている唯一の方法は、関数を2回呼び出し、1回目で行のカウントを行い、2回目をFETCH NEXTで実行することです。 私がクエリを2回実行する必要がないより良い方法はありますか? 私はパフォーマンスを遅くするのではなく、スピードアップしようとしています。
どのように解決するのですか?
この場合
COUNT(*) OVER()
... ここでは、簡単な例を示します。
sys.all_objects
:
DECLARE
@PageSize INT = 10,
@PageNum INT = 1;
SELECT
name, object_id,
overall_count = COUNT(*) OVER()
FROM sys.all_objects
ORDER BY name
OFFSET (@PageNum-1)*@PageSize ROWS
FETCH NEXT @PageSize ROWS ONLY;
しかし、これは小規模なデータセットに限ったことであり、大規模なデータセットでは、パフォーマンスが極端に低下する可能性があります。
より良い代替品については、このポール・ホワイトの記事を参照してください。
インデックス付きビューの維持も含めて(これは結果がフィルタリングされていない場合か、あるいは
WHERE
節をあらかじめ用意しておき、それを使って
ROW_NUMBER()
トリック
関連
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] クラスター化インデックスと非クラスター化インデックスの実際の意味は何ですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み] forループの中で<と<=のどちらを使うべきか [閉じた状態].
-
[解決済み] CUDAカーネルのグリッドとブロックの寸法はどのように選択するのですか?
-
[解決済み] Scalaのパターンマッチはバイトコードレベルでどのように実装されているのですか?
-
[解決済み] ファイルキャッシュをクリアしてパフォーマンステストを繰り返す
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン