どの時点でインデックスが効率的になるか


9

テーブルにインデックスを追加すると検索が高速になり、挿入が遅くなるが、テーブルが大きい場合に限られると多くのリソースが見つかりました。これにより、設計上の決定であるトレードオフが生じますが、インデックスの使用が不合理になる前に、おおよそのテーブルサイズが必要です。(たとえば、10行はおそらくその制限をはるかに下回ります)

この制限がどこにあるか、または私を正しい方向に向けるリソースを知っている人はいますか?


アプリケーションの読み取り/書き込み比率はどれくらいですか?本当に書き込みが集中している場合は、おそらく書き込みのトレードオフを考慮する必要があるポイントですが、通常のアプリケーションの場合は、必要なインデックスを99%のケースで追加します(通常、テーブルが大きくなると、サイズを元に戻します)。
Marian

回答:


12

正確な制限を前もって決定することは本当に難しいです。

ほとんどの人が過小評価していることの1つは、インデックスがクエリで使用される候補になる前に、インデックスが満たさなければならない高い要件です。

効率的な(非クラスター化)インデックス

  • 優れた選択性を提供します。たとえば、行全体の非常に小さいパーセンテージ(<1%、<2%)のみを返します。選択性が指定されていない場合-SQL Serverのクエリオプティマイザーはこのインデックスを無視する可能性が高い

  • 理想的にはクエリをカバーする必要があります。つまり、クエリに必要なすべての列を返します。1つまたは2つのインデックス列があり、含まれる列として別の(2-4)列を含むインデックスを作成でき、クエリをカバーできる場合、クエリオプティマイザーがこのインデックスを使用する可能性があります。つまり、コードが常にすべての列SELECT * .....をフェッチするために使用している場合、インデックスが使用される可能性は低くなります-実際には、

他にもたくさんの基準があると思いますが、これらの2つが最も重要な基準だと思います。もちろん、常にインデックスを適切に維持(再編成、再構築)し、インデックスに関連付けられた統計が最新であることを確認する必要があります。

PS:外部キー列の非クラスター化インデックスは特殊なケースです。デフォルトでは、参照整合性チェックとJOINそれらのFK制約の両方を高速化するのに役立つため、常にこれらを追加することをお勧めします。しかし、ここでも、FK列のインデックスを "拡張"して、 "include"列を追加してさらに便利にすることは絶対に有効です。


2
この答えは質問に直接答えることはできませんが、インデックスの重要な設計原則を提供することではるかに良くなり、最初に尋ねるべきだった質問に答えます。
SeanVDH 2013年

6

10行しかないインデックスから改善が見られる場合があります。

私のマシンでの次のテストでは、インデックスのないバージョンが10.5数秒で完了し、インデックスのあるバージョンが数秒で完了しました9.8(3回以上の実行で一貫性があります)。

この場合のインデックスは1つのリーフページのみで構成されていますが、スロット配列はインデックスキーの順序で並べられているため、SQL Serverは、10個すべての集計を実行するのではなく、対象の単一の行を返すことができます。

CREATE TABLE T
(
X INT,
Y CHAR(100) NULL
)

INSERT INTO T (X)
SELECT number 
FROM master..spt_values
WHERE type='P' AND number BETWEEN 1 AND 10

set nocount on;

DECLARE @I INT, @X INT

DECLARE @Time DATETIME2(7) = SYSUTCDATETIME()

SET @I = 1
    WHILE (@I < 1000000)
    BEGIN
    SELECT @X = MAX(X)
    FROM T
    SET @I += 1
    END

SELECT DATEDIFF(MICROSECOND, @Time, SYSUTCDATETIME())

CREATE CLUSTERED INDEX IX ON T(X)
SET @Time = SYSUTCDATETIME()
SET @I = 1
    WHILE (@I < 1000000)
    BEGIN
    SELECT @X = MAX(X)
    FROM T
    SET @I += 1
    END

SELECT DATEDIFF(MICROSECOND, @Time, SYSUTCDATETIME())

DROP TABLE T

インサートは同様に影響を受けますか、それともスローダウンは最小限ですか?
SeanVDH 2013年

@SeanVDH-私の回答の例は、クラスター化インデックスをヒープと比較しています。行が特定の場所に移動する必要があるため、既存の行間の挿入が遅くなり、スロット配列がページ分割の可能性も書き換えるのは当然のことです。大きな挿入の場合、データはCIキーの順序にもソートされる可能性があり、ヒープに挿入する場合は不要です。Kimberley Trippはここで、CIに挿入する方がヒープに挿入するよりも良い場合があると主張しいます。
マーティン・スミス

記事をありがとう、彼女はいくつかの興味深い点を提示します。挿入が小さなテーブルのselectと同じくらい劇的に影響を受けるかどうか疑問に思っていましたが、そうです、トレードオフは最初と同じようになるはずです。
SeanVDH 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.