Спасибо за чтение, я немного смущен этим, думаю, что это связано с размером 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
Очевидно, что источником является подмножество основной таблицы (обычно небольшой процент таблицы, скажем, 80-100 Гб [таблица имеет размер ТБ]). TempDB выделено 800Gb и находится на собственном диске без автоматического увеличения. Я получаю следующую ошибку:
Не удалось выделить место для объекта "dbo.SORT временное хранилище запуска: 140962158870528" в базе данных "tempdb", так как файловая группа "PRIMARY" заполнена. Освободите место на диске, удалив ненужные файлы, отбросив объекты в файловой группе, добавив дополнительные файлы в файловую группу или включив автоматический рост для существующих файлов в файловой группе.
Означает ли это, что он пытается поместить всю целевую таблицу в TempDb? Если это так, мне, очевидно, придется прекратить использовать слияние и написать отдельные операторы Insert/update/delete. Я искал ответ на этот вопрос во всех технических аспектах MERGE, но ничего не могу найти по этому поводу, поэтому любая помощь очень ценится.
Спасибо
tempdb
. Если вы работаете с огромным набором данных, то частое выполнение операций в пакетном режиме является лучшим решением. - person Larnu   schedule 13.01.2021