2012-03-27 13 views
0

このクエリを改善したいと思います。この左結合クエリを改善する方法

INNER JOINでは時間がかかりません(1秒未満)。

ただし、LEFT JOINを使用すると、ほぼ1分の時間がかかります。

結果は約17500レコードです。

なぜ、私はそれを改善したいと思います。

SELECT TOP (100) PERCENT iti.Id 
     , iti.TransferDate 
     , iti.FromSLoc AS FromSLocId 
     , slf.Name AS FromSLoc 
     , ct.Id AS CrateTypeId 
     , ct.Type AS CrateType 
     , cs.Id AS CrateSizeId 
     , cs.Size AS CrateSize 
     , itd.Amount 
     , iti.SenderRemark 
     , iti.ToSLoc AS ToSLocId 
     , slt.Name AS ToSLoc 
     , iti.StatusId, ts.Name AS Status 
     , iti.CreatedBy 
FROM dbo.tbIntTransferInfo AS iti 
INNER JOIN dbo.tbmStorageLocation AS slf 
     ON slf.Id = iti.FromSLoc 
INNER JOIN dbo.tbmStorageLocation AS slt 
     ON slt.Id = iti.ToSLoc 
INNER JOIN dbo.tbmTransferStatus AS ts 
     ON ts.Id = iti.StatusId 
CROSS JOIN dbo.tbmCrateSize AS cs 
INNER JOIN dbo.tbmCrateType AS ct 
     ON ct.Id = cs.CrateTypeId 
     AND cs.Cancelled = 0 
LEFT JOIN dbo.tbIntTransferDetail AS itd 
     ON iti.Id = itd.IntTransferId 
     AND itd.CrateSizeId = cs.Id 
ORDER BY iti.Id, CrateTypeId, CrateSizeId 

私のシステムでは、私は6サイズの木枠を持っています。また、1つの取引で最大6個の箱サイズを転送することができます。私が欲しいのは、6つの箱サイズの取引を示すレコードです。トランザクションがいくつかのクレートサイズを転送しなかった場合は、NULLにします。

私は次のようになりたい結果:

Id, ... , CrateType, CrateSize, Amount 
1 ... X   Big  100 
1 ... X   Small  50 
1 ... Y   Big  NULL 
1 ... Y   Small  NULL 
1 ... Z   Big  10 
1 ... Z   Small  20 
2 ... X   Big  30 
2 ... X   Small  40 
2 ... Y   Big  NULL 
2 ... Y   Small  NULL 
2 ... Z   Big  NULL 
2 ... Z   Small  NULL 

トランザクション1 - >転送クレートタイプ「X」と「Z」「をビッグ」と「小」サイズで、クレートを転送しませんでした「Y」と入力します。

トランザクション2 - >転送タイプ 'X'を 'ビッグ'と 'スモール'サイズで転送し、クレートタイプ 'Y'と 'Z'を転送しませんでした。

お気軽にお問い合わせください。

+1

クエリでDatabase Tuning Engine Advisorを試したことがありますか? – mellamokb

+1

「INNER JOIN」を使用すると何が問題になりますか?おそらく、それはあなたに正しいデータセットを与えるわけではありませんが、それがどちらであるかを教えてくれるわけではありません。 – Bojangles

+0

あなたは本当に 'CROSS JOIN'を必要としますか?また、あなたがLEFT JOINに変更している「INNER JOIN」は何ですか? – Lamak

答えて

1

あなたは、あなたが

IDにdbo.tbmTransferStatusにインデックスを必要とする

同上

上dbo.tbmStorageLocationのインデックスを必要とするFromSLoc、StatusIdし、ID

上dbo.tbIntTransferInfoのインデックスを必要とします

あなたはCrateTypeId上dbo.tbmCrateSizeのインデックス、キャンセル、およびIdを

あなたはIntTransferId上dbo.tbIntTransferDetailのインデックスを必要とし、CrateSizeId

を必要とします

これらのインデックスのいずれかが「一意」になることができる場合は、それが良いでしょう。

「TOP(100)Percent」がこのクエリを助けるのではないかと疑問に思っています。

+0

クエリパーザエンジンによってTOP(100)パーセントがスロー/無視される可能性があります。 –

+0

私は、それらのすべてにforiegnキーを設定しました。 – TaeV

関連する問題