sql - 为什么 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
如果需要任何其他信息,请告诉我。
执行计划:
解决方案
由于您没有使用任何列,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)
& 与表变量相同。如果不是这种情况,只需确保您的表变量具有少量数据,那么您将需要使用临时表并在该表上提供适当的索引。
推荐阅读
- scala - Spark Scala - 将带有毫秒的时间戳转换为没有毫秒的时间戳
- r - R中数据表中的缺失值
- streaming - Vega Vega-lite 流媒体
- dax - 用于保存按日期分组的最大值的 Dax 计算列
- java - 没有可用的“javax.sql.DataSource”类型的合格 bean:在候选中找到多个“主要”bean:
- heroku - Heroku 应用程序错误 - 代码=H10 desc="应用程序崩溃"
- javascript - 如果元素被溢出完全隐藏,设置可见性是否多余?
- vhdl - 高密度脂蛋白; 如何在受约束的数组中约束不受约束的 std_logic_vector
- python - “ValueError:预期的 2D 数组,得到 1D 数组”的问题
- android - SingleLiveEvent 带 Buffer 和协程