2010-11-06 11 views
16

¿Debo correr¿Cuáles son las implicaciones de SET-ting ALLOW_SNAPSHOT_ISOLATION?

ALTER DATABASE DbName SET ALLOW_SNAPSHOT_ISOLATION OFF 

si transacción de instantánea (TX) aislamiento (ISO) no se utiliza temporalmente?
En otras palabras,

  • ¿por qué debería estar habilitado, en primer lugar?
  • ¿Por qué no está habilitado de forma predeterminada?

¿Cuál es el costo de tenerlo habilitado (pero no utilizado temporalmente) en SQL Server?


--update:
habilitación de instantánea a nivel de iso TX en la base de datos no cambia LEA iso tx comprometido a ser por defecto.
Puede comprobarlo ejecutando:

use someDbName; 
--(1) 
alter database someDbName set allow_snapshot_isolation ON; 
dbcc useroptions; 

la última fila muestra que tx nivel ISO de sesión actual es (lectura confirmada).

Por lo tanto, lo que permite el nivel tx iso instantánea sin tener que cambiar a él no lo usa, etc Para utilizarlo hay que emitir

--(2) 
SET TRANSACTION ISOLATION LEVEL SNAPSHOT 

Update2:
repito los scripts desde [1 ] pero con INSTANTÁNEA permitido (pero no conectado), pero sin habilitar READ_COMMITTED_SNAPSHOT

--with enabling allow_snapshot_isolation 
alter database snapshottest set allow_snapshot_isolation ON 

-- but without enabling read_committed_snapshot 
--alter database snapshottest set read_committed_snapshot ON 
-- OR with OFF 
alter database snapshottest set read_committed_snapshot OFF 
go 

no hay resultados/filas de la ejecución del

select * from sys.dm_tran_version_store 

después de ejecutar insertar, eliminar o actualizar

¿Me puede proporcionar con los scripts que ilustra que INSTANTÁNEA nivel tx iso habilitado por (1), pero no encendido por (2) produce las versiones de tempdb y/o aumentar el tamaño de los datos con 14 bytes por fila?
Realmente no entiendo cuál es el punto en el control de versiones si está habilitado por (1) pero no se usa (no está activado por (2))?

[1]
Gestión de tempdb en SQL Server: TempDB Fundamentos (Versión de la tienda: Ejemplo simple)
http://blogs.msdn.com/b/sqlserverstorageengine/archive/2008/12/31/managing-tempdb-in-sql-server-tempdb-basics-version-store-simple-example.aspx

+0

su educado generalmente considerados para justificar la preocupación ur después de un downvote ... – Mulki

Respuesta

20

Tan pronto como el control de versiones de filas (también conocido como instantánea) está habilitado en la base de datos, todas las escrituras deben ser versionadas. No importa bajo qué nivel de aislamiento haya ocurrido la grabación, ya que los niveles de aislamiento siempre afectan a solo lecturas. En cuanto al control de versiones fila de base de datos está activada, cualquier inserción/actualizar/borrar voluntad:

  • aumentar el tamaño de los datos de 14 bytes por fila
  • posiblemente crear una imagen de los datos antes de la actualización en el almacén de versiones (tempdb)

Nuevamente, es completamente irrelevante qué nivel de aislamiento se utiliza. Tenga en cuenta que versiones de filas se produce también si alguna de las siguientes situaciones:

  • tabla tiene un disparador
  • MARS está habilitado en la conexión
  • operación de índice en línea se está ejecutando en la tabla

Todo esto se explica en Row Versioning Resource Usage:

Cada fila de base de datos puede utilizar un máximo de 14 bytes al final de la fila para la fila información de versión. La fila información de versión contiene el número de secuencia de transacción de la transacción que cometió la versión y el puntero a la fila versionada. Estos 14 bytes son añaden la primera vez que se modifica la fila, o cuando se inserta una nueva fila , bajo cualquier de estas enfermedades:

  • READ_COMMITTED_SNAPSHOT o ALLOW_SNAPSHOT_ISOLATION opciones están EN .
  • La tabla tiene un disparador.
  • Se están utilizando múltiples conjuntos de resultados activos (MARS).
  • Las operaciones de compilación del índice en línea se están ejecutando actualmente en la tabla.

...

versiones de fila que se almacenen durante tan larga como una transacción activa necesita acceder a ella. ... si cumple cualquier de los siguientes condiciones:

  • Utiliza fila aislamiento basado en el control de versiones.
  • Utiliza triggers, MARS o las operaciones de creación de índices en línea.
  • Genera versiones de fila.

actualización

:setvar dbname testsnapshot 

use master; 

if db_id('$(dbname)') is not null 
begin 
    alter database [$(dbname)] set single_user with rollback immediate; 
    drop database [$(dbname)]; 
end 
go 

create database [$(dbname)]; 
go 

use [$(dbname)]; 
go 


-- create a table before row versioning is enabled 
-- 
create table t1 (i int not null); 
go 
insert into t1(i) values (1); 
go 

-- this check will show that the records do not contain a version number 
-- 
select avg_record_size_in_bytes 
from sys.dm_db_index_physical_stats (db_id(), object_id('t1'), NULL, NULL, 'DETAILED') 
-- record size: 11 (lacks version info that is at least 14 bytes) 


-- enable row versioning and and create an identical table 
-- 
alter database [$(dbname)] set allow_snapshot_isolation on; 
go 

create table t2 (i int not null); 
go 

set transaction isolation level read committed; 
go 

insert into t2(i) values (1); 
go 

-- This check shows that the rows in t2 have version number 
-- 
select avg_record_size_in_bytes 
    from sys.dm_db_index_physical_stats (db_id(), object_id('t2'), NULL, NULL, 'DETAILED') 
-- record size: 25 (11+14) 

-- this update will show that the version store has records 
-- even though the isolation level is read commited 
-- 
begin transaction; 
update t1 
    set i += 1; 
select * from sys.dm_tran_version_store; 
commit; 
go 

-- And if we check again the row size of t1, its rows now have a version number 
select avg_record_size_in_bytes 
from sys.dm_db_index_physical_stats (db_id(), object_id('t1'), NULL, NULL, 'DETAILED') 
-- record size: 25 
+0

Wow, esto es real Hi-Tek. ¿Puedes escribir cuál es la expresión equivalente de ": setvar dbname testsnapshot" ejecutable en la ventana de consultas de SSMS? –

+1

Habilite el modo SQLCMD en SSMS mismo: http://msdn.microsoft.com/en-us/library/ms174187.aspx. Sidenote: También tengo una biblioteca que permite extensiones SQLCMD en aplicaciones cliente: http://code.google.com/p/dbutilsqlcmd/ –

+0

http://msdn.microsoft.com/en-us/library/ms189050.aspx Si estoy leyendo este derecho, de hecho hay diferencias en la escritura. – Antony

1

Por defecto, tienen aislamiento de instantánea en OFF, al encenderlo, SQL mantendrá instantáneas de datos para ejecutar transacciones. Ejemplo: en la conexión 1, está ejecutando una selección grande. En la conexión 2, actualiza algunos de los registros que se van a devolver seleccionando primero.

En el aislamiento de instantánea ON, SQL hará una copia temporal de los datos, afectados por la actualización, por lo que SELECT devolverá los datos originales.

Cualquier manipulación de datos adicional afectará el rendimiento. Es por eso que esta configuración está DESACTIVADA por defecto.

Cuestiones relacionadas