powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
25 сообщений из 27, страница 1 из 2
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #39627329
Oblom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Дано: Синхронная реплика AlwaysOn, таблица 763 млн. строк, 77 Гб весом. На ней кластерный индекс с таким же весом в 77 Гб и фрагментацией 42%.
Задача: перестроить его для уменьшения фрагментации.
Проблема: При ребилде для других процессов начинаются множественные ожидания типа HADR_SYNC_COMMIT (ожидание коммита на синхронной реплике), из-за чего всё встает колом. Узкое место - сеть, но между серверами стоит 10 Гбит, расширять некуда.
Ребилд выполняется командой
Код: sql
1.
2.
ALTER INDEX [CI_Index] ON Table
REBUILD WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, SORT_IN_TEMPDB = ON, ONLINE = ON)


Рекомендуют ограничить ребилд одним потоком:
Код: sql
1.
2.
ALTER INDEX [CI_Index] ON Table
REBUILD WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, SORT_IN_TEMPDB = ON, ONLINE = ON, MAXDOP=1)


Но картина не меняется, что неудивительно, поскольку MAXDOP=1 стоит на уровне всего сервера.

Дело именно в размере индекса, поскольку после проявления проблемы я ограничил размер обслуживаемых индексов 5 Гб, после чего план отработал без подобных проблем. Осталось считанное число по факту необслуживаемых индексов.

Один из вариантов решения, которые предлагают - на время реиндексации переводить реплику в асинхронный режим, после окончания - возвращать обратно. Но хотелось бы решить проблему как-то более гуманно.
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #39627337
Slava_Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
делайте реорганизацию, от фрагметации не избавит,я так делаю, но уменьшит ее, либо стройте по партициям, можно вообще тогда не делать обслуживание индексов, если получится.
А вообще я бы понаблюдал , есть ли отставание реплики, возможно и те индексы негатив создают.
И вообще так необходимо перестраиваить, реально смотрели ? или по феншую типа тоого?
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #39627348
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oblom,

Как сказали выше а вам точно это надо.
Смотрите. У вас стоит maxdop 1, значит или вы не понимаете зачем он или у вас прям чуть ли не 100% OLTP система. Если последнее, или если у вас SSD, фрагментация (external) не будет влиять на производительность никак. В таком случае будет влиять internal, т.е. если страницы у вас полупустые, тогда у вас будет больше индекс и он будет больше занимать места в памяти.
Плюс вы делаете Online ребилд, он пишет в лог намного больше чем offline, попробывал сейчас на свой системе при ребилде индекса 5.4 MB при offline лог вырос примерно на эту цифру, при online на 12-13 MB.
http://sqlblog.com/blogs/kalen_delaney/archive/2011/03/08/what-gets-logged-for-index-rebuilds.aspx
Поэтому у вас вариант или делать offline (если можно конечно) или делать reorginize частями.
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #39627349
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksrov,

Реарганизация также генерит множество записей, в особенности для сильно фрагментированных индексов
https://blogs.msdn.microsoft.com/timchapman/2012/09/28/index-rebuild-vs-reorganize-the-transaction-log-edition/
Но зато вы можете ее остановить без потери результата.
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #39627370
Alexander Titkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При построении индекса эффект тот же самый, это чтобы отмести гениальные вариации на тему "оно вам надо?". SQL Server 12, 14.
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #39627373
Oblom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksrovOblom,

Как сказали выше а вам точно это надо.
Смотрите. У вас стоит maxdop 1, значит или вы не понимаете зачем он или у вас прям чуть ли не 100% OLTP система. Если последнее, или если у вас SSD, фрагментация (external) не будет влиять на производительность никак. В таком случае будет влиять internal, т.е. если страницы у вас полупустые, тогда у вас будет больше индекс и он будет больше занимать места в памяти.
Плюс вы делаете Online ребилд, он пишет в лог намного больше чем offline, попробывал сейчас на свой системе при ребилде индекса 5.4 MB при offline лог вырос примерно на эту цифру, при online на 12-13 MB.
http://sqlblog.com/blogs/kalen_delaney/archive/2011/03/08/what-gets-logged-for-index-rebuilds.aspx
Поэтому у вас вариант или делать offline (если можно конечно) или делать reorginize частями.

1. У меня прям 100% OLTP-система и да, конкретно эта таблица на SSD.
2. ONLINE жизненно необходим. Таблица высоконагруженная, по факту ядро системы. Любой простой - минус в премии и в карме. По факту online-rebuild единственная причина, почему куплен Enterprise, а не Standart. Вторая причина - этот самый AlwaysOn )))

