固定大小的 TempDB (800Gb),合并到非常大的 table 由于 space 而失败,这是合并的限制吗?

Fixed Size TempDB (800Gb), MERGE into very large table failing due to space, is this a limitation of merge?

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

我有一个 MERGE 语句:

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

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

无法为数据库 'tempdb' 中的对象 'dbo.SORT temporary run storage: 140962158870528' 分配 space,因为 'PRIMARY' 文件组已满。通过删除不需要的文件、删除文件组中的对象、向文件组添加其他文件或为文件组中的现有文件设置自动增长来创建磁盘 space。

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

谢谢

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

感谢评论。