2011-03-28 1 views
1

私はそうのようなwhere句でSQLクエリを持っている:何が私の最高のパフォーマンスを与えるか、またはこれを行うための適切な方法であるでしょう3つのインデックスまたはSQL Server 2008の2つの列を持つ単一のインデックス?

Where ManufacturerID = @ManufacturerID 
    AND ItemID IN (SELECT ItemID FROM @T) 
      AND RelatedItemID IN (SELECT RelatedItemID FROM @T) 

? 3つのインデックス - 各列に1つ、または3つすべてを含む単一のインデックス?ここ

はSP BEING RUNのより完全なVIWE IS:

DECLARE @T TABLE (
    [CategoryID] [int] NOT NULL, 
    [ManufacturerID] [int] NULL, 
    [ItemID] [varchar](100) NOT NULL, 
    [ItemName] [varchar](100) NULL, 
    [PhotoName] [varchar](150) NULL, 
    [ModifiedOn] [datetime] NULL, 
    [ModifiedBy] [varchar](50) NULL, 
    [IsDeleted] [bit] NOT NULL) 

    ;WITH T As 
(SELECT  CategoryID, ManufacturerID, ItemID, ItemName, PhotoName, ModifiedOn, ModifiedBy, IsDeleted 
FROM   StagingCategoryItems 
WHERE  (ManufacturerID = @ManufacturerID) 
EXCEPT 
SELECT  CategoryID, ManufacturerID, ItemID, ItemName, PhotoName, ModifiedOn, ModifiedBy, IsDeleted 
FROM   CategoryProducts 
WHERE  (ManufacturerID = @ManufacturerID) 
) 
INSERT INTO @T 
SELECT * 
FROM T 


    DELETE FROM CategoryProducts WHERE ManufacturerID = @ManufacturerID 
     AND ItemID IN (SELECT ItemID FROM @T) 
     AND CategoryID IN(SELECT CategoryID FROM @T) 

    INSERT INTO [CategoryProducts] 
      ([CategoryID] 
      ,[ManufacturerID] 
      ,[ItemID] 
      ,[ItemName] 
      ,[PhotoName] 
      ,[CreatedOn] 
      ,[CreatedBy] 
      ,[ModifiedOn] 
      ,[ModifiedBy] 
      ,[DeletedOn] 
      ,[DeletedBy] 
      ,[IsDeleted]) 
     SELECT [CategoryID] 
     ,[ManufacturerID] 
     ,[ItemID] 
     ,[ItemName] 
     ,[PhotoName] 
     ,[CreatedOn] 
     ,[CreatedBy] 
     ,[ModifiedOn] 
     ,[ModifiedBy] 
     ,[DeletedOn] 
     ,[DeletedBy] 
     ,[IsDeleted] 
    FROM [StagingCategoryItems] 
    WHERE ManufacturerID = @ManufacturerID 
    AND ItemID IN (SELECT ItemID FROM @T) 
      AND CategoryID IN(SELECT CategoryID FROM @T) 
+0

データの内容、照会しようとしているもの、および完全な照会SQLについてもう少し詳しく説明します。あなたがここで達成しようとしていることを理解するのは難しいです。 –

+0

これは、このクエリの選択リスト、全体的なクエリの作業負荷、および既存のインデックスに含まれる内容によって異なります。 –

+0

また、パフォーマンスの問題があることを測定して決定しましたか? –

答えて

1
ItemID IN (SELECT ItemID FROM @T) 
AND RelatedItemID IN (SELECT RelatedItemID FROM @T) 

これは非常に危険な状態です。現在のItemIDが@Tで、RelatedItemIDも@Tであるという条件を表しますが、@Tでは同じ行にある必要はありません。

ItemID RelatedItemId 
1  2 
3  4 

をし、あなたのテーブルにあなたのような行があります:条件はTRUEになります

ItemID RelatedItemId 
1  4 

@Tが含まれている場合は、例を挙げれば。これがあなたが望む解決策だと確信していますか?

元のインデックスの質問については、残念ながら、この回答は「それは依存しています」。実際のデータに応じて、複数の索引の組み合わせが有効で、まったく同じ索引が不適切な場合があります。あなたのような質問に近づくときには、「どの条件が最も制限的であり、どれほど制限的なのか」という質問をあなた自身に聞く必要があります。

ManufacturerID = @ManufacturerIDは候補行の数を約10%に制限します(例:メーカーが10種類)。ItemID IN (SELECT ItemID FROM @T)は平均100行の一定サイズに制限され、最後の条件は同じです。したがって、ItemIDの単一のインデックスでさえ十分です。特にクラスタード・インデックスの場合はNCインデックスでも、平均100個のキー・ルック・ポイントについて話していますが、これは小さな変更です。

しかし、ManufacturerID = @ManufacturerIDは候補行の数を約10%に制限し、ItemID IN (SELECT ItemID FROM @T)は行の総数の約5%に制限し、最後の条件は同じですが、 3つの条件の完全一致は行のわずか0.0001%です。今では単一の列インデックス が役に立たないので、3つすべてを含むインデックスが必要です。どのような順序で?優れた質問。

General Index Design Guidelinesをお勧めします。

+0

洞察力、特に私が行っている危険な状態に感謝します - どのようにその問題を並べ替えるかについてのポインタ? – Slee

-1

一方、他の2つはテーブル変数であるからです。

0

Microsoft SQL Serverのパフォーマンスに関する質問だけでなく、SQL Server(PostgreSQL、Oracle、MySQL ....)の一般的なルールは、ワークロードの下でテストし、実行計画が与えることとパフォーマンスが要件を満たしているかどうかを確認することです。いくつかのオプションを試して、どのように説明計画とパフォーマンスに影響を与えるかを確認してください(ほとんどの場合、完了までの時間)。私はあなたが本当に良いテストでそれを証明することができれば、データベースについて多くのことを知る必要はないことを知っています。どのように価値がないのか分かりませんが、世界のどのようにしてどのようにして実世界のテストに勝ることはほとんどありません。

関連する問題