|
Можно ли так ускорить удаление?
|
|||
---|---|---|---|
#18+
Пришла тут такая идиотская мысль, если возможно - расскажите, в чем я не прав. MSSQLSERVER 2019. Есть некая БД, в форме "вывернутой" снежинки. Т. е., в центральной таблице - несколько десятков тысяч записей, в лучах - возможно, до пары, ну до пары десятков миллионов. Причем на одну запись в центральной таблице приходятся минимум тысячи записей в дочерних и "внучатых" таблицах. В дочерних и внучатых таблицах ключ центральной - присутствует (помимо ключа непосредственного мастера). И декларативная ссылочная целостность - тоже взведена (но без каскадных операций). Связи между таблицами проиндексированы. Использование БД происходит по завально-авральному методу. Полмесяца - интенсивные вставки/удаления, полмесяца - разгребание всего, что понапихали и подготовка к следующему циклу. Одним из моментов использования является в процессе интенсивной работы - удаление предыдущей версии того, что клиент ввел. Т.е. клиент вводит пакет примерно одинаковых данных сотни раз, до тех пор, пока бизнес-проверки, отложенные, срабатывающие после помещения данных в систему, не станут удовлетворять клиента. И, тогда этот пакет остается актуальным. Сейчас перед вводом обновленных данных, пакет информации, ранее введенный клиентом - удаляется. Но удаление явно является узким местом системы. Дает паразитную нагрузку на диск, конфликты блокировок, да и, собственно, блокировки при параллельной работе десятков клиентов, дедлоки, с которыми программисты героически борятся (но дедлоки ведут в счете) и т.д. Собственно, пришла мысль - а не помечать ли просто родительскую запись в центральной таблице как удаленную, а видимостью (для бизнес-проверок) управлять через row level security? А физически удалять данные - как нибудь потом, офшорно. Эдакий - эрзац-постгресс, :-) Сама база небольшая. Порядка 1 Гб за период. Ну, будет в период завала распухать на 100 Гб, да и шут с ней. Как сильно снижение производительности при этом превысит плюсы решения? Есть ли еще какие то подводные камни? Может что-то еще посоветуете? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2020, 22:36 |
|
Можно ли так ускорить удаление?
|
|||
---|---|---|---|
#18+
uaggster Может что-то еще посоветуете? Заменить удаление delete на truncate partition ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2020, 22:50 |
|
Можно ли так ускорить удаление?
|
|||
---|---|---|---|
#18+
Для быстрого удаления придумали секционирование. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2020, 22:52 |
|
Можно ли так ускорить удаление?
|
|||
---|---|---|---|
#18+
uaggster, - проанализируйте индексы на неиспользуемость, ненужные - удалите - удаляйте данные, скажем, вечером (если ваше ПО это позволяет сделать без доработки) - разместите высоконагруженные таблицы на быстрых носителях, скажем, на SSD-карточке ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2020, 23:04 |
|
Можно ли так ускорить удаление?
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевич Для быстрого удаления придумали секционирование. Но забыли придумать секцию "вот это надо удалить". uaggster Собственно, пришла мысль - а не помечать ли просто родительскую запись в центральной таблице как удаленную, а видимостью (для бизнес-проверок) управлять через row level security? А физически удалять данные - как нибудь потом, офшорно. Поздравляю. Вы открыли америку. Привет трампу. Этому методу "не удалять, а помечать как удаленные и удалять потом" сто лет в обед. Никаких проблем, кроме того, что ваша система должна правильно обрабатывать флаг "deleted". ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2020, 06:23 |
|
Можно ли так ускорить удаление?
|
|||
---|---|---|---|
#18+
aleks222 Но забыли придумать секцию "вот это надо удалить". Каждая таблица разбивается на две секции, актуальных и старых данных. Только боюсь, что перенос данных в эту секцию для удаления может быть таким же болезненным как и само удаление. Надо будет тестировать. То бишь в своей системе в каждой таблице вы заводите поле is_deleted и по нему фильтруете прячете и т.п. () Перед удалением данных клиента проводите массовый update для каждой из таблиц клиента Код: sql 1. 2. 3.
При этом данные клиента едут в другую секцию (это и есть тонкий момент) будет ли это более эффективно Затем можно будет грохнуть разом все 'якобы' удаленные зависимые записи всех клиентов во 'внучатых' таблицах. TRUNCATE TABLE grandkids with partition=1 Дочерние и основные таблицы придется чистить обычным образом либо удаляем/пересоздаем ограничение целостности. Стоит ли овчинка выделки - вопрос открытый. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2020, 08:01 |
|
Можно ли так ускорить удаление?
|
|||
---|---|---|---|
#18+
Критик uaggster, - проанализируйте индексы на неиспользуемость, ненужные - удалите - удаляйте данные, скажем, вечером (если ваше ПО это позволяет сделать без доработки) - разместите высоконагруженные таблицы на быстрых носителях, скажем, на SSD-карточке 1 и 3 - уже давно сделано. О втором как раз и речь. Проблема в том, что система а) унаследованная и б) она работает именно с загруженными в систему данными, и подразумевает, что нужные данные присутствует за период в единственном экземпляре. Т.е. расставить по таблицам флажок is_deleted - не получится, т.к. имеющаяся логика приложения о нем ничего не знает. При этом она еще и частично скрыта в сервере приложений. Но, к счастью, логика работает от имени непревилегированного пользователя, не dbo, а имеющего только db_datareader и db_datawriter. И, опять же, к счастью, удаление пакета - это одна хранимка, которая последовательно удаляет данные из тучи подчиненных таблиц. Другие "точечные" удаления в подчиненных таблицах - роли не играют. Поэтому и появилась мысль - заменить процедуру удаления - простановкой флага в ОДНОЙ, центральной таблице, а всё остальное скрыть через row level security. Изначально, года 4 назад, когда проблема начала донимать - хотели вообще заменить таблицы на вью с подобной же логикой, но не срослось, т.к. в сервере приложений какой то кусок считает, что имеет дело именно с таблицами (не знаю, как так можно написать было). Но тогда всё решили как раз вылизыванием индексов, и покупкой пары SSD, ценой с Боинг. И теперь мысль - пересадить всё на 2019, и решить как описано. В чем может быть засада? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2020, 09:03 |
|
Можно ли так ускорить удаление?
|
|||
---|---|---|---|
#18+
SERG1257 Стоит ли овчинка выделки - вопрос открытый. Что-то терзают меня смутные сомнения, что от этого будет какая то польза, кроме вреда. Как минимум, потому что update ключа партиционирования - эквивалентно 2 операциям: удалению в одной секции и вставке в другой. И, соответственно, куча индексов (которые действительно нужны), и которые придется выровнять - они тоже поедут в другую секцию, и т.д. Т.е. вместо 1 операции физического удаления - 1 вставка, 1 удаление, и + truncate секции (интересно, как это будет работать от сотни коннектов параллельно). ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2020, 09:18 |
|
Можно ли так ускорить удаление?
|
|||
---|---|---|---|
#18+
uaggster Что-то терзают меня смутные сомнения, что от этого будет какая то польза, кроме вреда. Как минимум, потому что update ключа партиционирования - эквивалентно 2 операциям: удалению в одной секции и вставке в другой. Секционирование полезно, если признак секционирования можно сразу выбрать такой, что бы потом эти секции удалять (например, удаление по периодам). А в вашем варианте лучше всего сделать признак удаления у мастер-таблицы (если такое возможно). Именно не во всех таблицах, а только в родительской. А потом в фоне удалять. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2020, 09:25 |
|
Можно ли так ускорить удаление?
|
|||
---|---|---|---|
#18+
а нас заставляют с оракла сползать на мсскл при том, что за последние 18 лет таких проблем ни разу не всплывало и дедлоки только по делу, в среднем один ДЛ раз в месяц на 20 БД ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2020, 12:44 |
|
Можно ли так ускорить удаление?
|
|||
---|---|---|---|
#18+
alexeyvg uaggster Что-то терзают меня смутные сомнения, что от этого будет какая то польза, кроме вреда. Как минимум, потому что update ключа партиционирования - эквивалентно 2 операциям: удалению в одной секции и вставке в другой. Секционирование полезно, если признак секционирования можно сразу выбрать такой, что бы потом эти секции удалять (например, удаление по периодам). А в вашем варианте лучше всего сделать признак удаления у мастер-таблицы (если такое возможно). Именно не во всех таблицах, а только в родительской. А потом в фоне удалять. можно кусками, я делал типа такого через брокер ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2020, 14:42 |
|
Можно ли так ускорить удаление?
|
|||
---|---|---|---|
#18+
uaggster, Если вы хотите все обновления делать с помощью insert , изучите https://ru.wikipedia.org/wiki/Якорная_модель ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2020, 08:11 |
|
|
start [/forum/topic.php?fid=46&fpage=63&tid=1686261]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 144ms |
0 / 0 |