Производительность для запроса на удаление в SQL - PullRequest
0 голосов
/ 08 февраля 2010

У меня есть таблица с 200 000 записей. Я хочу удалить некоторые данные, как показано ниже:

DELETE FROM Table Where IdColumn IN ( SelectedID )

Заполните SelectedID желаемыми идентификационными данными, которые содержат 5000 записей. Есть 2 подхода:

1 - Я добавляю 20 000 идентификаторов в качестве SelectedID, который содержит идентификаторы нужных 5000 записей.

2- Я вставляю только те 5000 записей.

Вопрос в том, в чем разница между двумя подходами? (Производительность)

Ответы [ 2 ]

1 голос
/ 08 февраля 2010

Производительность большого предложения IN ужасна, это в основном из-за времени компиляции запроса. Так что, если вы скажете List<int>, содержащий идентификаторы, то это:

List<int> myIDs = GetIDs(); //20,000
var inList = myIDs.Distinct(); //5,000 distinct IDs
//pass inList to SQL

будет намного быстрее, чем:

List<int> inList = GetIDS(); //20,000
//pass inList to SQL

Если присоединение является альтернативой, если вы можете получить список идентификаторов, которые хотите удалить, выполнив запрос, лучше выполнить подзапрос с этим, что-то вроде этого, используя запрос в Where:

DELETE FROM Table 
Where IdColumn IN (Select ID
                   From OtherTable
                   Where Name Like '%DeleteMe%')

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

0 голосов
/ 08 февраля 2010

Я не совсем уверен, если я вас полностью понимаю, но я бы пошел на # 2, поскольку кажется, что это пустая трата ресурсов для генерации 20 000 строк, из которых вам нужно только 5 000 вместо того, чтобы вставлять только необходимые 5 000.

Кроме того, 200.000 строк - это небольшая таблица. Действительно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...