|
Очередь-таблица для репликации, как оптимальней сделать?
|
|||
---|---|---|---|
#18+
Есть следующая проблема, существует репликатор который помощью триггеров данные пишет в таблицу очередь. Из этой очереди необходимо данные читать и из нее необходимо удалять причем весьма интенсивно(по транзакционно). Возникают проблемы фрагментацией данных, которые приводят к повышенной нагрузке.(ребилд индекс в силу отдельных проблем не вариант). Вот возникла идея писать триггерами с помощью View. А сама view будет представлением на таблицу Очередь(N) , где N будет итерационный расти. То есть это будет Очередь1,Очередь2,Очередь3 и т.п. Фактически раз в минуту или чаще будет Alter view на новую таблицу ОчередьN. В этом случае конечно данные могут быть записаны в разные таблицы Очередь(N) из одной длинной транзакции, но это не является проблемой(только возникают сложности администрирования). По идее блокировка на схеме должна быть минимальная. Но зато решается вопрос с фрагментацией(и снижаются издержки на логирование, сохранение истории очереди). Какие при таком подходе могут быть проблемы? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 11:08 |
|
Очередь-таблица для репликации, как оптимальней сделать?
|
|||
---|---|---|---|
#18+
слушайте, а вы точно русский человек? ведь читать же невозможно. не только этот пост, а просто все подряд ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 11:30 |
|
Очередь-таблица для репликации, как оптимальней сделать?
|
|||
---|---|---|---|
#18+
Ну извините, иногда тороплюсь, сильно не заморачиваюсь. У нас все таки технический а не филологический форум. Рыбак рыбака - поймет:) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 11:37 |
|
Очередь-таблица для репликации, как оптимальней сделать?
|
|||
---|---|---|---|
#18+
МуМу, как Вы узнали, что проблема состоит в фрагментации таблицы? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 12:28 |
|
Очередь-таблица для репликации, как оптимальней сделать?
|
|||
---|---|---|---|
#18+
Делаешь ребилд индексов, все становится нормально - количество логических чтений резко усеньшается.Планы одинаковые(там две таблицы джойнятся). Записей не так много а логических чтений со временем становится все больше. Ребилд индексов приводит к блокировкам т.к. интенсивность вставки удалений очень большая. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 13:13 |
|
Очередь-таблица для репликации, как оптимальней сделать?
|
|||
---|---|---|---|
#18+
Для очередей неплохо (как я слышал) подходит Service Broker, ну и всякие специализированные решения (Kafka и т.п.). На скуле очередь городится довольно неудобно из-за того, что весьма проблематично одновременно организовывать партиционирование и по дате (или другому монотонно возрастающему полю) для очистки и обработки, и по равномерному ключу (для масштабирования). В любом случае, обработка с удалением -- будет медленно (куча записей в лог, ghost-пейджи в начале таблицы). Только транкейт, только хардкор. МуМуВот возникла идея писать триггерами с помощью View.Это как минимум промежуточная материализация (в inserted) всего, что заливается в очередь. По мне -- весьма накладно. МуМуПо идее блокировка на схеме должна быть минимальная.И тем не менее, может стать проблемой, если нет момента, когда никто не льет в очередь данные. Тем более, я не уверен, что можно сделать alter view с блокировкой wait_on_low_priority, как при многих других DDL-операциях. Короче, возможно придется еще как-то городить сериализатор заливальщиков, если таблицы надо нарезать чаще, чем есть возможность заблокировать представление. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 13:27 |
|
Очередь-таблица для репликации, как оптимальней сделать?
|
|||
---|---|---|---|
#18+
МуМу Делаешь ребилд индексов, все становится нормально - количество логических чтений резко усеньшается.Планы одинаковые(там две таблицы джойнятся). Записей не так много а логических чтений со временем становится все больше. Ребилд индексов приводит к блокировкам т.к. интенсивность вставки удалений очень большая. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 13:30 |
|
Очередь-таблица для репликации, как оптимальней сделать?
|
|||
---|---|---|---|
#18+
Вот думаю проверить издержки на view, мне кажется относительно общих затрат ничтожные должны быть. Как проверить правильно не подскажешь? Ну типа инсерт в таблицу, и инсерт в таблицу через view ну и сравнить логические чтения? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 13:47 |
|
Очередь-таблица для репликации, как оптимальней сделать?
|
|||
---|---|---|---|
#18+
МуМу, Хотя бы. А еще лучше смоделировать пиковую нагрузку и посмотреть, сколько записей в секунду оно тянет, а сколько уже нет. Чтобы через год-другой не пришлось опятьт все переделывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 13:54 |
|
Очередь-таблица для репликации, как оптимальней сделать?
|
|||
---|---|---|---|
#18+
МуМу существует репликатор который помощью триггеров данные пишет в таблицу очередь. Этой таблице никакие индексы не нужны. В особенности - кластерные. Удали их. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 14:48 |
|
Очередь-таблица для репликации, как оптимальней сделать?
|
|||
---|---|---|---|
#18+
Изначально планировалось без индексов но возникала одна из проблем с вычиткой, а точнее с уровнем изоляции(завтра спрошу у архитекторов). Нужно максимально оперативно вычитывать и затем удалять закомиченные данные при этом влиять на систему по минимуму(посредством блокировок). ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 15:02 |
|
Очередь-таблица для репликации, как оптимальней сделать?
|
|||
---|---|---|---|
#18+
Есть еще мысли подумать можно ли для этого InMеmory(со схемой без потери данных) таблицу прикрутить, хотя сомневаюсь. А вообще прихожу к выводу что лучше писать в таблицу данные изменений посредством чтения из лога транзакций, например используя Changedata capture , тогда подобные проблемы вообще как класс возникать не будут. Хотя предложенный вариант с view пока выглядит как самый простой для текущей реализации. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 15:08 |
|
Очередь-таблица для репликации, как оптимальней сделать?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov МуМу существует репликатор который помощью триггеров данные пишет в таблицу очередь. Этой таблице никакие индексы не нужны. В особенности - кластерные. Удали их. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 15:49 |
|
Очередь-таблица для репликации, как оптимальней сделать?
|
|||
---|---|---|---|
#18+
МуМу, Секционируйте таблицу по номеру транзакции. Тогда после обработки, удалить транзакцию из очереди можно будет переключением секции в служебную таблицу, которую затем усечь. Либо, если позволит версия, сразу truncate with partitions. Соответственно, фантомных строк не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 16:30 |
|
Очередь-таблица для репликации, как оптимальней сделать?
|
|||
---|---|---|---|
#18+
МуМу Из этой очереди необходимо данные читать и из нее необходимо удалять причем весьма интенсивно(по транзакционно). ... зато решается вопрос с фрагментацией ... Делаешь ребилд индексов, все становится нормально МуМу Есть еще мысли подумать можно ли для этого InMеmory(со схемой без потери данных) таблицу прикрутить, хотя сомневаюсь. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 18:12 |
|
Очередь-таблица для репликации, как оптимальней сделать?
|
|||
---|---|---|---|
#18+
МуМу Из этой очереди необходимо данные читать и из нее необходимо удалять причем весьма интенсивно(по транзакционно). Тогда точно не будет фрагментации, и всяких этих ghost-пейджей. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 18:24 |
|
Очередь-таблица для репликации, как оптимальней сделать?
|
|||
---|---|---|---|
#18+
alexeyvg, Тогду нужен еще фильтрованый индекс по этому флагу. Плюс апдейт тоже не бесплатный. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 18:32 |
|
Очередь-таблица для репликации, как оптимальней сделать?
|
|||
---|---|---|---|
#18+
Читал в рекомендациях, для того, чтобы писатели не толпились нужна куча. Если нужен ключ, то его надо создавать некластерным. Четвертым вариантом была указана InMemory таблица. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 18:39 |
|
Очередь-таблица для репликации, как оптимальней сделать?
|
|||
---|---|---|---|
#18+
Насчет секционирования не думал, не пробовал. Проверю! ну и с inMemory, тоже ,только там тоже вопрос издержек(транзакции могут быть длинные, хотя вроде блокировочное пространство не будет использоваться) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 18:48 |
|
Очередь-таблица для репликации, как оптимальней сделать?
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевич Есдинственный сценарий, когда индексы не нужны, это когда таблица обрабатывается сразу челиклм, и сразу же очищается/удаляется. Ну так репликаторы с CDC на триггерах обычно так и работают. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 19:24 |
|
Очередь-таблица для репликации, как оптимальней сделать?
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевич alexeyvg, Тогду нужен еще фильтрованый индекс по этому флагу. Плюс апдейт тоже не бесплатный. Но всё таки не будет фрагментации, и вот этой проблемы фантомных записей. Ни в чём не уверен, мои задачи с очередью не дорастали до больших нагрузок, так что сам всё это не пробовал... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 21:18 |
|
|
start [/forum/moderation_log.php?user_name=%D0%BB%D0%BE%D0%B2%D0%B8%D1%82%D1%8C+%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
get settings: |
11ms |
get forum list: |
16ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
others: | 7771ms |
total: | 7960ms |
0 / 0 |