powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Быстрое удаление
6 сообщений из 6, страница 1 из 1
Быстрое удаление
    #39378035
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно максимально быстро в скрипте удалить записи по условию
Код: sql
1.
2.
3.
4.
5.
DELETE FROM
  my_table
WHERE
  my_field1 IS NULL OR
  my_field2 IS NULL


Поля my_field1 -INTEGER, my_field2 - SMALLINT. Данный запрос удалит 20%-30% записей в таблице. Всего в таблице записей - сотни тысяч. С вероятностью 99% второе условие лишнее и эти два поля либо оба NULL, либо оба не NULL

Вопросы.

1. Условие по одному полю ускорит удаление?
2. Индекс по my_field1, my_field2 как-то изменит время удаления?
3. Деактивация остальных индексов в таблице повлияет на скорость?
4. На эту таблицу ссылается несколько внешних ключей с условиями ON DELETE CASCADE и ON DELETE SET NULL. Отработка этих условий самостоятельно, удаление этих ключей и последующее восстановление ускорит общий процесс?
5. Может еще какие условия забыл?
6. Про отключение триггеров помню

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Быстрое удаление
    #39378072
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

С одной стороны 30 копеек - не 50. Но со временем проблемы с индексами могут таки появиться. Да и стоит учесть замедление при любых операциях при наличии такого индекса. Мне кажется, он не особо целесообразен.
...
Рейтинг: 0 / 0
Быстрое удаление
    #39378110
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Нужно максимально быстро в скрипте удалить записи по условию
Код: sql
1.
2.
3.
4.
5.
DELETE FROM
  my_table
WHERE
  my_field1 IS NULL OR
  my_field2 IS NULL


Поля my_field1 -INTEGER, my_field2 - SMALLINT. Данный запрос удалит 20%-30% записей в таблице. Всего в таблице записей - сотни тысяч. С вероятностью 99% второе условие лишнее и эти два поля либо оба NULL, либо оба не NULL

Вопросы.

1. Условие по одному полю ускорит удаление?
2. Индекс по my_field1, my_field2 как-то изменит время удаления?
3. Деактивация остальных индексов в таблице повлияет на скорость?
4. На эту таблицу ссылается несколько внешних ключей с условиями ON DELETE CASCADE и ON DELETE SET NULL. Отработка этих условий самостоятельно, удаление этих ключей и последующее восстановление ускорит общий процесс?
5. Может еще какие условия забыл?
6. Про отключение триггеров помню

С уважением, Vasilisk

1. Практически нет. При 20-30% записей придется перечитать/переписать все страницы таблицы.
2. Замедлит. На время перестройки индекса.
3. Повлияет, но потребует монопольного подключения к БД
4. Нет. Отличаются только крыжиком системный/пользовательский.

Сотни тысяч - не так уж и много. С выключенным Forced Write, SSD, 16к странице, 64-bit супере и наличии хотя бы 8 гигов - плевое дело.
Если на табличку висит много зависимостей, то не такое уж и плевое.
Нужно сначала удалять из зависимых таблиц delete where (условие по мастеру). Из триггеров - заустанет дергаться.
...
Рейтинг: 0 / 0
Быстрое удаление
    #39378168
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При необходимости удаления большого количества записей я стараюсь делать это порциями, в промежутках запрашивая только что удаленные записи что бы принудительно собрать мусор. Затрудняюсь объяснить зачем и чем это лучше, но когда-то давно это мне давало реальный эффект (после удаления не возникало очень длительного зависания сервера с шуршанием винтом), ну и процесс по логу можно контролировать, сколько порций удалилось.

Примерно так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
-- первая пачка записей
delete from t          where (id >= 1) and (id < 10000);
commit;
select count(*) from t where (id >= 1) and (id < 10000);
commit;

-- вторая пачка записей
delete from t          where (id >= 10000) and (id < 20000);
commit;
select count(*) from t where (id >= 10000) and (id < 20000);
commit;

-- и.т.д.
...
Рейтинг: 0 / 0
Быстрое удаление
    #39378302
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastor3. Повлияет, но потребует монопольного подключения к БДЭто есть
pastor4. Нет. Отличаются только крыжиком системный/пользовательский.pastorНужно сначала удалять из зависимых таблиц delete where (условие по мастеру)Эти два условия не противоречат друг другу?
...
Рейтинг: 0 / 0
Быстрое удаление
    #39378497
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_pastor3. Повлияет, но потребует монопольного подключения к БДЭто есть
pastor4. Нет. Отличаются только крыжиком системный/пользовательский.pastorНужно сначала удалять из зависимых таблиц delete where (условие по мастеру)Эти два условия не противоречат друг другу?

Нисколько.

При удалении по триггеру/каскаду (неважно, системному или пользовательскому) происходит попеременное дерганье НА КАЖДОЕ ВХОЖДЕНИЕ мастера (поиск/чтение) слейва, индекса слейва. В самом печальном случае читается/записывается по странице данных и странице каждого индекса. На каждую запись. Кол-во задействованных страниц (Кол-во записей мастера) * (кол-во индексов слейва). (Стотыщ записей) * (3 индекса) = Триста тыщ страничных операций. + операции в мастере. И все вперемешку, без попадания в страничный и файловый/дисковый кэш.

При удалении порцией - максимальное кол-во изменяемых страниц не может превысить число страниц (данных и индексов) в слейве.
на (стотыщ записей) / (16к / размер записи 100) * 3 индекса = 62,5 * 3 = 187,5 страничных операций.

Подсчеты оценочные, с точностью до порядка.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Быстрое удаление
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]