私がいくつかのSELECT
声明を持っているとしましょう:
SELECT id, name FROM people
ORDER BY name ASC;
people
テーブルには数百万の行があり、ORDER BY
句はここで示したものよりもはるかに複雑になる可能性があります (12 の列を操作する可能性があります)。
UI に表示するために、行の小さなサブセット (行 1..11 など) のみを取得します。今、私は次の問題を解決したいと思います:
- 指定された の行の番号を見つけます
id
。 - 指定された の行の前の 5 項目と後の 5 項目を表示し
id
ます。
問題 1 を解決したら、問題 2 は簡単に解決できます。探していたアイテムが1000
ソートされた結果セットに行番号を持っていることがわかっている場合は、次のようなものを使用できます (これは Firebird SQL ダイアレクトです)。
SELECT id, name FROM people
ORDER BY name ASC
ROWS 995 TO 1005;
また、探している行の前にあるすべての行を数えることで行のランクを見つけることができることも知っていますが、これにより、多数の条件付きWHERE
の句が非常に長くなる可能性がOR
ありAND
ます。そして、私はこれを繰り返し行わなければなりません。私のテスト データでは、適切にインデックス付けされた列を使用している場合でも、数百ミリ秒かかるため、遅すぎます。
いくつかの SQL:2003 機能 ( row_number
Firebird 3.0 でサポートされているものなど) を使用してこれを達成する手段はありますか? 私は SQL の第一人者ではありません。ここでいくつかの指針が必要です。結果にランク/密ランク/行インデックスが含まれるキャッシュ ビューを作成できますか?