2017-01-30 7 views
0

私は2つのテーブルを持っています:ベター・インデックスは

SELECT * FROM orders where customer_id = @id 

    SELECT * FROM orders where customer_id = @id and order_date > @date 

    SELECT * FROM orders where order_date > @date1 and order_date < @date2 

    SELECT first_name, last_name, favorite_website FROM customers where last_name = @last_name 

    SELECT customer_id, first_name, last_name,favorite_website 
FROM customers where last_name = @last_name and favorite_website = @site 

私はこれらのテーブルのインデックスを作成して、その作成によって上記の質問の実装が加速されるようにしたいと考えています。

私が見つけた唯一のインデックスは、以下のとおりです。

1.`create index indexorders on orders (order_id, customer_id, order_date, product_id, order_quantity);` 

2.`create index indexcust on customers (customer_id, last_name, first_name, favorite_website);` 

はこれらよりも優れている任意の他のインデックスはありますか?いくつかお勧めしますか?受注テーブルに

+1

すべてのクエリに対して 'select'に' * 'をしたいですか?インデックスはイオンカラムの選択に基づいて最適化することができます –

+0

例のワークロードでは検索されないため、order_idカラムを最初のインデックスに置くことは無意味です。 BETWEENと>およびとの間に>があるので、 'order_date'をクラスタード・インデックスの最初の列に、おそらく' customer_id'をクラスタード・インデックスの2番目の列にするのが理にかなっています。 –

答えて

0

..

は、受注テーブルに主キー(customerid,orderdate)(独特の場合)を作成したり、組み合わせの下に使用します。このインデックスは、お客様のテーブルへの質問

create index nci_custid_ordt on dbo.orders 
(
customerid, 
orderdate) 
include 
(
order_id, product_id, order_quantity) 

で提供クエリの組み合わせだけのために動作します

組み合わせの下に使用して、非クラスタ化インデックスを作成

create index nci_lstname_fw on dbo.customers 
(
last_name,favorite_website) 
include 
(customer_id, first_name) 

あなたに得意先コードを作成することができますプライマリキーとオーダーIDをそれぞれのテーブルのプライマリキーとして使用していますが、クエリーで使用しないと何も表示されません。

+0

orderdate、customeridという列は、orderdateに2つの範囲クエリがあるので、私は提案します –

+0

@ Nick.McDermaid:それはcustomeridに残っていますが、私が提案したインデックスは表示されません – TheGameiswar

+0

hmmmmなぜここに深みがあるのですか?それが被覆指数であれば、残余はなぜ必要でしょうか?いずれの順序の列も、最初の3つのクエリのうち2つを満たしますが、先頭のorderdateは範囲クエリに適しています。 –

関連する問題