2016-12-28 9 views
-1

以下のクエリを実行すると、ほぼ4分かかりました。最適化のためのより良い方法でSQLクエリを書くには?

これはクエリである

SELECT 
    transactionsEntry.StoreID StoreID, 
    items.ItemLookupCode ItemLookupCode, 
    SUM(transactionsEntry.Quantity) 
FROM 
    [HQMatajer].[dbo].[TransactionEntry] transactionsEntry 
RIGHT JOIN 
    [HQMatajer].[dbo].[Transaction] transactions ON transactionsEntry.TransactionNumber = transactions.TransactionNumber 
INNER JOIN 
    [HQMatajer].[dbo].[Item] items ON transactionsEntry.ItemID = items.ID 
WHERE 
    YEAR(transactions.Time) = 2015 
    AND MONTH(transactions.Time) = 1 
GROUP BY 
    transactionsEntry.StoreID, items.ItemLookupCode 
ORDER BY 
    items.ItemLookupCode 

TransactionEntryテーブルはitemテーブル40件のKレコードを有し、Transactionテーブルは300億件のレコードを有し、900億件のレコードを有していてもよいです。

見積りコスト 。それは84%を示します。それはクラスタ化インデックスです。

+4

一般的なヒントは、ほとんどの人にとってはあまりにも混乱しているので、右ジョインを使用しないでください。代わりにLEFT JOINに切り替えると、 'オプションのデータはメインテーブルに追加されます。 – jarlh

+1

最初に取引テーブルからレコードをフィルタリングしてから、それぞれのテーブルに参加してみてください。 –

+0

@ ps_prakash02あなたは正しいです。今それは1分を減らす。しかし、まだ時間がかかります2分30秒 –

答えて

0

クエリで使用しているすべてのテーブルのインデックスを作成します。 これは、結果を非常に迅速に生成するためのより良い方法です。例えば

ItemID in Item Tableのインデックスを作成TransactionNumber, ItemID and StoreID in TransactionEntry Table

のインデックスを作成Time and TransactionNumber in Transaction Table

のインデックスを作成します。

このサイトをご覧ください。 You can learn from the basic for query tuning and SQL optimization

+0

@DuduMarkovitz私はこれが正しい答えになることを願って –

+0

私は混乱しています。 「mohamed faisal」は「mohamed faisal」の質問に答えていますか?これは評判の生成スキームのいくつかの種類ですか? – deroby

+0

@deroby私はエジプトに数年前にいたとき、私はモハメドという男に会った。彼は私に言った: "彼の叔父の名前はモハメド、彼のいとこ、モハメド、彼の義理のモハメド、彼の父の名前もモハメドだったが、母親の名前 - モハメドではない"。 (地域的に象徴的な名前の喜び)。それ以外に、モハメドの両者は疑わしく似たような表を使って質問してきました。 [この疑問](http://stackoverflow.com/a/41342365/224704)では、モアメッドはモハメドの答えを理解していないようだが、それを成功裏にテストすることはできました。 –

3

関数呼び出しを避ける - インデックスの使用を防ぎます。あなたが列transactions.Timeにインデックスを持っていない場合、この列にインデックスを追加

Where transactions.Time >= '2015-01-01' 
    and transactions.Time < '2015-02-01' 

を試してみてください。

+0

'もしあなたが持っていなければ、transactions.Timeにインデックスを追加します.'とはどういう意味ですか? –

+0

もっと理解できますか? –

+0

これで24秒が短縮され、結果は3分44秒から3分20秒に短縮されます。 –

-1

それはあなたがクラスタ化インデックスのスキャンを防ぐために必要

select transactionsEntry.StoreID StoreID,items.ItemLookupCode ItemLookupCode,SUM(transactionsEntry.Quantity) 
FROM [HQMatajer].[dbo].[TransactionEntry] transactionsEntry 
INNER JOIN [HQMatajer].[dbo].[Item] items ON transactionsEntry.ItemID = items.ID 
RIGHT JOIN [HQMatajer].[dbo].[Transaction] transactions ON transactionsEntry.TransactionNumber = transactions.TransactionNumber 
Where transactions.[Time] >= '2015-01-01' and transactions.[Time] < '2015-02-01' 
GROUP BY transactionsEntry.StoreID,items.ItemLookupCode 
ORDER BY items.ItemLookupCode 
+0

y down vote .. ?? –

+0

where句を除いて私のクエリとの違いは何もありません。それは既に提案されています。次回の運がよかった –

+0

@mohamedfaisalもう一度クエリをチェックしてください。内部結合の後で正しい結合を使用する方がよいでしょう。 –

0

を助けるかもしれないと、このコードを試してみてください。

私は[transactionsentry]にカバリングインデックスを作成することはお勧め:

Key Columns:[TransactionNumber],[ItemID] 

Include:[StoreID] 

また、[トランザクション]上でこのインデックスを試してみてください。

Key Columns:[time],[TransactionNumber] 

(申し訳ありませんが、私はそれ以上の深さを提供しますが、私はできません

関連する問題