Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 我们可以在连接中使用的表的最佳数量是多少?_Sql Server_Sql Server 2008_Join_Sql Server 2012 - Fatal编程技术网

Sql server 我们可以在连接中使用的表的最佳数量是多少?

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,

我有一个从7个表中获取记录的查询。所有这些表都被连接起来以获取详细信息,很少有表使用不同的ON子句多次使用。因此,查询中有10个连接。我们如何优化查询以获得更好的性能?我们已经在联接列上建立了索引。我们能做些什么来减少连接的数量?我使用兼容级别为2008的MS SQL 2012

查询:

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:问题是:将其作为问题的一部分。是的,我刚刚做了。