Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Очередь-таблица для репликации, как оптимальней сделать?  [new]
МуМу
Member

Откуда:
Сообщений: 1126
Есть следующая проблема, существует репликатор который помощью триггеров данные пишет в таблицу очередь. Из этой очереди необходимо данные читать и из нее необходимо удалять причем весьма интенсивно(по транзакционно). Возникают проблемы фрагментацией данных, которые приводят к повышенной нагрузке.(ребилд индекс в силу отдельных проблем не вариант). Вот возникла идея писать триггерами с помощью View. А сама view будет представлением на таблицу Очередь(N) , где N будет итерационный расти. То есть это будет Очередь1,Очередь2,Очередь3 и т.п. Фактически раз в минуту или чаще будет Alter view на новую таблицу ОчередьN.
В этом случае конечно данные могут быть записаны в разные таблицы Очередь(N) из одной длинной транзакции, но это не является проблемой(только возникают сложности администрирования). По идее блокировка на схеме должна быть минимальная. Но зато решается вопрос с фрагментацией(и снижаются издержки на логирование, сохранение истории очереди). Какие при таком подходе могут быть проблемы?
18 дек 19, 11:08    [22042866]     Ответить | Цитировать Сообщить модератору
 Re: Очередь-таблица для репликации, как оптимальней сделать?  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
слушайте, а вы точно русский человек?
ведь читать же невозможно.
не только этот пост, а просто все подряд Картинка с другого сайта.
18 дек 19, 11:30    [22042889]     Ответить | Цитировать Сообщить модератору
 Re: Очередь-таблица для репликации, как оптимальней сделать?  [new]
МуМу
Member

Откуда:
Сообщений: 1126
Ну извините, иногда тороплюсь, сильно не заморачиваюсь.
У нас все таки технический а не филологический форум. Рыбак рыбака - поймет:)
18 дек 19, 11:37    [22042896]     Ответить | Цитировать Сообщить модератору
 Re: Очередь-таблица для репликации, как оптимальней сделать?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7658
МуМу,

как Вы узнали, что проблема состоит в фрагментации таблицы?
18 дек 19, 12:28    [22042964]     Ответить | Цитировать Сообщить модератору
 Re: Очередь-таблица для репликации, как оптимальней сделать?  [new]
МуМу
Member

Откуда:
Сообщений: 1126
Делаешь ребилд индексов, все становится нормально - количество логических чтений резко усеньшается.Планы одинаковые(там две таблицы джойнятся). Записей не так много а логических чтений со временем становится все больше. Ребилд индексов приводит к блокировкам т.к. интенсивность вставки удалений очень большая.
18 дек 19, 13:13    [22043039]     Ответить | Цитировать Сообщить модератору
 Re: Очередь-таблица для репликации, как оптимальней сделать?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36901
Для очередей неплохо (как я слышал) подходит Service Broker, ну и всякие специализированные решения (Kafka и т.п.).
На скуле очередь городится довольно неудобно из-за того, что весьма проблематично одновременно организовывать партиционирование и по дате (или другому монотонно возрастающему полю) для очистки и обработки, и по равномерному ключу (для масштабирования).

В любом случае, обработка с удалением -- будет медленно (куча записей в лог, ghost-пейджи в начале таблицы). Только транкейт, только хардкор.

МуМу
Вот возникла идея писать триггерами с помощью View.
Это как минимум промежуточная материализация (в inserted) всего, что заливается в очередь. По мне -- весьма накладно.

МуМу
По идее блокировка на схеме должна быть минимальная.
И тем не менее, может стать проблемой, если нет момента, когда никто не льет в очередь данные. Тем более, я не уверен, что можно сделать alter view с блокировкой wait_on_low_priority, как при многих других DDL-операциях. Короче, возможно придется еще как-то городить сериализатор заливальщиков, если таблицы надо нарезать чаще, чем есть возможность заблокировать представление.
18 дек 19, 13:27    [22043072]     Ответить | Цитировать Сообщить модератору
 Re: Очередь-таблица для репликации, как оптимальней сделать?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36901
