如何改进此左连接查询
我想改进此查询。如何改进此左连接查询
使用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'。
请帮我改进。
你需要FromSLoc,StatusId和Id
上dbo.tbIntTransferInfo索引需要的ID
上dbo.tbmStorageLocation索引你需要dbo.tbmTransferStatus索引的ID
你需要CrateTypeId
你需要dbo.tbIntTransferDetail上IntTransferId指数上dbo.tbmCrateSize索引,取消和Id,CrateSizeId
如果这些索引中的任何一个可以是“唯一”的,那会更好。
我怀疑'TOP(100)Percent'是否有助于这个查询,我不得不看看有没有知道的计划。
很可能TOP(100)Percent会被查询解析器引擎抛出/忽略。 – 2012-03-27 18:28:13
我做了,为所有人设置了foriegn钥匙。 – TaeV 2012-03-28 20:18:06
您是否在查询中尝试了数据库优化引擎顾问? – mellamokb 2012-03-27 18:14:21
使用“INNER JOIN”有什么问题?推测它不会给你正确的数据集,但你不告诉我们这是什么。 – Bojangles 2012-03-27 18:15:05
你真的需要'CROSS JOIN'吗?另外,你正在改变为'LEFT JOIN'的'INNER JOIN'是什么? – Lamak 2012-03-27 18:17:10