固定大小的TempDB(800Gb),由于空间原因合并成非常大的表失败,这是合并的限制吗



感谢阅读,我对此有点困惑,认为这只是TempDB的大小,但不确定为什么会发生这种情况:

我有一份合并声明:

DECLARE @LastUpdate DATETIME
SELECT @LastUpdate = ISNULL(MAX(LastUpdate),'1900-01-01') FROM dbo.StatusTable
DECLARE @CurTime DATETIME = GETDATE()
BEGIN TRANSACTION
MERGE dbo.TableName AS targ
USING
(
SELECT
<fieldlist>
FROM 
JoinTablesEtc
WHERE UpdateDateTime > @LastUpdate
) AS src
ON
src.JoinFields = targ.JoinFields
WHEN MATCHED AND ISNULL(src.RemData,0) <> 1 THEN
UPDATE
SET
fieldtoupdate = src.fieldtoupdate
WHEN NOT MATCHED BY TARGET THEN
INSERT
(
FieldList
)
VALUES
(
src.FieldList
)
WHEN MATCHED AND src.RemData = 1 THEN
DELETE
OUTPUT $action INTO @MergeOutput;
COMMIT

显然,源是主表的一个子集(通常是表的一小部分,比方说80-100Gb[表大小为TB](。TempDB被分配了800Gb,并且在它自己的驱动器上,没有自动增长。我得到以下错误:

无法为对象"dbo"分配空间。SORT临时运行存储:140962158870528,位于数据库"tempdb"中,因为"PRIMARY"文件组已满。通过删除不需要的文件、删除文件组中的对象、向文件组添加其他文件或为文件组中现有文件设置自动增长来创建磁盘空间。

现在,这是否意味着它试图将整个目标表放入TempDb?如果是这样的话,我显然需要停止使用merge并编写单独的Insert/update/delete语句。我一直在为MERGE寻找所有技术问题的答案,但找不到任何关于它的信息,所以非常感谢任何帮助。

感谢

答案在于索引,由于数据的性质,目标表上没有覆盖索引。我目前仍在试图找到解决这个问题的方法,但看起来像是代理键和适当的索引策略。

谢谢你的评论。

最新更新