Как правильно реализовать Snapshot Isolation и проблемы с tempdb? - PullRequest
5 голосов
/ 17 марта 2009

Функция изоляции моментальных снимков помогает нам решить проблему, когда читатели блокируют писателей на сайтах с большими объемами. Это достигается путем контроля версий строк с использованием базы данных tempdb в SqlServer.

Мой вопрос состоит в том, чтобы правильно реализовать эту функцию изоляции моментальных снимков, это просто вопрос выполнения следующего на моем SqlServer

ALTER DATABASE MyDatabase
SET ALLOW_SNAPSHOT_ISOLATION ON

ALTER DATABASE MyDatabase
SET READ_COMMITTED_SNAPSHOT ON

Должен ли я по-прежнему писать код, включающий TransactionScope, например

using (new TransactionScope(TransactionScopeOption.Required, 
    new TransactionOptions { IsolationLevel = IsolationLevel.SnapShot}))

Наконец, Брент указал на свою озабоченность в этом посте в разделе «Скрытые затраты на параллелизм», где он упомянул, что при создании версий строк в базе данных tempdb может не хватать места в tempdb и могут возникнуть проблемы с производительностью, поскольку он должен искать версионные строки. Итак, мой вопрос: я знаю, что этот сайт использует Snapshot Isolation, кто-нибудь еще использует эту функцию на больших сайтах, и каково ваше мнение о производительности?

Thx, Ray.

1 Ответ

0 голосов
/ 12 августа 2015

Это просто вопрос выполнения следующего, как указано в https://msdn.microsoft.com/en-us/library/tcbchxcb(v=vs.110).aspx,. Если для параметра READ_COMMITTED_SNAPSHOT установлено значение OFF, необходимо явно установить уровень изоляции для каждого сеанса, чтобы получить доступ к версионным версиям. строки «. Ваша вторая команда ALTER DATABASE устанавливает READ_COMMITTED_SNAPSHOT ON, поэтому код не должен указывать этот TransactionScope.

Есть две стороны монеты производительности, когда кто-то ищет мнение о том, что производительность «достаточна», а не «недостаточна»: либо «предложение» подавляет, либо «спрос» подавляюще…. «может относиться к производительности и пространству, используемому tempdb, в то время как« спрос »может относиться к скорости, с которой происходит запись в tempdb. На стороне поставки можно использовать различные HW (от диска с одним шпинделем 5400 об / мин до массивов SSD). Что касается спроса, то это не проблема SQL Server (хотя не может быть должным образом нормализована структура базы данных), а проблема клиента.

Мои SQL-серверы видят, что клиенты одновременно требуют приблизительно 50 операций записи в минуту и ​​2000 пакетов в минуту, где записи обычно выполняются по OTLP / короткой стороне. У меня есть 1 ТБ баз данных и 30 ГБ tempdb для каждого SQL Server. Все базы данных в целом нормализованы до 3-й нормальной формы. Все базы данных работают на SSD. Я не беспокоюсь о превышении пропускной способности ввода-вывода диска tempdb. В результате у меня не было проблем с включением изоляции снимков в моих системах. Но я видел другие системы, в которых была предпринята попытка включения изоляции моментального снимка, но она была быстро заброшена.

Опыт вашей системы может отличаться от системы любого другого респондента на порядки. Вы должны стремиться профилировать / надежно воспроизводить записи вашей системы, а также воспроизводить другие варианты использования базы данных tempdb (включая сортировки), чтобы прийти к собственным выводам для вашей собственной системы (для различных HW с достаточным пространством для результирующих результатов вашей системы). размер базы данных). Нагрузочное тестирование не должно быть запоздалой мыслью :). Вам также следует оценить производительность IO вашего диска tempdb - см. https://technet.microsoft.com/library/Cc966412, и быть готовым потратить больше денег, если пропускная способность IO окажется недостаточной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...