МуМу
Делаешь ребилд индексов, все становится нормально - количество логических чтений резко усеньшается.Планы одинаковые(там две таблицы джойнятся). Записей не так много а логических чтений со временем становится все больше. Ребилд индексов приводит к блокировкам т.к. интенсивность вставки удалений очень большая.
Похоже на проблему с ghost-пейджами. Проверяется обычным select top 1 from очередь order by порядок обработки. Если при этом дохрена логических чтений, это оно. Иногда лечится, если удалять c paglock, иногда нет.
18 дек 19, 13:30    [22043082]     Ответить | Цитировать Сообщить модератору
 Re: Очередь-таблица для репликации, как оптимальней сделать?  [new]
МуМу
Member

Откуда:
Сообщений: 1126
Вот думаю проверить издержки на view, мне кажется относительно общих затрат ничтожные должны быть. Как проверить правильно не подскажешь? Ну типа инсерт в таблицу, и инсерт в таблицу через view ну и сравнить логические чтения?
18 дек 19, 13:47    [22043120]     Ответить | Цитировать Сообщить модератору
 Re: Очередь-таблица для репликации, как оптимальней сделать?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36901
МуМу,

Хотя бы. А еще лучше смоделировать пиковую нагрузку и посмотреть, сколько записей в секунду оно тянет, а сколько уже нет. Чтобы через год-другой не пришлось опятьт все переделывать.
18 дек 19, 13:54    [22043139]     Ответить | Цитировать Сообщить модератору
 Re: Очередь-таблица для репликации, как оптимальней сделать?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50414
МуМу
существует репликатор который помощью триггеров данные пишет в таблицу очередь.

Этой таблице никакие индексы не нужны. В особенности - кластерные. Удали их.
18 дек 19, 14:48    [22043218]     Ответить | Цитировать Сообщить модератору
 Re: Очередь-таблица для репликации, как оптимальней сделать?  [new]
МуМу
Member

Откуда:
Сообщений: 1126
Изначально планировалось без индексов но возникала одна из проблем с вычиткой, а точнее с уровнем изоляции(завтра спрошу у архитекторов). Нужно максимально оперативно вычитывать и затем удалять закомиченные данные при этом влиять на систему по минимуму(посредством блокировок).
18 дек 19, 15:02    [22043245]     Ответить | Цитировать Сообщить модератору
 Re: Очередь-таблица для репликации, как оптимальней сделать?  [new]
МуМу
Member

Откуда:
Сообщений: 1126
Есть еще мысли подумать можно ли для этого InMеmory(со схемой без потери данных) таблицу прикрутить, хотя сомневаюсь. А вообще прихожу к выводу что лучше писать в таблицу данные изменений посредством чтения из лога транзакций, например используя Changedata capture , тогда подобные проблемы вообще как класс возникать не будут.
Хотя предложенный вариант с view пока выглядит как самый простой для текущей реализации.
18 дек 19, 15:08    [22043258]     Ответить | Цитировать Сообщить модератору
 Re: Очередь-таблица для репликации, как оптимальней сделать?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36901
Dimitry Sibiryakov
МуМу
существует репликатор который помощью триггеров данные пишет в таблицу очередь.

Этой таблице никакие индексы не нужны. В особенности - кластерные. Удали их.
Ровно наоборот. В сценарии обработки очереди по чекпоинтам нужен seek на начальную точку выборки, иначе на каждой итерации будет сканироваться вся таблица. В сценарии с удалением, в начале кучи будет образовываться ghost-страницы, которые будуд при каждом delete top или select top вычитываться. Есдинственный сценарий, когда индексы не нужны, это когда таблица обрабатывается сразу челиклм, и сразу же очищается/удаляется.
18 дек 19, 15:49    [22043326]     Ответить | Цитировать Сообщить модератору
 Re: Очередь-таблица для репликации, как оптимальней сделать?  [new]
