2

一意ではない非クラスター化インデックスであるフィールドに where 句があるいくつかの SQL クエリから少し余分なパフォーマンスを引き出しようとしています。これはテーブル A の外部キーでもあります。その外部キーは主キーです。テーブル B にあり、クラスター化インデックスです。

私が疑問に思っているのは、テーブル A からテーブル B への結合を追加し、クラスター化インデックスであるフィールドに where 句がある場合 (追加の結合のない非クラスター化インデックスとは対照的に)、パフォーマンスが向上するかどうかです。 )?

ありがとう

4

5 に答える 5

2

余分なパフォーマンスを実際に引き出すには、一意でなく、クラスター化されていないインデックスがカバリング インデックスであること(つまり、クエリを満たすために必要なすべての列がインデックスに含まれていること)を確認することをお勧めします。実行しているクエリ。これを行うために、SQL 2005 で導入された組み込みの概念を利用できます。

于 2010-08-04T14:08:07.090 に答える
1

私はいくつかのテストを行いました。テーブルA(〜3000行)とテーブルB(〜200行)の2つのテーブルがあります。どちらにも列IDがあります。TableA: ID - pk、TableB: ID - fk、非クラスター化インデックス。

1 つのテーブルから選択:

SELECT 
    a.ID
FROM
    dbo.TableA a
WHERE 
    a.ID IN (1,5,7,9,23,45,56,546,67,32,54,676)

- 実行計画:

|--Index Seek(OBJECT:([Database].[dbo].[TableA].[IX_TableA_ID] AS [a]), SEEK:([a].[ID]=(1) OR [a].[ID]=(5)) ORDERED FORWARD)

-- 統計 IO:

Table 'TableA'. Scan count 2, logical reads 4, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

2 つのテーブルを使用して選択する (内部結合)

SELECT 
    t.ID
FROM
    dbo.TableA a
INNER JOIN 
    dbo.TableB t  with(index(PK_TableBs)) ON t.ID = a.ID
WHERE 
    t.ID IN (1,5,7,9,23,45,56,546,67,32,54,676)

- 実行計画:

  |--Nested Loops(Inner Join, OUTER REFERENCES:([t].[ID]))
       |--Clustered Index Seek(OBJECT:([Database].[dbo].[TableB].[PK_TableB] AS [t]), SEEK:([t].[ID]=(1) OR [t].[ID]=(5)) ORDERED FORWARD)
       |--Index Seek(OBJECT:([Database].[dbo].[TableA].[IX_TableA_ID] AS [a]), SEEK:([a].[ID]=[Database].[dbo].[TableB].[ID] as [t].[ID]),  WHERE:([Database].[dbo].[TableA].[ID] as [a].[ID]>=(1) AND [Database].[dbo].[TableA].[ID] as [a].[ID]<=(5)) ORDERED FORWARD)

-- 統計 IO:

Table 'TableA'. Scan count 2, logical reads 4, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'TableB'. Scan count 2, logical reads 4, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

結果:

2 番目のクエリのコストは、最初のクエリ (33%) に対して 67% (バッチに対して) です。また、2 番目のクエリでは、より多くの読み取りが必要です。

PS。これは簡単な例です。自分で確認してください。

于 2010-08-04T14:58:40.140 に答える
0

結合がどのように機能するかを考えると、結合条件を満たすためにテーブル A の FK 列を検索する必要があります。これは、回避しようとしているように見えるスキャンです。したがって、これによってパフォーマンスが向上する方法はないと思います。

于 2010-08-04T14:25:46.967 に答える
0

別のテーブルを追加すると、より多くの読み取りが必要になるため、そうは思いません。しかし、あなたはテストする必要があります。

于 2010-08-04T10:16:01.920 に答える
0

フランクによると、これにはテーブル B からのより多くのページ読み取りが必要です。フィルタリングが実行される外部キーに NC インデックスが既にあると言います。FK (B の PK) によってテーブル A をクラスタリングすることの長所と短所を比較検討することもできます。通常、B でフィルタリングしてテーブル A をフェッチする場合、これにより A でフェッチされるページの数を減らすことができます (ただし、明らかに、これによって影響を受ける可能性のある他のクエリが存在する可能性があり、これはこれに反する可能性があります)

于 2010-08-04T10:21:51.177 に答える