У меня есть ряд функций, которые MOVE записывает из одной таблицы в другую (как правило, для архивирования данных) и задается вопросом, была ли для этого «лучшая практика» или более эффективный метод, чем я сейчас использую.SQL MOVE Записи в другую таблицу
На данный момент, я бегу что-то вроде:
INSERT INTO archive_table
SELECT [ROWID], [COL1], [COL2]
FROM live_table
WHERE <criteria>
DELETE FROM live_table
WHERE [ROWID] IN
(
SELECT [ROWID] FROM archive_table
)
Это также рвало предупреждение о программном обеспечении производительности SQL, что запрос может вызвать подавление индекса и снижение производительности; из-за выполнения SCAN, а не SEEK.
Стоит добавить, что archive_table - это точная копия live_table, за исключением того, что мы удалили идентификатор и первичный ключ из столбца [ROWID] и что эта таблица не используется в среде «вживую», кроме того, что старые данные вставлены, как описано.
[править]
Казалось бы, что ответ от Alex обеспечивает очень простое решение для этого; комментарий об использовании триггера не разрешает проблему в этом случае, поскольку событие происходит через несколько дней, а критерии зависят от событий в течение этого периода.
DELETE
FROM live_table
OUTPUT DELETED.* INTO archive_table
WHERE <criteria>
Я считаю, что предупреждение вызывается из-за того, что вы на самом деле сканируете 'archive_table' каждый раз, для каждой строки из' live_table'. ** Я думаю ** (* не уверен *) вам было бы лучше сделать DELETE с JOIN с 'archive_table', например' DELETE lt FROM live_table lt INNER JOIN archive_table at on lt.ROWID = at.ROWID' –
В T- SQL DELETE + OUTPUT был бы опцией: https://msdn.microsoft.com/en-us/library/ms177564.aspx –
Возможно использование триггера - установите триггер для запуска перед удалением на живой таблице, используя его для вставки строка, подлежащая удалению в таблицу архива – NickJ