2

これについて私を助けるためにあなたの時間を共有できることを願っています.

現在、データ取得のパフォーマンスを比較するために 3 つのテーブルを使用しています。これら 3 つのテーブルには、同じ列 (LocInvID、ActivityDate、ItemID、StoreID、CustomerID)、同じデータ (約 1,300 万レコード) があります。

  1. テーブル LocInv1: LocInvID でクラスター化インデックスを使用します (主キーでもあります)。ActivityDate にパーティション テーブルを使用する。また、3 つの列 (ItemID、StoreID、CustomerID) は非クラスター化インデックスです。

  2. テーブル LocInv2: LocInvID でクラスター化インデックスを使用します (主キーでもあります)。Partition Table を使用していません

  3. テーブル LocInv3: LocInvID でクラスター化インデックスを使用します (主キーでもあります)。また、3 つの列 (ItemID、StoreID、CustomerID) は非クラスター化インデックスです。Partition Table を使用していません

    非クラスター化インデックスの作成 [IX_LocInv3] ON [LocInv3] ( [ItemID] ASC ,[StoreID] ASC, [CustomerID] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE =オフ、ALLOW_ROW_LOCKS = オン、ALLOW_PAGE_LOCKS = オン) オン [プライマリ] GO

そして、このクエリ文字列を実行すると(3つのテーブルで)

select ActivityDate,ItemID,StoreID,CustomerID from LocInv1 WITH (INDEX(IX_LocInv))  where ItemID=43 
select ActivityDate,ItemID,StoreID,CustomerID from LocInv2 where ItemID=43 
select ActivityDate,ItemID,StoreID,CustomerID from LocInv3 where ItemID=43

結果はかなり奇妙です:

  1. テーブル LocInv1 が最も遅くなりました。出来ますか?クエリ文字列が間違っていますか?

  2. テーブル LocInv3 は非クラスター化インデックスを使用しますが、実際の実行計画ではクラスター化インデックス スキャンです。理解できません。ItemID を使用してクエリを実行しましたが、なぜクラスター化インデックス スキャンなのですか?

  3. Table LocInv2 は LocInvID に Clustered Index のみを使用していますが、最速の結果が得られました。それが正しいか?

お知らせ下さい。

ありがとう。

4

1 に答える 1

0

クエリ オプティマイザは、インデックスだけでなくインデックスに含まれるデータにも依存して、見つけられる高速な方法を選択します。

クラスタ化されたインデックスによる検索は、通常は高速ですが、場合によっては、インデックスを削除して再度配置することをテストできます。

言うまでもなく、テーブルが受けた操作 (挿入、更新、削除) によっては、後でインデックスを挿入すると検索にも影響します。

これらの変更により、複数のページを持つインデックスを持つ可能性のあるもののサイズに応じて、インデックスの保存方法が変更されます。

これらのテーブル内のデータの挿入スクリプトを 1 つ投稿できれば、見栄えが良くなります。クエリ アナライザー テスト (ctrl+l) のみを行った場合、100% 正確ではないはずです。

于 2012-08-21T12:53:38.093 に答える