He estado haciendo el curso MS10775A la semana pasada y surgió una pregunta que el entrenador no pudo responder de manera confiable es:
¿Un reindexar actualiza las estadísticas?
Encontramos discusiones en línea argumentando que sí y que no.
sql-server
index
sql-server-2012
index-tuning
statistics
Thor Erik
fuente
fuente
REINDEX
sí actualiza las estadísticas de columna como un efecto secundario de la reconstrucción del índice; no es necesario actualizar las estadísticas. Los datos en la tabla no cambian. Son los mismos datos, solo a) movió su ubicación en la bandeja giratoria (cuando se reorganiza una página), o b) se sentó en una página diferente (en el caso de una reconstrucción). Por lo tanto: una re-índice hace (algunos) las estadísticas de actualización: no hay necesidad de hacerlo.Respuestas:
Puede tener en cuenta lo siguiente al preocuparse por actualizar las estadísticas (copiado de Reconstruir índices frente a Actualizar estadísticas (Benjamin Nevarez)
Por defecto, la
UPDATE STATISTICS
declaración usa solo una muestra de registros de la tabla. El usoUPDATE STATISTICS WITH FULLSCAN
escaneará toda la tabla.Por defecto, la
UPDATE STATISTICS
declaración actualiza las estadísticas de índice y columna. El uso de laCOLUMNS
opción actualizará solo las estadísticas de columna. El uso de laINDEX
opción actualizará solo las estadísticas de índice.La reconstrucción de un índice , por ejemplo, mediante el uso
ALTER INDEX … REBUILD
también actualizará las estadísticas del índice con el equivalente de usar aWITH FULLSCAN
menos que la tabla esté particionada, en cuyo caso las estadísticas solo se muestrean (se aplica a SQL Server 2012 y versiones posteriores).Las estadísticas que se crearon manualmente usando
CREATE STATISTICS
no se actualizan por ningunaALTER INDEX ... REBUILD
operación, incluidaALTER TABLE ... REBUILD
.ALTER TABLE ... REBUILD
actualiza las estadísticas para el índice agrupado, si se define uno en la tabla que se está reconstruyendo.La reorganización de un índice , por ejemplo, el uso
ALTER INDEX … REORGANIZE
no actualiza ninguna estadística.La respuesta breve es que debe usar
UPDATE STATISTICS
para actualizar las estadísticas de columna y que una reconstrucción de índice actualizará solo las estadísticas de índice. Puede forzar una actualización de todas las estadísticas en una tabla, incluidas las estadísticas de índice y las estadísticas creadas manualmente, con laUPDATE STATISTICS (tablename) WITH FULLSCAN;
sintaxis.El siguiente código ilustra las reglas encapsuladas anteriormente:
Primero, crearemos una tabla con un par de columnas y un índice agrupado:
Esta consulta muestra la fecha en que cada objeto de estadísticas se actualizó por última vez:
Los resultados muestran que aún no se han realizado actualizaciones, lo cual es correcto desde que acabamos de crear la tabla:
Vamos a reconstruir toda la tabla y ver si eso actualiza las estadísticas:
Los resultados muestran que solo se actualizaron las estadísticas del índice agrupado .
A continuación, realizamos una
UPDATE STATS
operación discreta :Como puede ver, acabamos de actualizar las estadísticas en la
d
columna:Ahora, actualizaremos las estadísticas de toda la tabla:
Como puede ver, la única forma de asegurarse de que todas las estadísticas se actualicen es actualizar cada una manualmente o actualizar toda la tabla con
UPDATE STATISTICS (table);
.fuente
ALTER INDEX ... REBUILD
o unaUPDATE STATISTICS
declaración. Si se reconstruye la tabla, solo se actualizan las estadísticas de índice agrupadas. Para su información, una clave principal y un índice agrupado no son necesariamente compatibles con el mismo objeto de índice.La página de documentos de Microsoft para las estadísticas de SQL Server dice :
fuente