У меня есть база данных SQL Server 2005, и я попытался поместить индексы в соответствующие поля, чтобы ускорить DELETE
записей из таблицы с миллионами строк (big_table
имеет только 3 столбца), но теперьDELETE
время выполнения даже больше !(Например, 1 час против 13 минут)
У меня есть связь между таблицами, и столбец, по которому я фильтрую 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)
Кстати, я также пробовал:
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
запросы медленнее, когда у меня есть индексы в моих таблицах? Я думал, что они должны былиработать быстрее.
ОБНОВЛЕНИЕ
Хорошо, консенсус кажется, что индексы сильно замедлятся DELETE
, потому что индекс должен быть обновлен.Хотя я до сих пор не понимаю, почему он не может DELETE
все строки сразу, а просто обновляет индекс один раз в конце.
Из некоторых моих чтений у меня сложилось впечатление, чтоиндексы ускорились бы DELETE
, сделав поиск полей в предложении WHERE
быстрее.
Odetocode.com говорит:
"Индексы работают так же хорошо, когдапоиск записи в командах DELETE и UPDATE так же, как и для операторов SELECT. "
Но далее в статье говорится, что слишком большое количество индексов может снизить производительность.
Ответы на bobs Вопросы:
- 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.
ДатаСервер abase - это старая двухъядерная машина Xeon с оперативной памятью 7,5 ГБ.Это моя тестовая база данных :), так что больше ничего не запускается.
Нужно ли делать что-то особенное с моими индексами после того, как я CREATE
сделаю так, чтобы они работали должным образом?