ID、日付、およびその他の列を含む大きなテーブルがあります。IDはインデックス付けされ、シーケンシャルです。
特定の日付以降のすべての行を選択したい。IDが連続していることを考えると、行がIDの降順で並べられている場合、日付テストに失敗した最初の行がチェックを続ける必要はありません。これを最適化するためにインデックスをどのように利用できますか?
ID、日付、およびその他の列を含む大きなテーブルがあります。IDはインデックス付けされ、シーケンシャルです。
特定の日付以降のすべての行を選択したい。IDが連続していることを考えると、行がIDの降順で並べられている場合、日付テストに失敗した最初の行がチェックを続ける必要はありません。これを最適化するためにインデックスをどのように利用できますか?
あなたはこのようなことをすることができます:
With FirstFailDate AS
(
-- You start by selecting the first fail date
SELECT TOP 1 * FROM YOUR_TABLE WHERE /* DATE TEST FAILING */ ORDER BY ID DESC
)
SELECT *
FROM YOUR_TABLE t
-- Then, you join your table with the first fail date, and get all the records
-- that are before this date (by ID)
JOIN FirstFailDate f
ON f.ID > t.ID
実際に日付をインデックス付けせずにこれを行うための良い「合法的な」方法はないと思います。
ただし、次のようなことを試すことができます。
SELECT * FROM YOUR_TABLE ORDER BY ID DESC
。考え方は、DBMSが部分的な結果をクライアントに送信し始める前に、クエリ全体を終了する必要がない場合があるということです。この場合、DBMSがIDに対してインデックススキャンを実行することを期待しています(による)。結果が発生したときに結果を取得し、終了する前に停止することORDER BY ID DESC
ができます。
注:DBMSで、最初の行を高速に取得するか、結果全体を高速に取得するかをバランスさせるオプションが提供されている場合は、最初のオプション(/*+ FIRST_ROWS */
Oracleのヒントなど)を選択してください。
もちろん、現実的な量のデータで測定を実行して、これが特定の状況で実際に機能することを確認してください。