2016-01-26 4 views
0

В MS SQL Server, чтобы выполнить транзакцию с уровнем изоляции SNAPSHOT, сначала ее необходимо включить на уровне базы данных.Почему уровень изоляции моментального снимка отключен по умолчанию?

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

Почему это не включено по умолчанию?

PS. Примечание. Я не говорю о версии READ_COMMITTED_SNAPSHOT уровня изоляции READ COMMITTED.

+0

@Damien_The_Unbeliever К сожалению. Исправлена. –

ответ

1

Расходы указаны на странице Choosing Row Versioning-based Isolation Levels.

Некоторые из них:

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

  • Для информации о версии для версии Row требуется добавить 14 байт в строку базы данных.

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

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

1

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

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

Плохая аналогия предполагает, что у вас есть две транзакции, которые будут занимать 5 секунд в отдельности, поэтому делать один за другим они занимают в общей сложности 10 секунд. Однако, если вы потратили дополнительную секунду на каждый из них, вы могли бы сделать оба одновременно. Конечно, каждый из них теперь занимает 6 секунд (штраф 20%), но оба завершаются за 6 секунд вместо 10.

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