2010-11-27 14 views
11

Esta es la pregunta del Servidor SQL pero agradecería las respuestas de otros contextos DBMS identificados correctamente.¿ACTUALIZACIÓN = ELIMINAR (marcado como) + INSERTAR?

La respuesta por Seth Lynch a mi pregunta en el foro de MSDN:

dice:

"Cuando se actualizan los datos no es más escrito - el original la fila se marca como eliminada y se inserta una nueva fila "

¿Es la declaración correcta? ¿Puedes dar referencias que apoyen esto en los documentos?
¿Cómo se puede verificar?

discusiones relacionadas:

Actualización: No hace mucho tiempo creí que las lecturas sucias permitido en LEER nivel de aislamiento de transacción no confirmada (o, lo que es lo mismo en SQL Server, a través CON (NOLOCK) sugerencia) lectura permitida (de otras transacciones) valores no confirmados (o comprometidos, si aún no se han modificado) pero no parcialmente cambiados (parcialmente actualizados, parcialmente eliminados o parcialmente insertados.

RESUME ': resumiendo, esa frase es generalmente incorrecta y en la mayoría de los casos (mientras se declara categóricamente sobre casos poco comunes en SQL Server)

+0

que actualizaría los campos AUTO_INCREMENT? –

Respuesta

9

De acuerdo con Kalen Delaney, en su libro Inside Microsoft SQL Server 2005: The Storage Engine, SQL Server 2005 (y ahora 2008) puede actualizar una fila mediante el uso de una inserción/eliminación o en su lugar, simplemente cambiando el valor de una columna. Aquí hay un resumen rápido de lo que dice en la p. 306-311 del libro.

El comportamiento normal en SQL Server 2005/2008 es actualizar una fila en su lugar. La fila permanece en la misma ubicación en la página y solo se modifican los bytes afectados. Un ejemplo de esto sería actualizar el valor en una columna entera que no forme parte del índice acelerado.

Una fila puede actualizarse con una inserción/eliminación cuando cambia de tamaño y ya no cabe en la página original. Esto podría suceder cuando cambie el valor en una columna varchar y lo haga más largo. También sucede cuando la columna de índice agrupado está cambiando y la fila necesita moverse debido a su posición en el índice (porque las filas están ordenadas por la clave agrupada). Un ejemplo de esto sería cambiar el apellido de alguien de "Smith" a "Jones" en una tabla con un índice agrupado sobre el apellido.

2

Esto depende de la implementación.

En general, cuando se utiliza el control de consor- rencia multiversión (MVCC), se conserva la fila original. Se marca como borrado por la transacción que lo eliminó y se crea una fila de reemplazo, o un delta se almacena en otro lugar en el contexto de la transacción, hasta que la transacción se compromete y el delta se aplica a la fila existente.

En el control de concurrencia basado en bloqueo, la fila se puede cambiar in situ ya que solo una transacción puede leer y escribir la fila.

Los detalles dependen de la implementación. Algunos sistemas usarán un delta hasta la confirmación, y algunos cambiarán la fila pero conservarán una copia del original para usar en caso de reversión.

+0

¿Cuál es su referencia? En su discusión de cambios en su lugar (p 309). Delaney escribe: ". Además, el registro contendrá un registro único para cada uno de tales fila actualizada a menos que la tabla tiene un desencadenador de actualización en él o se marca para la replicación en estos casos, la actualización aún ocurre en su lugar, pero el registro contendrá un registro de eliminación seguido de un registro de inserción ". – DataWriter

+0

¿Estás hablando de Oracle, Fredt? – DataWriter

+0

Referencias "Database Management Systems" tercera edición, Ramakrishnan, Gehrke e "Una Introducción a los Sistemas de Bases de Datos" octava edición, C.J. Date. Me temo que no tengo una referencia de página, y como dije, depende de la implementación y puede haber otras implementaciones. – fredt

1

En Oracle, un UPDATE siempre cambia la fila original. Los valores anteriores de la fila se escriben en el registro UNDO y permanecen allí por algún tiempo como parte de la implementación del control de concurrencia multiversión (MVCC).

Mientras los nuevos valores no están comprometidos, todas las demás transacciones obtendrá los viejos valores del registro de DESHACER. Lo mismo ocurre si su consulta se inició antes del COMPROMISO de los nuevos valores o con ciertos modos de aislamiento de transacción.

Si los nuevos valores son más grandes y la fila no encaja en la misma página más, la fila se migra a una nueva página y el espacio en la página de edad se libera.

+0

"En Oracle, una ACTUALIZACIÓN siempre cambia la fila original" incluso si las columnas clave de un índice agrupado están ACTUALIZADAS? –

+0

Su derecho. Esa es la excepción a la regla. – Codo

Cuestiones relacionadas