2

私はSybaseクエリを最適化しようとしているSQLServer開発者です。非クラスターインデックスをシークしようとしていますが、スキャンを続行します。非クラスターインデックスシークを実現する方法が「シーク」であるかどうかをSybaseで確認したいだけです。

以下のようなクエリがあります(*は実際には約32列です)

SELECTt。*FROMdbo.g1_positions t WHERE t.source_date =(select max(source_date)from g1_positions)

以下のように、テーブルに3つの非クラスターインデックス(クラスターインデックスなし)があります

  1. 列entity_id、bgnref、retnum、source_dateのprimary_keyという名前のインデックス
  2. 列entity_id、source_dateのidx_entdteという名前のインデックス
  3. 列bgnref、source_dateのidx_bgndteという名前のインデックス

内部クエリ(maxはidx_entdteでインデックススキャンを実行します)、外部インデックスはデフォルトでテーブルスキャンを実行します。インデックスを強制すると、インデックススキャンが実行され、「データにI/Oサイズ2Kバイトを使用する」によって決定される追加のクエリが実行されます。ページ。データページのMRUバッファ置換戦略を使用。」

私の推測では、これはSQLServerでの「ルックアップ」に相当します。インデックスを強制した後、パフォーマンスの向上が見られません。パフォーマンスを向上させるために何ができるのか疑問に思っていました。

インデックスの作成/削除/変更など、テーブルに変更を加えることはできません。

SQLServerでのルックアップのアイデアを与えるためだけに機能します。

4つのレコードを持つテーブルEmployeeがあるとします。

ここに画像の説明を入力してください

クエリがEmp_idで非クラスターインデックスを使用する場合、リーフノードに到達し、実際のデータを取得するには、ポインターを使用してヒープ上の実際のデータ(行)を読み取ります。ポインタを使用するこのプロセスは、ルックアップと呼ばれます

4

1 に答える 1

1

それが可能だ!

使用していない場合は、テーブルスキャンの方が優れているためと思われます。それは統計がオフになっているためかもしれません!それらも更新してください。

必要に応じて、インデックスの使用を強制できます。詳細については、この例を確認してください。

于 2012-08-17T10:14:03.683 に答える