2012-03-07 3 views
5

私が理解する限り、各トランザクションはデータベースの独自のバージョンを見るため、システムは一部のカウンタから行の総数を取得できず、したがってインデックスをスキャンする必要があります。しかし、私はそれがプライマリキー上のクラスタ化されたインデックスであり、追加のインデックスではないと考えました。とにかく、私は1つ以上の追加インデックスを持っていますか?テーブル内のすべての行を数えるときにクラスタ化されていないインデックススキャンがあるのはなぜですか?

この問題を掘り下げてみると、別の奇妙なことに気づいた。 Id、View_Count、Titleの3つの列を持つ2つの同一のテーブル、ArticlesとArticles2があるとします。最初のビューにはクラスタ化されたPKベースのインデックスのみがあり、2番目のビューにはview_countにクラスタ化されていない非ユニークなインデックスが追加されています。クエリSELECT COUNT(1) FROM Articlesは、追加のインデックスを持つテーブルに対して2倍高速に実行されます。

答えて

8

SQL Serverはクエリを最適化します。テーブル内の行数をカウントする必要がある場合は、できるだけ小さなデータセットを選択します。

クラスタ化されたインデックスを考慮すると、実際のデータページが含まれます.1行あたり数千バイトになる可能性があります。行数をカウントするだけで、これらのバイトをすべてロードすることは、ディスクI/Oの面でも無駄です。

したがって、フィルタリングされていない、または制限されていない非クラスタ化インデックスが存在します。非クラスタ化インデックスには基本的にNCに入れた列が含まれているためインデックス(およびクラスタ化インデックスキー) - 行数をカウントするだけで読み込むデータはずっと少なくなります。

+0

ええ、私は第2の部分を掲示し、より慎重に計画を見たときにそれを理解しました。クラスタ化インデックススキャンのCPUコストは同じですが、IOコストは高くなります。 – synapse

関連する問題