我想改进此查询。
使用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种尺寸的板条箱。一笔交易最多可以转移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'。
请帮助我改进。
答案 0 :(得分:1)
你需要一个关于FromSLoc,StatusId和Id的dbo.tbIntTransferInfo的索引
您需要在Id
上的dbo.tbmStorageLocation上建立索引你需要在Id上的dbo.tbmTransferStatus索引
你需要一个关于CrateTypeId,Canceled和Id的dbo.tbmCrateSize的索引
你需要在IntTransferId,CrateSizeId上的dbo.tbIntTransferDetail索引
如果这些索引中的任何一个可以是“唯一的”,那就更好了。
我怀疑'TOP(100)百分比'正在帮助这个查询,我必须看到这个计划,不管怎样都不知道。