2012-03-27 120 views
0

我想改进此查询。如何改进此左连接查询

使用INNER JOIN不需要时间(少于1秒)。

但是加上左连接需要大约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

您是否在查询中尝试了数据库优化引擎顾问? – mellamokb 2012-03-27 18:14:21

+1

使用“INNER JOIN”有什么问题?推测它不会给你正确的数据集,但你不告诉我们这是什么。 – Bojangles 2012-03-27 18:15:05

+0

你真的需要'CROSS JOIN'吗?另外,你正在改变为'LEFT JOIN'的'INNER JOIN'是什么? – Lamak 2012-03-27 18:17:10

回答

1

你需要FromSLoc,StatusId和Id

上dbo.tbIntTransferInfo索引需要的ID

上dbo.tbmStorageLocation索引你需要dbo.tbmTransferStatus索引的ID

你需要CrateTypeId

你需要dbo.tbIntTransferDetail上IntTransferId指数上dbo.tbmCrateSize索引,取消和Id,CrateSizeId

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

我怀疑'TOP(100)Percent'是否有助于这个查询,我不得不看看有没有知道的计划。

+0

很可能TOP(100)Percent会被查询解析​​器引擎抛出/忽略。 – 2012-03-27 18:28:13

+0

我做了,为所有人设置了foriegn钥匙。 – TaeV 2012-03-28 20:18:06