SQL - улучшить производительность запросов NOT EXISTS
-
23-08-2019 - |
Вопрос
Есть ли способ улучшить производительность SQL-запросов такого типа:
INSERT
INTO ...
WHERE NOT EXISTS(Validation...)
Проблема в том, что когда в моей таблице много данных (например, миллион строк), выполнение WHERE NOT EXISTS
пункт, если очень медленно.Мне необходимо выполнить эту проверку, поскольку я не могу вставить дублированные данные.
Я использую SQLServer 2005
спасибо
Решение
Убедитесь, что вы ищете по индексированным столбцам без каких-либо манипуляций с данными в этих столбцах (например, подстроками и т. д.).
Другие советы
С моей точки зрения, вы могли бы попробовать что-то вроде:
TRUNCATE temptable
INSERT INTO temptable ...
INSERT INTO temptable ...
...
INSERT INTO realtable
SELECT temptable.* FROM temptable
LEFT JOIN realtable on realtable.key = temptable.key
WHERE realtable.key is null
Попробуйте заменить NOT EXISTS левым внешним соединением, иногда оно работает лучше в больших наборах данных.
Обратите внимание на другой ответ относительно индексации.NOT EXISTS обычно выполняется довольно быстро, если у вас хорошие индексы.
Но я иметь были проблемы с производительностью с такими утверждениями, как вы описываете.Один из методов, который я использовал, чтобы обойти это, — использовать временную таблицу для значений-кандидатов, выполнить DELETE FROM...ГДЕ СУЩЕСТВУЕТ (...), а затем слепо ВСТАВЬТЕ остаток.Разумеется, внутри транзакции, чтобы избежать условий гонки.Разделение запросов иногда позволяет оптимизатору выполнить свою работу, не запутавшись.
Если вы вообще сможете уменьшить проблемное пространство, вы получите массу производительности.Вы абсолютно уверены, что необходимо проверить каждую из этих строк в этой таблице?
Еще одна вещь, которую вы, возможно, захотите попробовать, — это DELETE InsertTable FROM InsertTable INNER JOIN ExistingTable ON <Validation criteria>
перед вашей вставкой.Однако ваш пробег может отличаться
insert into customers
select *
from newcustomers
where customerid not in (select customerid
from customers)
..может быть более эффективным.Как уже говорили другие, убедитесь, что у вас есть индексы во всех полях поиска.