2009-05-22 9 views
25

estoy ejecutando la siguiente sentencia:¿Por qué estoy causando una actualización de índice agrupado?

UPDATE TOP(1) dbo.userAccountInfo 
SET   Flags = Flags | @AddValue 
WHERE   ID = @ID; 

La columna 'ID' es una PRIMARY KEY INT con limitaciones de identidad. Flags es un BIGINT NOT NULL.

La ruta de ejecución indica que se está produciendo una actualización de índice agrupado. Una operación muy costosa. No hay índices que cubran Flags o ID, a excepción de la clave principal. Siento que la ruta de ejecución real debe ser:

índice agrupado Seek => Modificar

+0

¿Está seguro de que el índice no está agrupando ni cubriendo el campo [Banderas]? –

+0

¿Qué hay con el TOP (1) en la consulta? – BradC

+0

@ Desconocido Google: Solo tengo un idx no agrupado en esta tabla. No afecta ID ni Indicadores. @ BradC: Es un poco verbosidad en mi declaración. "Esta declaración afectará exactamente a un usuario". Pero realmente no sirve para nada. – Kivin

Respuesta

27

Tablas son de dos tipos: los índices y montones en clúster. Tiene una restricción PRIMARY KEY, por lo que ha creado implícitamente un índice agrupado. Tendría que ir a una longitud extra durante la creación de la tabla para que no ocurra. Cualquier actualización de la 'tabla' es una actualización del índice agrupado, ya que el índice agrupado es la tabla. En cuanto a que la actualización del índice agrupado es una 'operación muy costosa', ahora esa es una leyenda urbana que rodea la información errónea sobre cómo funciona una base de datos. La declaración correcta es 'una actualización de índice agrupado que afecta la clave agrupada tiene que actualizar todos los índices no agrupados'.

+0

Es realmente una pena que haya tantas ... leyendas urbanas, como tú dices ... que rodean las RDB. He aplastado un puñado de ellos en las pocas semanas que he estado escribiendo SQL. ¿Puedo asumir con seguridad que, siempre que no actualice la ID, no causaré que ocurra una operación (potencialmente) extremadamente costosa en los datos agrupados? – Kivin

+2

sí, eso es correcto. – BradC

+5

Actualizar ID requeriría una actualización en * todos * otros índices. Actualizar cualquier otra columna que sea parte de un índice requeriría una actualización de esos índices. Una columna que no es parte de ningún índice (como clave o como columna contenida) no causaría ninguna actualización adicional. P. ej. si tiene un índice en Flags, entonces su actualización tendrá una actualización adicional para mantener ese índice también. No me preocuparía mucho sobre las actualizaciones a menos que la evidencia indique que una es mala. Muy a menudo las lecturas no optimizadas (escaneos) son el problema. Por cierto, ¿para qué sirve TOP (1)? ID es PK, ¿no es así? –

10

El índice agrupado es la tabla física, por lo que cada vez que actualice cualquier fila, va a actualizar el clúster índice.

Ver this MSDN article

+0

Siento que solo debería estar haciendo una actualización de índice agrupado si acepto la clave principal. Pero entiendo su punto. Creo que me han lavado el cerebro para pensar que las actualizaciones de índices agrupados son algo peligroso. – Kivin

+1

¿Alguna manera de evitar eso? – Serge

Cuestiones relacionadas