Вопрос

Есть ли способ улучшить производительность 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)

..может быть более эффективным.Как уже говорили другие, убедитесь, что у вас есть индексы во всех полях поиска.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top