powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли так ускорить удаление?
12 сообщений из 12, страница 1 из 1
Можно ли так ускорить удаление?
    #39943742
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пришла тут такая идиотская мысль, если возможно - расскажите, в чем я не прав.
MSSQLSERVER 2019.
Есть некая БД, в форме "вывернутой" снежинки. Т. е., в центральной таблице - несколько десятков тысяч записей, в лучах - возможно, до пары, ну до пары десятков миллионов.
Причем на одну запись в центральной таблице приходятся минимум тысячи записей в дочерних и "внучатых" таблицах.
В дочерних и внучатых таблицах ключ центральной - присутствует (помимо ключа непосредственного мастера). И декларативная ссылочная целостность - тоже взведена (но без каскадных операций).
Связи между таблицами проиндексированы.

Использование БД происходит по завально-авральному методу. Полмесяца - интенсивные вставки/удаления, полмесяца - разгребание всего, что понапихали и подготовка к следующему циклу.
Одним из моментов использования является в процессе интенсивной работы - удаление предыдущей версии того, что клиент ввел.
Т.е. клиент вводит пакет примерно одинаковых данных сотни раз, до тех пор, пока бизнес-проверки, отложенные, срабатывающие после помещения данных в систему, не станут удовлетворять клиента. И, тогда этот пакет остается актуальным.

Сейчас перед вводом обновленных данных, пакет информации, ранее введенный клиентом - удаляется.
Но удаление явно является узким местом системы. Дает паразитную нагрузку на диск, конфликты блокировок, да и, собственно, блокировки при параллельной работе десятков клиентов, дедлоки, с которыми программисты героически борятся (но дедлоки ведут в счете) и т.д.

Собственно, пришла мысль - а не помечать ли просто родительскую запись в центральной таблице как удаленную, а видимостью (для бизнес-проверок) управлять через row level security?
А физически удалять данные - как нибудь потом, офшорно.
Эдакий - эрзац-постгресс, :-)
Сама база небольшая. Порядка 1 Гб за период. Ну, будет в период завала распухать на 100 Гб, да и шут с ней.
Как сильно снижение производительности при этом превысит плюсы решения?
Есть ли еще какие то подводные камни?
Может что-то еще посоветуете?
...
Рейтинг: 0 / 0
Можно ли так ускорить удаление?
    #39943744
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster Может что-то еще посоветуете? Заменить удаление delete на truncate partition
...
Рейтинг: 0 / 0
Можно ли так ускорить удаление?
    #39943745
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для быстрого удаления придумали секционирование.
...
Рейтинг: 0 / 0
Можно ли так ускорить удаление?
    #39943748
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

- проанализируйте индексы на неиспользуемость, ненужные - удалите
- удаляйте данные, скажем, вечером (если ваше ПО это позволяет сделать без доработки)
- разместите высоконагруженные таблицы на быстрых носителях, скажем, на SSD-карточке
...
Рейтинг: 0 / 0
Можно ли так ускорить удаление?
    #39943784
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич
Для быстрого удаления придумали секционирование.

Но забыли придумать секцию "вот это надо удалить".

uaggster

Собственно, пришла мысль - а не помечать ли просто родительскую запись в центральной таблице как удаленную, а видимостью (для бизнес-проверок) управлять через row level security?
А физически удалять данные - как нибудь потом, офшорно.

Поздравляю. Вы открыли америку. Привет трампу.
Этому методу "не удалять, а помечать как удаленные и удалять потом" сто лет в обед.
Никаких проблем, кроме того, что ваша система должна правильно обрабатывать флаг "deleted".
...
Рейтинг: 0 / 0
Можно ли так ускорить удаление?
    #39943791
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222 Но забыли придумать секцию "вот это надо удалить".
Каждая таблица разбивается на две секции, актуальных и старых данных.

Только боюсь, что перенос данных в эту секцию для удаления может быть таким же болезненным как и само удаление.
Надо будет тестировать.

То бишь в своей системе в каждой таблице вы заводите поле is_deleted и по нему фильтруете прячете и т.п. ()
Перед удалением данных клиента проводите массовый update для каждой из таблиц клиента
Код: sql
1.
2.
3.
update main set is_deleted=1 where client_id=1234
update kids set is_deleted=1 where client_id=1234
update grandkids set is_deleted=1 where client_id=1234



При этом данные клиента едут в другую секцию (это и есть тонкий момент) будет ли это более эффективно

Затем можно будет грохнуть разом все 'якобы' удаленные зависимые записи всех клиентов во 'внучатых' таблицах.
TRUNCATE TABLE grandkids with partition=1

