130

indexテーブルに適切なものを追加する必要があり、助けが必要です。

私は混乱しており、いくつかの点を明確にする必要があります:

  • non-int列にインデックスを使用する必要がありますか? なぜ/なぜしないのか

  • 私はインデックスclusterednon-clusteredインデックスについて多くのことを読みましたが、どちらをいつ使用するかをまだ決定できません。良い例は、私と他の多くの開発者を助けるでしょう。

頻繁に更新される列やテーブルにはインデックスを使用すべきではないことはわかっています。他に注意すべきことはありますか?また、テスト フェーズに進む前に、すべてが正常であることをどのように確認できますか?

4

6 に答える 6

278

クラスター化インデックスは、行の格納方法を変更します。1 つの列 (またはいくつかの列) にクラスター化インデックスを作成すると、SQL サーバーはテーブルの行をその列で並べ替えます。これは辞書のようなもので、本全体ですべての単語がアルファベット順に並べられています。

一方、非クラスター化インデックスは、行がテーブルに格納される方法を変更しません。インデックス付けのために選択された列と、データを含むテーブルの行へのポインターを含む、テーブル内にまったく異なるオブジェクトを作成します。本の最後のページにある索引のようなもので、キーワードが並べ替えられ、本の内容のページ番号が含まれているため、すばやく参照できます。

于 2011-08-21T11:48:26.997 に答える
83

2 つの問題を区別する必要があります。

1)主キーは論理構造であり、テーブル内のすべての行を一意かつ確実に識別する候補キーの 1 つです。これは、INT、GUID、文字列など、実際には何でもかまいません。シナリオに最も適したものを選択してください。

2)クラスタリング キー(テーブルの "クラスター化インデックス" を定義する列) - これは物理ストレージに関連するものであり、ここでは、小さくて安定した、増え続けるデータ型が最適です - INTまたは BIGINT をデフォルトのオプションとして使用します。

デフォルトでは、SQL Server テーブルの主キーはクラスタリング キーとしても使用されますが、そうである必要はありません。

私が適用する 1 つの経験則は次のとおりです。「通常の」テーブル (データを格納するために使用するテーブル、つまりルックアップ テーブルなど) にはクラスタリング キーが必要です。クラスタリングキーを持たないことは本当に意味がありません。実際、一般に信じられていることとは反対に、クラスタリング キーを使用すると、実際にはすべての一般的な操作が高速化されます (挿入や削除も含む) (テーブルの構成が異なり、通常はヒープ(クラスタリング キーのないテーブル) よりも優れているため)。

インデックス作成の女王である Kimberly Tripp は、クラスタリング キーを使用する理由と、クラスタリング キーとしてどのような列を使用するのが最適かというトピックについて、非常に多くの優れた記事を書いています。テーブルごとに 1 つしか取得できないため、クラスタリング キーだけでなく、適切なクラスタリング キーを選択することが最も重要です。

マルク

于 2011-02-21T21:32:45.277 に答える
21

例を使用した非クラスター化インデックスとクラスター化インデックスの比較

非クラスター化インデックスの例として、EmployeeID 列に非クラスター化インデックスがあるとします。非クラスター化インデックスは、

従業員ID

AND その値が実際に格納されている Employee テーブル内の行へのポインター。一方、クラスター化インデックスは、実際には特定の EmployeeID の行データを格納します。したがって、15 の EmployeeID を検索するクエリを実行している場合、テーブル内の他の列のデータは次のようになります。

EmployeeName、EmployeeAddress など

. 実際にはすべて、クラスター化インデックス自体のリーフ ノードに格納されます。

これは、クラスター化されていないインデックスでは、テーブル内の行へのポインターをたどって他の必要な値を取得するために余分な作業が必要であることを意味します。クラスター化インデックス自体と同じ順序。そのため、クラスター化インデックスからの読み取りは、通常、非クラスター化インデックスからの読み取りよりも高速です。

于 2013-04-24T12:44:55.477 に答える
4

一般に、主キー(デフォルトではクラスター化インデックスがあります)など、(多くの)使用される列のインデックスを使用してテーブルを検索します。たとえば、クエリ(擬似コード)がある場合

SELECT * FROM FOO WHERE FOO.BAR = 2

FOO.BARにインデックスを付けることをお勧めします。クラスター化インデックスは、並べ替えに使用される列で使用する必要があります。クラスタ化インデックスはディスク上の行を並べ替えるために使用されるため、テーブルごとに1つしか持つことができません。たとえば、クエリがある場合

SELECT * FROM FOO ORDER BY FOO.BAR ASCENDING

FOO.BARのクラスター化されたインデックスを検討することをお勧めします。

おそらく最も重要な考慮事項は、クエリにかかる時間です。クエリにそれほど時間がかからないか、あまり使用されない場合は、インデックスを追加する価値がない可能性があります。いつものように、最初にプロファイルを作成し、次に最適化します。SQL Server Studioは、最適化する場所に関する提案を提供します。MSDNには、役立つと思われる情報1がいくつかあります。

于 2011-02-21T20:07:26.000 に答える
2

データはインデックス順に物理的に格納されるため、非クラスターよりも読み取りが高速です。テーブルごとに 1 つしか作成できません。(クラスター インデックス)

クラスター索引よりも挿入および更新操作が高速です。n 個の非クラスタ インデックスを作成できます。

于 2013-06-08T15:11:17.677 に答える