Пределы Изоляции Снимка SQL

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

Я волнуюсь, тем не менее, как выбор изоляции снимка (то, которому я верю, должно быть включено всей базы данных) теперь укусит нас, после того как мы начинаем получать очень большие объемы. Какова стоимость изоляции снимка? Действительно ли это - фиксированные затраты, линейные, или геометрические?

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

Спасибо,

Jason

5
задан Jason Kleban 31 December 2009 в 21:22
поделиться

2 ответа

Для всех, кто не является экспертом по управлению блокировкой и базой данных, это может быть удивительно сложно, чтобы обойти свой разум.

Я настоятельно рекомендую прочитать это серию постов на изоляции снимков Hugo Cornelis (SQL Server MVP). До сих пор это самый полный анализ, который я видел из практичных соображений при использовании снимков.

Для обобщения основных вопросов:

  • , когда конкретное сочетание одновременного транзакций позволит на нарушении ограничения (уникальный, внешний ключ и т. Д.), SQL Server отступит к старому способу делать вещи. Это хорошо для надежности, очевидно, но не для производительности. Снимки не являются панацеей, они не замена для хорошей дизайна базы данных / запросов и интеллектуального управления замком.
  • Снимки и триггеры могут не играть приятно вместе. Это особенно опасно, если вы используете триггеры для защиты целостности данных, но даже если вы этого не сделаете, все ваши триггеры должны быть сделаны снимки.

В зависимости от того, как вы пишете свои запросы, вам, возможно, даже не нужно использовать триггеры для того, чтобы в конечном итоге неожиданные или непоследовательные результаты .

Я не знаю, являются ли расходы фиксированы или линейные, хотя они определенно не геометрические; Я знаю, что это немного головной боли независимо. Часто говорится о варианте пожарной и забывающей, но правда в том, что это не так, если вы не знаете, что вы делаете, вы можете в конечном итоге с нарушениями (те, о которых вы, вероятно, не узнаете о пока не слишком поздно!).

Всеми средствами используйте его, если вы уверены, что не приведут никаких других проблем. Но если какая-либо из вашей логики не заботится о грязных читах (и это относится к более чем половине SELECT запросов во многих системах), вы получите гораздо лучшие результаты с READ (который включает больше «опыта» - вы должны очень тщательно подумать о том, что может произойти и когда).

Обновление: на альтернативах уровня нанесения

Единственный, который к нам кэширует. Некоторые рамки данных могут сделать это для вас (Nibernate, EF), а в некоторых случаях вы можете даже иметь 3-й уровень кэширования, такие как веб-сервисы, которые кэшируют результаты на основе ввода сообщений, результаты, которые могут быть основаны на нескольких запросах. Я бы не на самом деле не назвал этой «альтернативой», но я представляю, что в вашем случае будет эффективна некоторая форма кэширования, если они являются запросами только для чтения, и основные данные не изменяются часто. Рассмотрение дизайна, конечно, насколько вы можете позволить себе кэшировать относительно суммы, необходимой для обслуживания; Если система массово одновременно, то это может не масштабировать.

Помимо этого, я лично не решил попытаться реализовать свой собственный преобразователь уровня приложения «Уровень». Может быть, некоторые люди сделали это, но я не думаю, что мой ограниченный опыт может конкурировать со сотнями или тысячами самых ярких дизайнеров, работающих на СУБД на 20 лет.

10
ответ дан 13 December 2019 в 19:28
поделиться

Изоляция снижения предназначена для более прочитанного исполнителя, чем другие уровни изоляции. Разделив данные в снимок, транзакция не должна получать блокировки на строках, которые предотвращают блокировку и тупики.

Однако он должен написать информацию о версии ROW в базу данных Tempdb. Так что для каждой транзакции следует ожидать некоторого времени записи.

Так же, как все остальное, ваши обстоятельства будут диктовать, будет ли это более или менее исполнительным для вас. Если ваше приложение является стилем OLTP, то может быть большой рост производительности, если ваши транзакции склонны к тупике.

1
ответ дан 13 December 2019 в 19:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: