Внутреннее соединение на вставке для обеспечения целостности - PullRequest
0 голосов
/ 22 июля 2011

Я копирую данные из таблицы в другую.Мне интересно, что было бы лучше для поддержания целостности и производительности данных.

Шаги :

  1. копировать данные старше x дней из журнала в архив
  2. удалить данные из журнала, если они существуют в архиве

С

INSERT INTO archive
    SELECT * FROM logs
    WHERE datediff(day, logs.timestamp, GetDate()) > @day

DELETE logsf FROM logs As logsf
    INNER JOIN archive as archivef ON logsf.uuid = archivef.uuid
    WHERE datediff(day, logsf.timestamp, GetDate()) > @jour        

К

INSERT INTO archive
    SELECT * FROM logs
    WHERE datediff(day, logs.timestamp, GetDate()) > @day
    AND NOT EXISTS (
        SELECT * FROM archive
        WHERE datediff(day, logs.timestamp, GetDate()) > @day
    )


DELETE logsf FROM logs As logsf
    INNER JOIN archive as archivef ON logsf.uuid = archivef.uuid
    WHERE datediff(day, logsf.timestamp, GetDate()) > @jour       
  1. Это хорошая вещь, чтобы убедиться, что вы не пытаетесь вставить уже существующие данные в таблицу?
  2. Если мои 2 исходных запроса находятся в транзакции, является ли мой второй вариант бессмысленным (и добавляет бесполезное время обработки)?

Какой из них вы бы использовали:

Вставить, если не существует + Удалить, если существует (независимость)
или
Вставить и удалить, если нет ошибки (транзакция)
или
объединяют оба

и почему?

Ответы [ 2 ]

2 голосов
/ 22 июля 2011

В SQL Server вы можете использовать предложение вывода , чтобы поместить удаленные элементы непосредственно в архивную таблицу:

DELETE logs
    OUTPUT deleted.* INTO archive
    WHERE datediff(day, timestamp, GetDate()) > @jour  
1 голос
/ 22 июля 2011

Я бы выбрал вариант 2, потому что это был бы более быстрый процесс, поскольку SQL менее сложен.

Я предпочитаю идею обернуть его в транзакцию, чтобы в случаелюбые ошибки.

...