У меня есть база данных SQL Server 2005, и я попытался поместить индексы в соответствующие поля, чтобы ускорить запись DELETE
записей из таблицы с миллионами строк (big_table
имеет только 3 столбца) , но теперь время исполнения DELETE
равно дольше! (Например, 1 час против 13 минут)SQL Server DELETE медленнее с индексами
У меня есть отношение между таблицами, а столбец, который я фильтрую, DELETE
находится в другой таблице. Например
DELETE FROM big_table
WHERE big_table.id_product IN (
SELECT small_table.id_product FROM small_table
WHERE small_table.id_category = 1)
Btw, я также пытался:
DELETE FROM big_table
WHERE EXISTS
(SELECT 1 FROM small_table
WHERE small_table.id_product = big_table.id_product
AND small_table.id_category = 1)
и в то время как он, кажется, немного быстрее, чем первая бежать, он по-прежнему намного медленнее, с индексами, чем без него.
Я создал индексы на этих полях:
big_table.id_product
small_table.id_product
small_table.id_category
Мой файл .ldf растет много во время DELETE
.
Почему мои запросы DELETE
медленнее, когда у меня есть индексы на моих таблицах? Я думал, что они должны бежать быстрее.
UPDATE
Хорошо, консенсус, как представляется, индексы замедлит огромный DELETE
becuase индекс должен быть обновлен. Хотя, я до сих пор не понимаю, почему он не может DELETE
все строки сразу, и просто обновлять индекс один раз в конце.
У меня было впечатление от некоторых из моих чтений, что индексы ускоряют DELETE
, делая поиск полей в предложении WHERE
быстрее.
«Индексы работают точно так же при поиске записи в DELETE и UPDATE команд, как они делают для ЗЕЬЕСТА.»
Но позже в статье говорится, что слишком много индексов могут повредить производительность.
Ответы на качается вопросы:
- 55 миллионов строк в таблице
- 42 миллионов строк удаляется
- Похожие
SELECT
заявление не будет работать (исключение типа «System.OutOfMemoryException»был выброшен)
Я попытался следующие 2 запросы:
SELECT * FROM big_table
WHERE big_table.id_product IN (
SELECT small_table.id_product FROM small_table
WHERE small_table.id_category = 1)
SELECT * FROM big_table
INNER JOIN small_table
ON small_table.id_product = big_table.id_product
WHERE small_table.id_category = 1
Оба удалось после запуска на 25 мин с этим сообщением об ошибке из SQL Server 2005:
An error occurred while executing batch. Error message is: Exception of type 'System.OutOfMemoryException' was thrown.
Сервер базы данных - это старая двухъядерная машина Xeon с 7,5 ГБ оперативной памяти. Это моя тестовая база данных :), так что ничего не работает.
Нужно ли мне делать что-то особенное с моими индексами после того, как я CREATE
их, чтобы они работали правильно?
Сколько строк в таблице? Сколько строк удаляется? Как долго будет выполняться аналогичная инструкция SELECT? Знание того, как быстро выполняется инструкция SELECT, может дать некоторое представление о том, как индексы влияют на DELETE. – bobs
55 mil rows, 42 deleted, не завершено, см. Выше для получения более подробной информации. – JohnB
Это занимает больше времени, потому что, когда вы выполняете удаление, индексы, которые ссылаются на вашу таблицу, также должны быть обновлены. – WOPR