首页 > 解决方案 > 为什么 SQL Server 连接执行时间过长?

问题描述

我正在用数据填充一个临时表,下面是我的临时表的定义。

DECLARE @PurgeFilesList TABLE
(
    JobFileID BIGINT,
    ClientID INT,
    StatusID INT,
    IsPurgeSuccessfully BIT,
    ReceivedDate DATETIME,
    FilePath VARCHAR(2000),
    StatementPath VARCHAR(2000)
)

插入逻辑以填充临时表,之后我将使用名为的表进行附加连接Account

SELECT 
    JobFileID,
    PFL.ClientID,
    StatusID,
    IsPurgeSuccessfully,
    ReceivedDate,
    CASE 
       WHEN FilePath IS NULL THEN StatementPath 
       ELSE FilePath 
    END 'FilePath'
FROM 
    @PurgeFilesList PFL
INNER JOIN 
    Account(NOLOCK) A ON ISNULL(PFL.ClientID, 0) = ISNULL(A.ClientID, 0) 
                      AND A.HoldStatementPurge = 0

但是,此连接花费了太多时间。尽管 Account 表中的总行数少于 5000。

Account表架构:

Column_name         Type    Computed    Length
-----------------------------------------------
AccountID           bigint      no        8
AccountNumber       varchar     no        32
PrimaryCustomerName varchar     no        100
LastName            varchar     no        100
ClientName          varchar     no        32
BankID              varchar     no        32
UpdatedDate         datetime    no        8
IsPurged            bit         no        1
PurgeDate           datetime    no        8
ClientID            int         no        4
HoldStatementPurge  bit         no        1

如果需要任何其他信息,请告诉我。

执行计划:

在此处输入图像描述

标签: sqlsql-serverjoinquery-performance

解决方案


由于您没有使用任何列,Account因此我将使用EXISTS

select fl.JobFileID, fl.ClientID, fl.StatusID, 
       fl.IsPurgeSuccessfully, fl.ReceivedDate, 
       isnull(FilePath, StatementPath) as FilePath
from @PurgeFilesList fl
where fl.ClientID is null or
      exists (select 1 
              from Account a 
              where a.clientid = fl.clientid and a.HoldStatementPurge = 0
             );

对于性能,索引将有助于Account(clientid,HoldStatementPurge)& 与表变量相同。如果不是这种情况,只需确保您的表变量具有少量数据,那么您将需要使用临时表并在该表上提供适当的索引。


推荐阅读