¿Alguien podría explicar de manera sencilla por qué es necesaria una escalada de bloqueo y qué es lo que se conoce como bloqueo de cabecera, por favor?
Cuando actualiza una tabla y bloquea una fila, necesita registrar este hecho de alguna manera: esa es una fila, se ha actualizado y bloqueado.
Al actualizar millones de filas, debe hacer esto un millón de veces y, por lo tanto, tener espacio para mantener un millón de bloqueos.
SQL Server mantiene una lista de bloqueos en la memoria, mientras que Oracle lo hace en los espacios de tablas.
Esto es probablemente porque Oracle es viejo (más viejo que yo), y SQL Server es joven en comparación con Oracle.
Mantener los recursos temporales (como los bloqueos) en un almacenamiento permanente no es una solución tan obvia desde el punto de vista del diseñador. Solo una cosa para mencionar: es posible que necesite una escritura de disco para realizar un SELECT FOR UPDATE
.
Las funciones principales de Oracle se desarrollaron a principios de los 80, cuando guardar cosas en la memoria no era una opción.Simplemente tenían para usar espacio de disco de alguna manera.
Si el espacio en disco fuera a usarse de todos modos, tenía que colocar un bloqueo en algún lugar del disco.
¿Y dónde guardar un candado para una fila si no está dentro de la misma fila?
Los desarrolladores del sistema de bloqueo de SQL Server, al inventar el diseño de su RDBMS llamado Sybase, decidieron almacenar cosas temporales (es decir, bloqueos) en el almacenamiento temporal (es decir, RAM).
Pero el diseño de Oracle es siempre equilibrada: si tiene un 1.000.000 de filas de la base de datos, entonces usted tiene un espacio de almacenamiento para 1.000.000 de cerraduras, si usted tiene mil millones de filas, puede almacenar mil millones de cerraduras, etc.
El diseño de SQL Server es flawy en este sentido, porque su espacio de RAM y HDD puede estar desequilibrado. Puede tener fácilmente 16M de RAM y varios terabytes de espacio en disco. Y tu memoria simplemente no puede contener todos los bloqueos.
Es por eso que cuando el recuento de bloqueo alcanza un cierto límite, SQL Server decide escalar las cerraduras: en lugar de mantener las cerraduras para, por ejemplo, 10 filas individuales en una página de datos (que requiere 10 registros), se bloquea toda la información página (que requiere 1 registro).
Oracle, por otra parte, al actualizar una fila, simplemente escribe el bloqueo directamente en la página de datos.
Es por eso que los bloqueos de Oracle son de nivel de fila.
Oracle no "administra" las cerraduras en un sentido común de la palabra: no puede, por ejemplo, obtener una lista de páginas bloqueadas en Oracle.
Cuando una transacción necesita actualizar una fila, solo va a la fila y ve si está bloqueada.
Si es así, busca qué transacción contiene un bloqueo (esta información se encuentra dentro del descriptor de bloqueo en la página de datos) y se agrega a la cola de notificaciones de esa transacción: cuando las transacciones de bloqueo fallecen, la original se notifica y bloquea los datos.
Desde el punto de vista de la concurrencia, la escalada de bloqueo es una solución totalmente pobre: no agrega nada a la concurrencia. Puede, por ejemplo, obtener un candado en una fila que ni siquiera tocó.
Desde el punto de vista del rendimiento, hacer cosas en la memoria es, por supuesto, más rápido que hacerlo en el disco.
Pero dado que Oracle almacena en caché los bloques de datos y las operaciones reales descritas anteriormente se realizan de todos modos en la memoria, el rendimiento es el mismo o está próximo.
Todavía creo que más bloqueos mejorarán la concurrencia, lo que mejorará el rendimiento general del sistema. Merece la pena utilizar más memoria y lógicas más complejas en el código, si la simultaneidad y el rendimiento del sistema general son mejores. Apreciar si puede mostrar muestras o más descripciones, ¿por qué cree que la gestión de más bloqueos es por encima? ¿Quizás te refieres a que el rendimiento general del sistema es peor si hay más bloqueos? Se aprecian más descripciones. – George2
Gracias por sus comentarios, ¿así que el punto que usa más bloqueos siempre mejorará la simultaneidad? ¿O el punto que usa más bloqueos siempre mejorará el rendimiento? – George2
Gracias por sus comentarios actualizados, Quassnoi! Estoy interesado en su comparación entre SQL y Oracle. Mencionó los implementos de SQL en la lista vinculada en la memoria y Oracle está utilizando la página de datos. Creo que el rendimiento de ellos debería ser muy similar: ambos se retransmiten en paginación del sistema operativo para gestionar el intercambio de memoria/disco de forma automática. ¿Por qué dices que Oracle es superior a SQL? Más descripciones :-) – George2