Sql server 我们可以在连接中使用的表的最佳数量是多少?
我有一个从7个表中获取记录的查询。所有这些表都被连接起来以获取详细信息,很少有表使用不同的ON子句多次使用。因此,查询中有10个连接。我们如何优化查询以获得更好的性能?我们已经在联接列上建立了索引。我们能做些什么来减少连接的数量?我使用兼容级别为2008的MS SQL 2012 查询:Sql server 我们可以在连接中使用的表的最佳数量是多少?,sql-server,sql-server-2008,join,sql-server-2012,Sql Server,Sql Server 2008,Join,Sql Server 2012,我有一个从7个表中获取记录的查询。所有这些表都被连接起来以获取详细信息,很少有表使用不同的ON子句多次使用。因此,查询中有10个连接。我们如何优化查询以获得更好的性能?我们已经在联接列上建立了索引。我们能做些什么来减少连接的数量?我使用兼容级别为2008的MS SQL 2012 查询: SELECT TOP 100 MT.ProjectId, matRef, matDescription, matKeyDescription,
SELECT TOP 100
MT.ProjectId,
matRef,
matDescription,
matKeyDescription,
matOpenDate,
matUFN,
matBranchRef,
matClosedDate,
ERN1.feeRef,
WorkTypeCode,
DPT.deptNo AS matDeptRef,
PreviousRef,
MT.ApplicationID,
MatterCompleted,
CASE WHEN MLC.PFCivil_MatterCount = 0 THEN 0 ELSE 1 END AS IsCPF,
CASE WHEN MLC.PF_MatterCount = 0 THEN 0 ELSE 1 END AS IsPF,
CASE WHEN MLC.Family_MatterCount = 0 THEN 0 ELSE 1 END AS IsFM,
CASE WHEN MLC.WL_MatterCount = 0 THEN 0 ELSE 1 END AS IsWills,
CASE WHEN MLC.Convey_MatterCount = 0 THEN 0 ELSE 1 END AS IsConvey,
CASE WHEN MLC.Probate_MatterCount = 0 THEN 0 ELSE 1 END AS IsProbate,
CASE WHEN MLC.PI_MatterCount = 0 THEN 0 ELSE 1 END AS IsPi,
CASE WHEN MLC.PIPortal_MatterCount = 0 THEN 0 ELSE 1 END AS IsPiPortal,
CASE WHEN MLC.CM_MatterCount = 0 THEN 0 ELSE 1 END AS IsChest,
CASE WHEN MLC.Campaigns_MatterCount = 0 THEN 0 ELSE 1 END AS IsMarketing,
CASE WHEN MLC.PFFamilyFixedFee_MatterCount = 0 THEN 0 ELSE 1 END AS IsPFFamilyFixedFeeMatter,
ERN2.feeRef AS MatPartner,
MatPFCertificateNo,
CASE WHEN MT.matClosedDate = {d''1753-01-01''} THEN 0 ELSE 1 END AS IsArchived,
'''' Modules,
MT.ChargeDescID,
MT.MatterTypeID,
PrimaryClient.ClientName,
MB.LastAccDate,
MB.LastBillDate,
MB.LastClientDate,
MB.LastTimeDate
FROM dbo.Matter AS MT
JOIN dbo.Departments AS DPT ON DPT.deptID = MT.deptID
JOIN dbo.Earners AS ERN1 ON ERN1.MemberId = MT.MatFeeMemId
JOIN dbo.Earners AS ERN2 ON ERN2.MemberId = MT.matPartnerMemId
JOIN dbo.WorkTypes AS WT ON WT.WorkTypeID = MT.WorkTypeID
JOIN dbo.ivw_MatterLinkCount AS MLC ON MLC.ProjectId = MT.ProjectId
JOIN dbo.Banks AS ClientBank ON MT.matClientBank = ClientBank.bankID
JOIN dbo.Banks AS OfficeBank ON MT.matOfficeBank = OfficeBank.bankID
JOIN dbo.Banks AS DepositBank ON MT.matDepositBank = DepositBank.bankID
JOIN uvw_MatterPrimaryClient AS PrimaryClient ON PrimaryClient.ProjectId = MT.ProjectId
JOIN dbo.MatterBalance AS MB ON MT.ProjectId = MB.ProjectID
WHERE matDescription LIKE @Description
ORDER BY Isarchived, matRef
这里的诀窍是,“其中matDescription像@Description”不是真正的过滤器。 真正的过滤器是“TOP 100”和“ORDER BY Isarchived,matRef”,因为这个过滤器绝对会过滤掉除100行以外的任何内容。 因此,在Isarchived上也需要一个索引matRef。对matRef的表扫描可能会延迟此操作。 另外,除非Isarchived、matRef组合在约束下是唯一的,否则最好在末尾添加PK,就像Isarchived、matRef、matid的顺序一样,这样就不会有额外的问题来挑选前100名。
最后,如果Isarchived类似于0/1,并且您有大量值为0的记录,那么在order by中它是无用的,因为总是有0。将其设置为筛选器Isarchived=0,并通过使用matRef、matid将其从order中删除,并仅向matRef添加一个索引。您应该在WHERE子句的字段上建立索引,而不是在join列上建立索引。请在这里发布实际计划。如果不查看查询,就无法优化查询,优化查询所需的具体步骤将针对您的查询。一般来说,将正确的索引应用到表中。@LasseV.Karlsen:问题是:将其作为问题的一部分。是的,我刚刚做了。