Дочерние и основные таблицы придется чистить обычным образом
либо удаляем/пересоздаем ограничение целостности.

Стоит ли овчинка выделки - вопрос открытый.
...
Рейтинг: 0 / 0
Можно ли так ускорить удаление?
    #39943793
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Критик
uaggster,

- проанализируйте индексы на неиспользуемость, ненужные - удалите
- удаляйте данные, скажем, вечером (если ваше ПО это позволяет сделать без доработки)
- разместите высоконагруженные таблицы на быстрых носителях, скажем, на SSD-карточке

1 и 3 - уже давно сделано. О втором как раз и речь.
Проблема в том, что система а) унаследованная и б) она работает именно с загруженными в систему данными, и подразумевает, что нужные данные присутствует за период в единственном экземпляре. Т.е. расставить по таблицам флажок is_deleted - не получится, т.к. имеющаяся логика приложения о нем ничего не знает. При этом она еще и частично скрыта в сервере приложений.
Но, к счастью, логика работает от имени непревилегированного пользователя, не dbo, а имеющего только db_datareader и db_datawriter.
И, опять же, к счастью, удаление пакета - это одна хранимка, которая последовательно удаляет данные из тучи подчиненных таблиц. Другие "точечные" удаления в подчиненных таблицах - роли не играют.
Поэтому и появилась мысль - заменить процедуру удаления - простановкой флага в ОДНОЙ, центральной таблице, а всё остальное скрыть через row level security.
Изначально, года 4 назад, когда проблема начала донимать - хотели вообще заменить таблицы на вью с подобной же логикой, но не срослось, т.к. в сервере приложений какой то кусок считает, что имеет дело именно с таблицами (не знаю, как так можно написать было).
Но тогда всё решили как раз вылизыванием индексов, и покупкой пары SSD, ценой с Боинг.
И теперь мысль - пересадить всё на 2019, и решить как описано.
В чем может быть засада?
...
Рейтинг: 0 / 0
Можно ли так ускорить удаление?
    #39943794
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SERG1257

Стоит ли овчинка выделки - вопрос открытый.

Что-то терзают меня смутные сомнения, что от этого будет какая то польза, кроме вреда.
Как минимум, потому что update ключа партиционирования - эквивалентно 2 операциям: удалению в одной секции и вставке в другой.
И, соответственно, куча индексов (которые действительно нужны), и которые придется выровнять - они тоже поедут в другую секцию, и т.д.
Т.е. вместо 1 операции физического удаления - 1 вставка, 1 удаление, и + truncate секции (интересно, как это будет работать от сотни коннектов параллельно).
...
Рейтинг: 0 / 0
Можно ли так ускорить удаление?
    #39943795
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
Что-то терзают меня смутные сомнения, что от этого будет какая то польза, кроме вреда.
Как минимум, потому что update ключа партиционирования - эквивалентно 2 операциям: удалению в одной секции и вставке в другой.
Мне тоже кажется, что это не будет быстрее.
Секционирование полезно, если признак секционирования можно сразу выбрать такой, что бы потом эти секции удалять (например, удаление по периодам).

А в вашем варианте лучше всего сделать признак удаления у мастер-таблицы (если такое возможно). Именно не во всех таблицах, а только в родительской. А потом в фоне удалять.
...
Рейтинг: 0 / 0
Можно ли так ускорить удаление?
    #39943823
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а нас заставляют с оракла сползать на мсскл
при том, что за последние 18 лет таких проблем ни разу не всплывало
и дедлоки только по делу, в среднем один ДЛ раз в месяц на 20 БД
...
Рейтинг: 0 / 0
Можно ли так ускорить удаление?
    #39943857
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
uaggster
Что-то терзают меня смутные сомнения, что от этого будет какая то польза, кроме вреда.
Как минимум, потому что update ключа партиционирования - эквивалентно 2 операциям: удалению в одной секции и вставке в другой.
Мне тоже кажется, что это не будет быстрее.
Секционирование полезно, если признак секционирования можно сразу выбрать такой, что бы потом эти секции удалять (например, удаление по периодам).

А в вашем варианте лучше всего сделать признак удаления у мастер-таблицы (если такое возможно). Именно не во всех таблицах, а только в родительской. А потом в фоне удалять.


можно кусками, я делал типа такого через брокер
...
Рейтинг: 0 / 0
Можно ли так ускорить удаление?
    #39944185
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

Если вы хотите все обновления делать с помощью insert , изучите https://ru.wikipedia.org/wiki/Якорная_модель
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли так ускорить удаление?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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