УДАЛИТЬ производительность в SQL Server по кластерному индексу, большой таблице - PullRequest
8 голосов
/ 20 июня 2011

У меня есть таблица с более чем 20 миллионами строк, и когда я делаю:

DELETE [Table] WHERE ID = ?

Это займет более 40 секунд. Столбец ID кластеризован.

Это то, что вы могли ожидать? или это можно оптимизировать?

Ответы [ 3 ]

18 голосов
/ 20 июня 2011

В дополнение к тонким точкам JNK, включенным в их ответ, один конкретный убийца, которого я видел, это когда вы удаляете строки из ссылочной таблицы для одного или нескольких ограничений внешнего ключа и столбцы ссылок вссылочные таблицы не индексируются - вы заставляете сканирование таблицы для каждой из этих таблиц происходить до того, как удаление может быть принято.

8 голосов
/ 20 июня 2011

Это будет зависеть от множества факторов, о которых вы нам не расскажете ...

Сколько строк удалено? Чем больше строк, тем больше времени.

Есть ли другие индексы? Каждый индекс должен обновляться, а не только кластеризованный. Если вы удаляете через 10 индексов, это займет примерно в 10 раз больше (очень приблизительно).

Есть ли другие действия? Если происходят обновления или вставки, очень вероятно, что произойдет ожидание и конфликт.

Также, вообще говоря, количество секунд, которое занимает операция, составляет ВЫСОКО * в зависимости от настроек вашего оборудования. Если вы выполняете это на настольном компьютере, а не на сервере с высокопроизводительным массивом и 12 ядрами, ожидания будут совсем другими.

0 голосов
/ 20 июня 2011

Также попробуйте удалить данные в пакете. Пример

set rowcount 10000
delete [table] where id = ? 
while @@rowcount >0
begin
delete [table] where id = ? 
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...