Pregunta

Estoy leyendo SQL Server extensión de bloqueo de Página de MSDN acerca de la extensión de bloqueo de SQL Server

Mi pregunta es, parece ser la razón principal por la que existe la escalada del bloqueo es para reducir la sobrecarga de mantener más seguros (por ejemplo,cuando más bloqueos de fila son adquiridos por una tabla, fila nivel de bloqueo se transmitía a nivel de tabla).Mi pregunta es, para mantener más de cerradura mejorar la simultaneidad, es un beneficio, ¿por qué es un puente?En mi humilde idea, cerradura debe ser tan pequeño como suficiente para hacer la base de un mejor desempeño mediante la mejora de la concurrencia.Podría alguien explicar en forma sencilla por qué la extensión de bloqueo que se necesita y qué es lo que se denomina bloqueo de sobrecarga por favor?

gracias de antemano, George

¿Fue útil?

Solución

Podría alguien explicar en forma sencilla por qué la extensión de bloqueo que se necesita y qué es lo que se denomina bloqueo de sobrecarga por favor?

Al actualizar una tabla de bloqueo y de una fila, usted necesita registrar este hecho de alguna manera:que una fila, fue actualizado y bloqueado.

Cuando la actualización de millones de filas, usted necesita para hacer esto millones de veces, y por lo tanto tener un poco de espacio para mantener a millones de cerraduras.

SQL Server mantiene una lista de bloqueos en la memoria, mientras que Oracle hace en las tablas.

Esto es probablemente debido a que Oracle es de edad (mayores que yo), y SQL Server es joven en comparación con Oracle.

Mantener los recursos temporales (como las cerraduras) en un almacenamiento permanente no es tan obvio que la solución de diseñador punto de vista.Sólo una cosa a mencionar:usted puede necesitar una escritura de disco para realizar una SELECT FOR UPDATE.

Oracle características principales fueron desarrollados a principios de los 80, cuando las cosas se mantengan en la memoria no era una opción en absoluto.Simplemente había el uso de espacio en disco de alguna manera.

Si el espacio en disco iba a ser utilizado de todos modos, había que colocar un candado en algún lugar en el disco.

Y donde para mantener un bloqueo de una fila y si no dentro de la fila?

Los desarrolladores de SQL Server de bloqueo del sistema, cuando la invención de diseño de sus RDBMS llamado Sybase, decidió almacenar cosas temporales (i.e.los bloqueos) en el almacenamiento temporal (i.e.La memoria RAM).

Pero de Oracle el diseño es siempre equilibrada:si usted tiene un 1.000.000 de filas en la base de datos, entonces usted tiene un espacio de almacenamiento para 1.000.000 de cerraduras, si tiene miles de millones de filas, usted puede almacenar miles de millones de cerraduras, etc.

SQL Server el diseño de flawy en este sentido, debido a que su memoria RAM y espacio en el disco duro puede estar desequilibrado.Usted puede fácilmente tener 16MB de RAM y varios terabytes de espacio en disco.Y la memoria no puede contener todos los bloqueos.

Por eso, cuando el recuento de bloqueos alcanza un cierto límite, SQL Server decide concentrar los bloqueos de la:en lugar de mantener los bloqueos de, digamos, 10 filas individuales en una página de datos (lo que requiere de 10 registros), se bloquea el conjunto de los datos de la página (lo que requiere 1 registro).

Oracle, por otro lado, a la hora de actualizar una fila, sólo escribe el bloqueo a la derecha en la datapage.

Es por eso que Oracle bloqueos a nivel de fila.

Oracle no "administrar" los bloqueos en el sentido común de la palabra:usted no puede, decir, obtener una lista de páginas bloqueadas en Oracle.

Cuando una transacción necesita actualizar una fila, apenas va a la fila y se ve si es bloqueado.

Si es así, se ve que la transacción tenga un bloqueo (esta información está contenida dentro de la cerradura descriptor en la página de datos) y se añade que la transacción de la cola de notificaciones:cuando el bloqueo de las transacciones muere, que es la original recibe la notificación y los bloqueos de los datos.

A partir de la concurrencia del punto de vista, la extensión de bloqueo es totalmente un pobre hombre de solución:no aporta nada a la concurrencia.Usted puede, por ejemplo, recuperar un bloqueo en una fila que usted ni siquiera tocar.

Desde el punto de vista del hacer las cosas en la memoria es, por supuesto, más rápido que haciendo ellos en el disco.

Pero desde Oracle almacena los bloques de datos y el real de las operaciones descritas anteriormente se realizan en la memoria de todos modos, el rendimiento es el mismo o cerca de ella.

Otros consejos

Si las estimaciones optimizador de SQL Server / decide que una consulta va a 'visitar' todos los registros en el mismo rango que será más eficiente para mantener un candado sobre ese rango en lugar de tener que negociar muchas cerraduras (cerraduras tienen que hacerse la prueba de tipo). Esto es además de consumir menos recursos de bloqueo (un sistema de ancho de recursos).

Si usted tiene un esquema bien diseñado, y los índices correspondientes a su carga de trabajo de consulta, que se mantienen con regularidad, que no debería tener que preocuparse por la escalada que se está produciendo. En muchos casos, el bloqueo de bloqueos de tabla pueden ser eliminados por los índices de cobertura apropiado.

UPDATE: Un índice de cobertura para una consulta significa que no necesitará una búsqueda en el agrupado a realizar, y esto reduce las posibilidades de bloqueo se inserta en la tabla

.

la sobrecarga de bloqueo significa que la gestión de una tabla de bloqueo es mejor Potencia del sabio, que la gestión de una gran cantidad de bloqueos de registro. ya que cada cerradura tiene algo de memoria, una gran cantidad de bloqueos de registro puede consumir mucho más memoria de un bloqueo de tabla. por lo que la extensión de bloqueo va de fila-> página-> bloqueo de tabla.

La definición de "eficiente" es complejo. A veces es más eficiente para optimizar la concurrencia si una gran cantidad de procesos se pueden hacer allí cosa sin colisiones. A veces es más efectivo que tomar una concurrencia temporal golpear para obtener un único proceso de manera más rápida. El bloqueo escalado mantendrá otros procesos a cabo por lo que este proceso puede conseguir su trabajo hecho y salir del camino.

Para obtener información específica sobre cómo se mantienen los bloqueos, se puede ver el capítulo 8 de Microsoft SQL Server 2005: El motor de almacenamiento (No estoy afiliado, esto es sólo la primera información internos me encontré). Si usted tiene una cuenta Books24x7, está en allí. Se muestra en una máquina de> 16 GB de memoria hay 2 ^ 25 (33554432) ranuras en la tabla hash de bloqueo, con un límite superior de 2 ^ 31 ranuras.

Para una aplicación dada se puede encontrar muy bien rendimiento total a ser mayor el uso de bloqueos de grano fino solamente. Como es fácil adivinar, todo depende de cómo la sobrecarga de gestión de bloqueo se compara con el potencial de bloqueo excesivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top