Каков самый быстрый способ определить несогласованные записи между двумя таблицами?

61
7

Я пытаюсь обнаружить некоторые сломанные записи в базе данных MS-SQL.

В упрощенном примере scenerio таков:

У меня есть 2 таблицы, просто поставьте:

    Таблица_1: Id, Date, OpId

    Таблица_2: Дата, OpId, EventName

И у меня есть это бизнес-правило: если в таблице_1 есть запись, ТОГДА должно быть как минимум 1 строка в таблице_2 для Table_1.Date и Table.OpId.

Если в таблице_1 есть строка, и если строка не соответствует этой строке в таблице_2, то есть -whatever reason-.

Чтобы узнать неправильные данные, я использую:

SELECT *
FROM table_1 t1
LEFT JOIN table_2 t2 ON t1.Date = t2.Date AND t1.OpId = t2.OpId
WHERE t2.OpId IS NULL -- So, if there is no
-- matching row in table_2 then this is a mistake

Но для завершения запроса требуется слишком много времени.

Может ли быть более быстрый или лучший способ приблизиться к аналогичным сценариям?

спросил(а) 2012-01-02T16:18:00+04:00 9 лет, 2 месяца назад
1
Решение
112

Чтобы выполнить анти-полусоединение NOT EXISTS в SQL Server, обычно лучше или равно по производительности других опций (NOT IN, OUTER JOIN... NULL, EXCEPT)

SELECT *
FROM table_1 t1
WHERE NOT EXISTS (SELECT *
FROM table_2 t2
WHERE t1.Date = t2.Date
AND t1.OpId = t2.OpId)

См. Левое внешнее соединение против НЕ СУЩЕСТВУЕТ. Однако, возможно, вам не хватает полезного индекса.

ответил(а) 2012-01-02T16:21:00+04:00 9 лет, 2 месяца назад
61

Если вы используете правильную индексацию, это не имеет никакого отношения к ней (возможно, использование NOT EXISTS вместо LEFT JOIN будет немного быстрее),

НО

если Table_1 имеет относительно небольшой объем данных, и нет никаких FKeys или другого такого материала, и это одноразовая процедура, тогда вы можете использовать трюк, подобный этому, для сброса неправильных строк:


SELECT table_1.*
INTO tempTable
FROM table_1 t1
WHERE EXISTS(SELECT * FROM table_1 t1 WHERE t1.Date = t2.Date AND t1.OpId = t2.OpId)

drop table Table_1

exec sp_rename 'tempTable', 'Table_1'

Это может быть быстрее

ответил(а) 2012-01-02T16:23:00+04:00 9 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема