Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Очередь-таблица для репликации, как оптимальней сделать? / 21 сообщений из 21, страница 1 из 1
18.12.2019, 11:08
    #39904559
МуМу
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь-таблица для репликации, как оптимальней сделать?
Есть следующая проблема, существует репликатор который помощью триггеров данные пишет в таблицу очередь. Из этой очереди необходимо данные читать и из нее необходимо удалять причем весьма интенсивно(по транзакционно). Возникают проблемы фрагментацией данных, которые приводят к повышенной нагрузке.(ребилд индекс в силу отдельных проблем не вариант). Вот возникла идея писать триггерами с помощью View. А сама view будет представлением на таблицу Очередь(N) , где N будет итерационный расти. То есть это будет Очередь1,Очередь2,Очередь3 и т.п. Фактически раз в минуту или чаще будет Alter view на новую таблицу ОчередьN.
В этом случае конечно данные могут быть записаны в разные таблицы Очередь(N) из одной длинной транзакции, но это не является проблемой(только возникают сложности администрирования). По идее блокировка на схеме должна быть минимальная. Но зато решается вопрос с фрагментацией(и снижаются издержки на логирование, сохранение истории очереди). Какие при таком подходе могут быть проблемы?
...
Рейтинг: 0 / 0
18.12.2019, 11:30
    #39904576
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь-таблица для репликации, как оптимальней сделать?
слушайте, а вы точно русский человек?
ведь читать же невозможно.
не только этот пост, а просто все подряд
...
Рейтинг: 0 / 0
18.12.2019, 11:37
    #39904581
МуМу
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь-таблица для репликации, как оптимальней сделать?
Ну извините, иногда тороплюсь, сильно не заморачиваюсь.
У нас все таки технический а не филологический форум. Рыбак рыбака - поймет:)
...
Рейтинг: 0 / 0
18.12.2019, 12:28
    #39904632
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь-таблица для репликации, как оптимальней сделать?
МуМу,

как Вы узнали, что проблема состоит в фрагментации таблицы?
...
Рейтинг: 0 / 0
18.12.2019, 13:13
    #39904692
МуМу
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь-таблица для репликации, как оптимальней сделать?
Делаешь ребилд индексов, все становится нормально - количество логических чтений резко усеньшается.Планы одинаковые(там две таблицы джойнятся). Записей не так много а логических чтений со временем становится все больше. Ребилд индексов приводит к блокировкам т.к. интенсивность вставки удалений очень большая.
...
Рейтинг: 0 / 0
18.12.2019, 13:27
    #39904714
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь-таблица для репликации, как оптимальней сделать?
Для очередей неплохо (как я слышал) подходит Service Broker, ну и всякие специализированные решения (Kafka и т.п.).
На скуле очередь городится довольно неудобно из-за того, что весьма проблематично одновременно организовывать партиционирование и по дате (или другому монотонно возрастающему полю) для очистки и обработки, и по равномерному ключу (для масштабирования).

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

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

МуМуПо идее блокировка на схеме должна быть минимальная.И тем не менее, может стать проблемой, если нет момента, когда никто не льет в очередь данные. Тем более, я не уверен, что можно сделать alter view с блокировкой wait_on_low_priority, как при многих других DDL-операциях. Короче, возможно придется еще как-то городить сериализатор заливальщиков, если таблицы надо нарезать чаще, чем есть возможность заблокировать представление.
...
Рейтинг: 0 / 0
18.12.2019, 13:30
    #39904720
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь-таблица для репликации, как оптимальней сделать?
МуМу
Делаешь ребилд индексов, все становится нормально - количество логических чтений резко усеньшается.Планы одинаковые(там две таблицы джойнятся). Записей не так много а логических чтений со временем становится все больше. Ребилд индексов приводит к блокировкам т.к. интенсивность вставки удалений очень большая.
Похоже на проблему с ghost-пейджами. Проверяется обычным select top 1 from очередь order by порядок обработки. Если при этом дохрена логических чтений, это оно. Иногда лечится, если удалять c paglock, иногда нет.
...
Рейтинг: 0 / 0
18.12.2019, 13:47
    #39904750
МуМу
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь-таблица для репликации, как оптимальней сделать?
Вот думаю проверить издержки на view, мне кажется относительно общих затрат ничтожные должны быть. Как проверить правильно не подскажешь? Ну типа инсерт в таблицу, и инсерт в таблицу через view ну и сравнить логические чтения?
...
Рейтинг: 0 / 0
18.12.2019, 13:54
    #39904762
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь-таблица для репликации, как оптимальней сделать?
МуМу,

Хотя бы. А еще лучше смоделировать пиковую нагрузку и посмотреть, сколько записей в секунду оно тянет, а сколько уже нет. Чтобы через год-другой не пришлось опятьт все переделывать.
...
Рейтинг: 0 / 0
18.12.2019, 14:48
    #39904811
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь-таблица для репликации, как оптимальней сделать?
МуМу
существует репликатор который помощью триггеров данные пишет в таблицу очередь.

Этой таблице никакие индексы не нужны. В особенности - кластерные. Удали их.
...
Рейтинг: 0 / 0
18.12.2019, 15:02
    #39904828
МуМу
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь-таблица для репликации, как оптимальней сделать?
Изначально планировалось без индексов но возникала одна из проблем с вычиткой, а точнее с уровнем изоляции(завтра спрошу у архитекторов). Нужно максимально оперативно вычитывать и затем удалять закомиченные данные при этом влиять на систему по минимуму(посредством блокировок).
...
Рейтинг: 0 / 0
18.12.2019, 15:08
    #39904839
МуМу
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь-таблица для репликации, как оптимальней сделать?
Есть еще мысли подумать можно ли для этого InMеmory(со схемой без потери данных) таблицу прикрутить, хотя сомневаюсь. А вообще прихожу к выводу что лучше писать в таблицу данные изменений посредством чтения из лога транзакций, например используя Changedata capture , тогда подобные проблемы вообще как класс возникать не будут.
Хотя предложенный вариант с view пока выглядит как самый простой для текущей реализации.
...
Рейтинг: 0 / 0
18.12.2019, 15:49
    #39904882
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь-таблица для репликации, как оптимальней сделать?
Dimitry Sibiryakov
МуМу
существует репликатор который помощью триггеров данные пишет в таблицу очередь.

Этой таблице никакие индексы не нужны. В особенности - кластерные. Удали их.
Ровно наоборот. В сценарии обработки очереди по чекпоинтам нужен seek на начальную точку выборки, иначе на каждой итерации будет сканироваться вся таблица. В сценарии с удалением, в начале кучи будет образовываться ghost-страницы, которые будуд при каждом delete top или select top вычитываться. Есдинственный сценарий, когда индексы не нужны, это когда таблица обрабатывается сразу челиклм, и сразу же очищается/удаляется.
...
Рейтинг: 0 / 0
18.12.2019, 16:30
    #39904935
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь-таблица для репликации, как оптимальней сделать?
МуМу,

Секционируйте таблицу по номеру транзакции.
Тогда после обработки, удалить транзакцию из очереди можно будет переключением секции в служебную таблицу, которую затем усечь. Либо, если позволит версия, сразу truncate with partitions. Соответственно, фантомных строк не будет.
...
Рейтинг: 0 / 0
18.12.2019, 18:12
    #39904988
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь-таблица для репликации, как оптимальней сделать?
МуМу
Из этой очереди необходимо данные читать и из нее необходимо удалять причем весьма интенсивно(по транзакционно).
...
зато решается вопрос с фрагментацией
...
Делаешь ребилд индексов, все становится нормально
А вот помнится мы говорили про InMemory :-) Как раз тот самый случай...
МуМу
Есть еще мысли подумать можно ли для этого InMеmory(со схемой без потери данных) таблицу прикрутить, хотя сомневаюсь.
Я бы это попробовал.
...
Рейтинг: 0 / 0
18.12.2019, 18:24
    #39904996
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь-таблица для репликации, как оптимальней сделать?
МуМу
Из этой очереди необходимо данные читать и из нее необходимо удалять причем весьма интенсивно(по транзакционно).
Ещё вариант - не удалять, а апдэйтить флажок "обработано". А удалять потом, типа раз в сутки, даже можно секциями, если действительно много данных.
Тогда точно не будет фрагментации, и всяких этих ghost-пейджей.
...
Рейтинг: 0 / 0
18.12.2019, 18:32
    #39905000
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь-таблица для репликации, как оптимальней сделать?
alexeyvg,

Тогду нужен еще фильтрованый индекс по этому флагу. Плюс апдейт тоже не бесплатный.
...
Рейтинг: 0 / 0
18.12.2019, 18:39
    #39905008
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь-таблица для репликации, как оптимальней сделать?
Читал в рекомендациях, для того, чтобы писатели не толпились нужна куча. Если нужен ключ, то его надо создавать некластерным. Четвертым вариантом была указана InMemory таблица.
...
Рейтинг: 0 / 0
18.12.2019, 18:48
    #39905013
МуМу
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь-таблица для репликации, как оптимальней сделать?
Насчет секционирования не думал, не пробовал. Проверю! ну и с inMemory, тоже ,только там тоже вопрос издержек(транзакции могут быть длинные, хотя вроде блокировочное пространство не будет использоваться)
...
Рейтинг: 0 / 0
18.12.2019, 19:24
    #39905029
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь-таблица для репликации, как оптимальней сделать?
Гавриленко Сергей Алексеевич
Есдинственный сценарий, когда индексы не нужны, это когда таблица обрабатывается сразу челиклм, и сразу же очищается/удаляется.

Ну так репликаторы с CDC на триггерах обычно так и работают.
...
Рейтинг: 0 / 0
18.12.2019, 21:18
    #39905087
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь-таблица для репликации, как оптимальней сделать?
Гавриленко Сергей Алексеевич
alexeyvg,

Тогду нужен еще фильтрованый индекс по этому флагу. Плюс апдейт тоже не бесплатный.
Конечно.
Но всё таки не будет фрагментации, и вот этой проблемы фантомных записей.
Ни в чём не уверен, мои задачи с очередью не дорастали до больших нагрузок, так что сам всё это не пробовал...
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Очередь-таблица для репликации, как оптимальней сделать? / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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