У меня есть база данных SQL Server 2005, и я попытался поставить индексы на соответствующие поля, чтобы ускорить DELETE
записей из таблицы с миллионами строк (big_table
имеет только 3 столбца), но теперь DELETE
время выполнения даже < em>длиннее! (например, 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
.
«Индексы работают так же хорошо при поиске записи в командах 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.
Сервер базы данных представляет собой старую двухъядерную машину Xeon с оперативной памятью 7,5 ГБ. Это моя игрушечная тестовая база данных :), поэтому она больше ничего не запускает.
Нужно ли мне делать что-то особенное с моими индексами после того, как я их CREATE
заработал, чтобы они работали правильно?