【发布时间】:2020-01-02 10:40:36
【问题描述】:
我正在用数据填充一个临时表,下面是我的临时表的定义。
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
如果需要任何其他信息,请告诉我。
执行计划:
【问题讨论】:
-
你试过删除 NOLOCK 吗?
-
@PurgeFilesList中有多少行?表变量在性能方面总是有点危险,因为查询优化器总是假设只有一行(如果表变量中有更多行,这会对执行计划产生严重的负面影响) -
@HoneyBadger 更新了我的问题。请查看执行计划。
-
@FranCerezo 是的,没有运气。
-
@marc_s 表变量的记录数少于 2000。
标签: sql sql-server join query-performance