ページャ付のWEBページで発行しているSQLは、書き換えるだけで劇的に高速化できる可能性があります。
大幅に高速化できる可能性があるケース
ページャ付のWEBページでは、「検索条件に当てはまるレコード全体のうち、表示するレコードは一部分だけ」という性質があります。
このとき、クエリが遅くなる典型的なパターンとして、「DB側でレコード全件取得→プログラム側で現在のページに対応するレコードだけを使用して結果表示」という作り方をしている場合があります。
この場合は無駄にレコードを大量取得してしまっているので、読み取り数も実行時間も大きくなりがちです。
クエリの書き換えだけで大幅に速度改善できる可能性があります。
チューニング方法
■ 改善前
「DB側でレコード全件取得→プログラム側で現在のページに対応するレコードだけを使用して結果表示」
-- SQLイメージ
SELECT *
FROM SomeTable
WHERE
SomeCondition = 1
And SomeFlag = 0
And ....
ORDER BY SomeDateTime DESC
■ 改善後
「ROW_NUMBER()を使って最小限のデータをDB側で取得→プログラム側で取得レコードを使用して結果表示」
※検証環境はSQLServerです。ROW_NUMBER()が使えない製品もあるようですね。。
-- SQLイメージ
SELECT *
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY SomeDateTime DESC) AS rownumber
, *
FROM SomeTable
WHERE
SomeCondition = 1
And SomeFlag = 0
And ...
) AS A
WHERE rownumber BETWEEN 1 AND 100 -- 2ページ目なら 101 AND 200 みたいな感じで、ページ番号ごとにここが変わる。この例だと、1ページあたりの表示件数は100件
ORDER BY SomeDateTime DESC
以上、ページャ使用WEBページでのチューニング例でした。改善前の取得レコード数が多ければ多いほど効果も期待できます。(もちろんWEBページ以外でも適用できます)