Для моего приложения базы данных, используя изоляцию снимка для определенных из транзакций ее запросов кажется идеально подходящим для решения одного из критических требований.
Я волнуюсь, тем не менее, как выбор изоляции снимка (то, которому я верю, должно быть включено всей базы данных) теперь укусит нас, после того как мы начинаем получать очень большие объемы. Какова стоимость изоляции снимка? Действительно ли это - фиксированные затраты, линейные, или геометрические?
Если я прав быть обеспокоенным большими объемами, есть ли стратегии/шаблоны функциональности прикладного уровня, подобной для создания снимков изоляции, которая могла бы иметь лучшую общую производительность, но занимать больше времени/экспертных знаний для реализации?
Спасибо,
Jason
Для всех, кто не является экспертом по управлению блокировкой и базой данных, это может быть удивительно сложно, чтобы обойти свой разум.
Я настоятельно рекомендую прочитать это серию постов на изоляции снимков Hugo Cornelis (SQL Server MVP). До сих пор это самый полный анализ, который я видел из практичных соображений при использовании снимков.
Для обобщения основных вопросов:
В зависимости от того, как вы пишете свои запросы, вам, возможно, даже не нужно использовать триггеры для того, чтобы в конечном итоге неожиданные или непоследовательные результаты .
Я не знаю, являются ли расходы фиксированы или линейные, хотя они определенно не геометрические; Я знаю, что это немного головной боли независимо. Часто говорится о варианте пожарной и забывающей, но правда в том, что это не так, если вы не знаете, что вы делаете, вы можете в конечном итоге с нарушениями (те, о которых вы, вероятно, не узнаете о пока не слишком поздно!).
Всеми средствами используйте его, если вы уверены, что не приведут никаких других проблем. Но если какая-либо из вашей логики не заботится о грязных читах (и это относится к более чем половине SELECT
запросов во многих системах), вы получите гораздо лучшие результаты с READ
(который включает больше «опыта» - вы должны очень тщательно подумать о том, что может произойти и когда).
Обновление: на альтернативах уровня нанесения
Единственный, который к нам кэширует. Некоторые рамки данных могут сделать это для вас (Nibernate, EF), а в некоторых случаях вы можете даже иметь 3-й уровень кэширования, такие как веб-сервисы, которые кэшируют результаты на основе ввода сообщений, результаты, которые могут быть основаны на нескольких запросах. Я бы не на самом деле не назвал этой «альтернативой», но я представляю, что в вашем случае будет эффективна некоторая форма кэширования, если они являются запросами только для чтения, и основные данные не изменяются часто. Рассмотрение дизайна, конечно, насколько вы можете позволить себе кэшировать относительно суммы, необходимой для обслуживания; Если система массово одновременно, то это может не масштабировать.
Помимо этого, я лично не решил попытаться реализовать свой собственный преобразователь уровня приложения «Уровень». Может быть, некоторые люди сделали это, но я не думаю, что мой ограниченный опыт может конкурировать со сотнями или тысячами самых ярких дизайнеров, работающих на СУБД на 20 лет.
Изоляция снижения предназначена для более прочитанного исполнителя, чем другие уровни изоляции. Разделив данные в снимок, транзакция не должна получать блокировки на строках, которые предотвращают блокировку и тупики.
Однако он должен написать информацию о версии ROW в базу данных Tempdb. Так что для каждой транзакции следует ожидать некоторого времени записи.
Так же, как все остальное, ваши обстоятельства будут диктовать, будет ли это более или менее исполнительным для вас. Если ваше приложение является стилем OLTP, то может быть большой рост производительности, если ваши транзакции склонны к тупике.