このクエリを改善したいと思います。この左結合クエリを改善する方法
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'を転送しませんでした。
お気軽にお問い合わせください。
クエリでDatabase Tuning Engine Advisorを試したことがありますか? – mellamokb
「INNER JOIN」を使用すると何が問題になりますか?おそらく、それはあなたに正しいデータセットを与えるわけではありませんが、それがどちらであるかを教えてくれるわけではありません。 – Bojangles
あなたは本当に 'CROSS JOIN'を必要としますか?また、あなたがLEFT JOINに変更している「INNER JOIN」は何ですか? – Lamak