如何改进此左连接查询

时间:2012-03-27 18:12:15

标签: sql sql-server

我想改进此查询。

使用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'。

请帮助我改进。

1 个答案:

答案 0 :(得分:1)

你需要一个关于FromSLoc,StatusId和Id的dbo.tbIntTransferInfo的索引

您需要在Id

上的dbo.tbmStorageLocation上建立索引

你需要在Id上的dbo.tbmTransferStatus索引

你需要一个关于CrateTypeId,Canceled和Id的dbo.tbmCrateSize的索引

你需要在IntTransferId,CrateSizeId上的dbo.tbIntTransferDetail索引

如果这些索引中的任何一个可以是“唯一的”,那就更好了。

我怀疑'TOP(100)百分比'正在帮助这个查询,我必须看到这个计划,不管怎样都不知道。