За ссылку и совет по REORGINIZE огромное спасибо, буду курить.
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #39627374
Oblom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, забыл SELECT @@VERSION
Microsoft SQL Server 2016 (SP1-CU6) (KB4037354) - 13.0.4457.0 (X64)
Nov 8 2017 17:32:23
Copyright (c) Microsoft Corporation
Enterprise Edition: Core-based Licensing (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) (Hypervisor)
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #39627376
Фотография ОперацияПингвин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oblom,

обновляйтесь до 2017-ого сиквела
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #39627379
Фотография ОперацияПингвин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В 2017 -ом такая фитча есть
resumable index rebuild
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #39627383
Oblom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОперацияПингвинВ 2017 -ом такая фитча есть
resumable index rebuild

Круть.
Спасибо за совет. Только мы все новогодние праздники убили, чтоб обновиться с 2005 на 2016. Боюсь теперь ещё лет 10 на такую авантюру никто не подпишется )))
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #39627387
Фотография ОперацияПингвин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OblomОперацияПингвинВ 2017 -ом такая фитча есть
resumable index rebuild

Круть.
Спасибо за совет. Только мы все новогодние праздники убили, чтоб обновиться с 2005 на 2016. Боюсь теперь ещё лет 10 на такую авантюру никто не подпишется )))

C 2016 до 2017 должно быть более безболезненно, чем с 2005 до 2016
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #39627390
Oblom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОперацияПингвинOblomпропущено...


Круть.
Спасибо за совет. Только мы все новогодние праздники убили, чтоб обновиться с 2005 на 2016. Боюсь теперь ещё лет 10 на такую авантюру никто не подпишется )))

C 2016 до 2017 должно быть более безболезненно, чем с 2005 до 2016

Говорят, у нас даже лицензионные права это позволяют. Но точно не раньше нового года, а сейчас ещё только апрель ))) Так что проблему как-то надо решать.

Но судя по всему проблема известная и красивых решений не имеет. Либо сваливаться с синхронной на асинхронную реплику, либо партицировать таблицу вместе с индексом и жрать его по кусочкам.
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #39627393
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oblom,

Ребилд больших индексов в принципе гемор как таковой, даже без AG.
У нас стандарт, ребилд делать не могу, т.к. приложение валится в ошибки если таблица недоступна, даже ночью, когда никто не работает, идут потоком автоматические задания, которые перенести нельзя, поэтому тоже делаю только реорг. и иногда ребилд, когда система отключается для проведения каких либо работ.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #40056795
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Встретил похожую проблему. Причем при попытке сжать раздутый лог появилась похожая проблема и пришлось отменять.
При обработке ребилде индекса размером около 5 ГБ вверх полезли ожидания HADR_SYNC_COMMIT, у пользовательских запросов последнее ожидание стало HADR_SYNC_COMMIT, начали блокировть друг друга. (а о сессию ребилда нет).
По дашборду AlwaysOn виден рост Log send queue size и redo queue size.
При этом между машинами сетка 10Гбит, а нагрузку в этом момент показывает около 40 mbytes, что далеко от максимума.
Реплики синхронные.
Этот же кластер AlwaysOn из 2 ВМ на прошлом железе сидел на одном хосте, потому что на разных даже на пользовательских запросах вставал в HADR_SYNC_COMMIT, сетевики присылали скрин передачи файла между хостами с нормальной скоростью и говорили, что всё ок. Но что-то такой метод не убеждает.
На новом железе реплики смогли жить уже на разных нодах, но при заметных изменениях опять лезет вверх HADR_SYNC_COMMIT. Базы большие, как и таблицы, там и пользовательские изменения могут быть значительными.
Проблему хочется решить, а не убирать вызывающие действия. Пока выглядит, что что-то настроено не так. Возможная настройка MS SQL (но вряд ли, ничего не менялось, а на разных хостах виртуализации работа разная), настройка ВМ или сетевая. У кого-то есть мысли в какую сторону искать и что проверить?
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #40056804
Фотография Александр Гладченко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема не в сети, а в низкой производительности REDO на репликах. Это самое узкое место AlwaysON.
От ребилда можно уйти, если разместить данные на SSD, где его не нужно делать. Этим и решите проблему.
Убедитесь для начала, что REDO у вас на репликах параллельный, это видно в системных сессиях.
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #40056816
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если редакция позволяет, на время ребилда можно переключить реплику в асинхронный режим.
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #40056834
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Александр Гладченко,

На время убирали дефрагментацию индексов, но встретили пару случаев со странным выполнением запросов на ноде для чтения, тогда помог ребилд одного из индексов участников. Про SSD и дефрагментация руководство в курсе, их это устраивает. Настаивают на возвращении раз в неделю, смысла спорить особо нет. Да и рост HADR_SYNC_COMMIT наблюдается не только во время обслуживания индексов, просто им проще всего отловить.

Для однократного выполнения перевести в асинхронный режим возможно, но для постоянного не стоит. Да и сколько будет идти синхронизация после? Сейчас при минуте выполнения, при остановке потом ещё минуты 2 в норму приходит.