invm
Member

Откуда: Москва
Сообщений: 9273
МуМу,

Секционируйте таблицу по номеру транзакции.
Тогда после обработки, удалить транзакцию из очереди можно будет переключением секции в служебную таблицу, которую затем усечь. Либо, если позволит версия, сразу truncate with partitions. Соответственно, фантомных строк не будет.
18 дек 19, 16:30    [22043391]     Ответить | Цитировать Сообщить модератору
 Re: Очередь-таблица для репликации, как оптимальней сделать?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31328
МуМу
Из этой очереди необходимо данные читать и из нее необходимо удалять причем весьма интенсивно(по транзакционно).
...
зато решается вопрос с фрагментацией
...
Делаешь ребилд индексов, все становится нормально
А вот помнится мы говорили про InMemory :-) Как раз тот самый случай...
МуМу
Есть еще мысли подумать можно ли для этого InMеmory(со схемой без потери данных) таблицу прикрутить, хотя сомневаюсь.
Я бы это попробовал.

Сообщение было отредактировано: 18 дек 19, 18:20
18 дек 19, 18:12    [22043485]     Ответить | Цитировать Сообщить модератору
 Re: Очередь-таблица для репликации, как оптимальней сделать?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31328
МуМу
Из этой очереди необходимо данные читать и из нее необходимо удалять причем весьма интенсивно(по транзакционно).
Ещё вариант - не удалять, а апдэйтить флажок "обработано". А удалять потом, типа раз в сутки, даже можно секциями, если действительно много данных.
Тогда точно не будет фрагментации, и всяких этих ghost-пейджей.
18 дек 19, 18:24    [22043496]     Ответить | Цитировать Сообщить модератору
 Re: Очередь-таблица для репликации, как оптимальней сделать?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36901
alexeyvg,

Тогду нужен еще фильтрованый индекс по этому флагу. Плюс апдейт тоже не бесплатный.
18 дек 19, 18:32    [22043502]     Ответить | Цитировать Сообщить модератору
 Re: Очередь-таблица для репликации, как оптимальней сделать?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7658
Читал в рекомендациях, для того, чтобы писатели не толпились нужна куча. Если нужен ключ, то его надо создавать некластерным. Четвертым вариантом была указана InMemory таблица.
18 дек 19, 18:39    [22043513]     Ответить | Цитировать Сообщить модератору
 Re: Очередь-таблица для репликации, как оптимальней сделать?  [new]
МуМу
Member

Откуда:
Сообщений: 1126
Насчет секционирования не думал, не пробовал. Проверю! ну и с inMemory, тоже ,только там тоже вопрос издержек(транзакции могут быть длинные, хотя вроде блокировочное пространство не будет использоваться)
18 дек 19, 18:48    [22043523]     Ответить | Цитировать Сообщить модератору
 Re: Очередь-таблица для репликации, как оптимальней сделать?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50414
Гавриленко Сергей Алексеевич
Есдинственный сценарий, когда индексы не нужны, это когда таблица обрабатывается сразу челиклм, и сразу же очищается/удаляется.

Ну так репликаторы с CDC на триггерах обычно так и работают.
18 дек 19, 19:24    [22043551]     Ответить | Цитировать Сообщить модератору
 Re: Очередь-таблица для репликации, как оптимальней сделать?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31328
Гавриленко Сергей Алексеевич
alexeyvg,

Тогду нужен еще фильтрованый индекс по этому флагу. Плюс апдейт тоже не бесплатный.
Конечно.
Но всё таки не будет фрагментации, и вот этой проблемы фантомных записей.
Ни в чём не уверен, мои задачи с очередью не дорастали до больших нагрузок, так что сам всё это не пробовал...
18 дек 19, 21:18    [22043618]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить