3

私は次のクエリを持っています:

SELECT
    COUNT(*)
FROM
    FirstTable ft
        INNER JOIN SecondTable st ON ft.STID = st.STID

ご想像のとおり、「STID」は「SecondTable」の主キーです...そして「FirstTable」にはその2番目のテーブルへのポインタがあります。これが私が持っているインデックスです:

FirstTable:列「STID」のNONCLUSTERED INDEX

SecondTable:CLUSTERED PRIMARY KEY「STID」のINDEX

上記のクエリでは、サブツリーのコストは19.90で、2秒かかります。

そのクエリに対してデータベースチューニングアドバイザーを実行した後、彼らは私が2番目のテーブルに持っていたものとまったく同じインデックスを作成することを提案しました...しかしクラスター化されていません。だから私はこれらの結果でそれを試しました。

FirstTable:列「STID」のNONCLUSTERED INDEX

SecondTable:NONCLUSTERED「STID」のINDEX

さて、上記のクエリは私に10.97のサブツリーコストを与え、 1秒未満かかります!

この100%は私の脳を粉砕します...このシナリオでNONCLUSTEREDインデックスがCLUSTEREDインデックスよりも高速に実行されるのはなぜですか?

4

1 に答える 1

7

クエリはテーブルから実際のレコードを取得しないため、カウントされるだけです。

非クラスター化インデックスでは、おそらくを使用して2つのインデックス(テーブルよりもサイズが小さい)を結合するだけMERGE JOINです。

クラスター化されたインデックスでは、テーブルと非ク​​ラスター化されたインデックスを結合する必要があります。テーブルが大きくなり、移動に時間がかかります。

次のようなクエリを発行する場合:

SELECT  SUM(first_table_field + second_table_field)
FROM    FirstTable ft
INNER JOIN
        SecondTable st
ON      ft.STID = st.STID

実際の値を取得すると、クラスタリングの利点がわかります。

于 2010-03-03T12:13:41.133 に答える