2012-03-27 17 views
0

Ich möchte diese Abfrage verbessern.So verbessern Sie diese linke Join-Abfrage

Mit INNER JOIN dauert es nicht (weniger als 1 Sekunde).

Aber mit LINKEN JOIN dauert es fast 1 min.

Das Ergebnis ist etwa 17500 Datensätze.

Ich verstehe nicht warum, und ich möchte es verbessern.

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 

In meinem System habe ich 6 Größen der Kiste. Und eine Transaktion kann bis zu 6 Kistengrößen übertragen. Was ich will, sind Datensätze, die Transaktionen mit 6 Kistengrößen anzeigen. Wenn die Transaktion keine Kistengröße übertragen hat, lassen Sie sie NULL.

Das Ergebnis, das ich so aussehen soll:

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 

Transaktion 1 -> Transfer Kiste Typ 'X' und 'Z' mit 'Big' und 'Small' Größe, Transfer nicht Kiste Tippe 'Y'.

Transaktion 2 -> Transfer Kiste Typ 'X' mit 'Big' und 'Small' Größe, nicht übertragen Kiste Typ 'Y' und 'Z'.

Helfen Sie mir bitte zu verbessern.

+1

Haben Sie den Database Tuning Engine Advisor für Ihre Abfrage ausprobiert? – mellamokb

+1

Was ist falsch an der Verwendung eines 'INNER JOIN's? Vermutlich gibt es Ihnen nicht den richtigen Datensatz, aber Sie sagen uns auch nicht, was das ist. – Bojangles

+0

Brauchen Sie wirklich dieses 'CROSS JOIN' ?. Was ist der 'INNER JOIN', den du zu' LEFT JOIN' änderst? – Lamak

Antwort

1

benötigen Sie einen Index für dbo.tbIntTransferInfo auf FromSLoc, StatusID und Id

Sie benötigen einen Index für dbo.tbmStorageLocation auf Id

Sie benötigen einen Index für dbo.tbmTransferStatus auf Id

Sie benötigen einen Index für dbo.tbmCrateSize auf CrateTypeId, Abgebrochen und Id

Sie einen Index für dbo.tbIntTransferDetail auf IntTransferId benötigen, CrateSizeId

Wenn einer dieser Indizes "eindeutig" sein kann, wäre es besser.

Ich bezweifle 'TOP (100) Prozent' hilft dieser Abfrage, ich müsste den Plan mit und ohne zu wissen sehen.

+0

Mehr als wahrscheinlich wird die TOP (100) Prozent von der Abfrage-Parser-Engine ausgeworfen/ignoriert. –

+0

Ich tat, legte den Schlüssel zu allen von ihnen. – TaeV

Verwandte Themen