私はSybaseクエリを最適化しようとしているSQLServer開発者です。非クラスターインデックスをシークしようとしていますが、スキャンを続行します。非クラスターインデックスシークを実現する方法が「シーク」であるかどうかをSybaseで確認したいだけです。
以下のようなクエリがあります(*は実際には約32列です)
SELECTt。*FROMdbo.g1_positions t WHERE t.source_date =(select max(source_date)from g1_positions)
以下のように、テーブルに3つの非クラスターインデックス(クラスターインデックスなし)があります
- 列entity_id、bgnref、retnum、source_dateのprimary_keyという名前のインデックス
- 列entity_id、source_dateのidx_entdteという名前のインデックス
- 列bgnref、source_dateのidx_bgndteという名前のインデックス
内部クエリ(maxはidx_entdteでインデックススキャンを実行します)、外部インデックスはデフォルトでテーブルスキャンを実行します。インデックスを強制すると、インデックススキャンが実行され、「データにI/Oサイズ2Kバイトを使用する」によって決定される追加のクエリが実行されます。ページ。データページのMRUバッファ置換戦略を使用。」
私の推測では、これはSQLServerでの「ルックアップ」に相当します。インデックスを強制した後、パフォーマンスの向上が見られません。パフォーマンスを向上させるために何ができるのか疑問に思っていました。
インデックスの作成/削除/変更など、テーブルに変更を加えることはできません。
SQLServerでのルックアップのアイデアを与えるためだけに機能します。
4つのレコードを持つテーブルEmployeeがあるとします。
クエリがEmp_idで非クラスターインデックスを使用する場合、リーフノードに到達し、実際のデータを取得するには、ポインターを使用してヒープ上の実際のデータ(行)を読み取ります。ポインタを使用するこのプロセスは、ルックアップと呼ばれます