Вот по redo можно проверить. При проверке sp_who на ноде для чтения есть сессии background PARALLEL REDO TA, но не по всем базам, при этом по основным БД таких сессий сейчас не вижу. TF 3459 не включен и он вроде на весь сервер, а не отдельные БД.
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #40056836
Фотография Александр Гладченко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Danion,

Паралельный REDO включается для тех баз, для которых выполняются необходимые для этого условия, они для разных версий/редакций могут отличаться. Но есть ещё одно неприятное ограничение, он включается только для первых 7 баз в порядке их перехода в онлайн после старта. Кто первый встал - того и тапки. Это может стать проблемой для больших баз с высокой нагрузкой, которые попадают под раздачу на стартапрекавери...
Ребилд на SSD полезен только для ускорения чистки фантомных записей, когда в пользователькой таблице устраивают "звёздные войны" с большими перетрубациями строк. Такое лучше переводить на хекатон. Ребилд же для дефрагментации даже раз в неделю ни к чему хорошему не приведёт, зато время жизни SSD подсократит...
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #40056838
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Александр Гладченко,

Вот тоже наткнулся на информацию, что там первый попадают, а не все.
Версия 2017 Enterprise.
Вижу 6 из 18. Примерно самые мелкие.

When the host server has 32 or more CPU cores, each database will occupy 16 parallel redo worker threads and one helper worker thread. It means that all databases starting with the 7th database (ordered by database id ascending) that has joined availability group it will be in single thread redo or serial redo irrespective which database has actual redo workload. If a SQL Server Instance has a number of databases, and it is desired for a particular database to run under parallel redo model, the database creation order needs to be considered. Same idea can be applied to force a database always runs in serial redo model as well.

Базы добавлены в Always On добавлены давным давно, порядок мог быть любой. Если при включении инстанса набирается заново, то основные тяжелые базы будут последними подниматься.

Вроде бы упоминается возможно заставить базу всегда работать в serial redo. Попробую поискать как определенную базу из мелких заставить работать без параллельного и освободить места.
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #40056846
Фотография Александр Гладченко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать перед рестартом службы перевести некритичные базы в офлайн...
Про превые 7 в порядке ID кажется лажа, я пробовал создавать базы на новых зеркалах в "правильном" порядке - но наблюдал неоднократно, что на меньших ID не было паралельного REDO, приходилось отключать паралельный REDO трейсфлагом (DBCC TRACEON (3459, -1); -- Disables parallel redo.) и потом убирать флаг - после такой взбучки включалось как надо. ИМХО, он включается по порядку ID за вычетом недоступных на старте баз.
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #40056849
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Александр Гладченко,

На постоянной основе пока варианта отключить только для конкретной базы не вижу. Нужные базы с ID 8 и 9. При этом работает для 14, 20, 21.

Через флаг для всего сервера можете подсказать? Там на вторичной ноде нужно делать?
Вроде так включить\выключить. Рестарт пишут, что с 2017 для включения параллельного redo не нужен.

DBCC TRACEON (3459,-1);
GO
DBCC TRACEOFF (3459,-1);

Правда читал, что у кого-то наоборот с параллельным редо ещё проблемы начались, ну отключить тут проще.
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #40056862
Фотография Александр Гладченко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да речь как раз про тот флаг, что у Вас. Он действует на все базы зеркала.
REDO много на что плохо реагирует, паралельный в некоторых случаях "замирает" на некоторых операциях с кучей, это сигнализируется особым ожиданием и есть на это статья в КБ.
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #40057057
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я просто хочу заметить, что HADR_SYNC_COMMIT -- это не про redo, а про передачу лога на реплики.
Т.е. это ожидание того, что commit запишется в лог реплики (а не применится вся транзакция).
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #40057175
Maks Bragar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич
Я просто хочу заметить, что HADR_SYNC_COMMIT -- это не про redo, а про передачу лога на реплики.
Т.е. это ожидание того, что commit запишется в лог реплики (а не применится вся транзакция).


Именно так + лог блоки жмутся и распаковываются.

А у вас точно секондари такой же по железу как и праймери?
Что с ЦПУ на обоих репликах в момент ребилда?

п.с.
у меня HADR_SYNC_COMMIT растет во время таких операций, видно даже глазами в мониторе, но олтп нагрузка "успевает" коммититься

С ув, Макс
...
Рейтинг: 0 / 0
HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
    #40057176
Фотография Александр Гладченко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если глаза морочит HADR_SYNC_COMMIT, проверьте журнал на зеркале, вдруг у вас для журналов размер сектроа разный и весь журнал забит сообщениями о "подгонке" записи под правильный сектор.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / HADR_SYNC_COMMIT при REBUILD огромного индекса в синхронном AlwaysOn
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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