2017-06-08 26 views
0

私はMS SQLを使用しており、Product(ProdID、その他のフィールド)とProdCat(ID、ProdID、CategoryID)の2つのテーブルを持っています。内部結合を使用してクエリを高速化するためのインデックスを作成する

そして、私が選択

SELECT TOP (8) ProdID, Description, Image 
FROM Products INNER JOIN ProdCat ON ProdCat.ProdID = Products.ProdID 
WHERE Products.Active=1 AND ProdCat.CategoryID = 123 Order by ProdCat.sorting, Products.ProdID 

のような製品表を作っています以上50.000を持ち、ProdCatテーブルは、以上150.000記録を持っており、クエリが遅いです。

このクエリを高速化するためのインデックスの作成方法を教えてください。

ありがとうございました。

+0

こんにちは、ようこそ。あなたが助けることができるテーブルの詳細が不足しているため、ここにインデックスを提供することはできません。あなたはテーブルと既存のインデックスのddlを提供できますか?インデックスは実際には問題ではないが、そのような詳細がなければ、あまりできないかもしれない。 –

+0

クエリの実際の実行計画を掲載する必要があります。これはSSMSから簡単に入手できます。 – Igor

+0

計画を見て、問題がどこにあるかを確認します。その特定のクエリを最適化するいくつかのインデックスを想像することができますが、それらはそのクエリに特有で、一般的には有用ではありません...しかし、テーブルスキーマ、プラン、およびデータ。 – pmbAustin

答えて

0

これはあなたのクエリです:クエリを最適化することができ、2つの方法がありますので

SELECT TOP (8) ProdID, Description, Image 
FROM Products p INNER JOIN 
    ProdCat pc 
    ON pc.ProdID = p.ProdID 
WHERE p.Active = 1 AND pc.CategoryID = 123 
Order by pc.sorting, p.ProdID; 

これは少し困難です。まずProdCat(CategoryId, ProdId)Products(ProdId, Active)を試してください。

残念ながら、どちらも順序を排除するものではありません。しかし、これによりパフォーマンスが向上する可能性があります。

0

ProdCat(ID、PRODID、区分)

なぜID列がありますか?それは役に立たないようです。

このような多対多のリンクテーブルでは、単一のProdIDのすべてのCategoryIDを効率的に取得し、単一のカテゴリのすべてのProdIDを取得できる必要があります。

あなたの質問は、その理由の大文字小文字の区別です。 Products.Activeの基数が低い場合は、クエリがそこから開始し、各アクティブな製品のカテゴリを検索するか、Category = 123で始まり、すべての製品を検索することがあります。

このテーブルには、(ProdID、CategoryID)のクラスター化されたPKと(クラスID)のクラスター化されていないインデックス(またはその逆)が必要です。

関連する問題