Si elimino mi PK agrupada y agrego una nueva, ¿en qué orden estarán mis filas?

Si elimino mi PK agrupada y agrego una nueva, ¿en qué orden estarán mis filas?

En SQL Server, estoy mirando la TablaA, que actualmente tiene una clave primaria agrupada de identificador único. El GUID no tiene significado en ningún contexto.

(Te daré un segundo para limpiar tu teclado y monitor y dejar el refresco).

Me gustaría eliminar esa clave principal y agregar una nueva clave principal entera única a la tabla. Mi pregunta es la siguiente: cuando elimino el índice, modifico la columna de identificador único a int y agrego la nueva clave primaria única agrupada a la columna modificada, ¿los nuevos valores PK estarán en el orden de inserción en la tabla, o estarán? ¿Estar en algún otro orden? ¿Es este el camino correcto a seguir aquí? esto funcionara? (Soy una especie de novato con respecto a la creación/modificación de tablas).

Respuesta1

Cuando elimina un índice agrupado, la tabla se convierte en un montón. Dado que los montones tienen una estructura física muy diferente a la de los índices, los datos deberán copiarse en la nueva estructura. Los montones no tienen orden alguno. Cuando vuelva a agregar un nuevo índice agrupado, los datos se copiarán del montón al nuevo índice y el orden lo definirá la nueva clave agrupada.

Si desea conservar el orden existente, todo lo que tiene que hacer es asignar los nuevos identificadores enteros correctamente:

ALTER TABLE Table ADD Integer_Id INT;
GO

WITH cte AS (
  SELECT ROW_NUMBER() OVER (ORDER BY Guid_Id) as RowOrderByGuid,
    Guid_Id
  FROM Table)
UPDATE t
  SET t.Integer_Id = c.RowOrderByGuid
FROM Table t
JOIN cte c ON t.Guid_Id = c.Guid_Id;

Ahora el orden de Integer_Ids coincidirá con el orden de Guids. Puede eliminar la columna Guid y agregar un índice agrupado en la nueva columna Integer y se conservará el orden físico de los registros.

Respuesta2

Por definición, un índice agrupado impone un orden físico en las páginas de datos reales; entonces, sí, si elimina un índice agrupado y crea uno nuevo, esto forzará una reordenación física de los datos.

En su caso, creo que es seguro asumir que sucederá lo siguiente:

  • El índice agrupado existente se eliminará, pero los datos reales en el disco no se moverán debido a esto.
  • Modificará el tipo de columna (o eliminará la columna existente y creará una nueva), estableciendo restricciones de costo para que no sea nula, única, clave primaria, identidad y autoincremental (esto es vital, o SQL Server ni siquiera le permitirá agréguelo porque no sabría qué ponerle).
  • En este punto, SQL Server completará automáticamente la columna. No sé con certeza qué pasará aquí, peropensarse completará en el orden en que las filas se almacenen físicamente en la base de datos. Pero sólo estoy adivinando sobre esto.
  • El problema es que realizar pedidos puede ser bastante complicado cuando se trata de UID; por lo que no sabes cómo se almacenan realmente los datos ahora y no sabes cómo se almacenarán más adelante; Si mis conjeturas sobre la población de columnas son correctas, no habrá un gran reordenamiento... pero podría suceder; e, incluso si estoy en lo cierto, la creación del índice llevará algún tiempo, si la tabla es lo suficientemente grande.

En pocas palabras: ustedvoluntadtener un gran impacto, y ustedpodríaobtenga filas de un SELECT desordenado en el mismo orden en que las obtiene ahora. Tendrás que intentarlo.

Respuesta3

Un índice agrupado, por definición, determina el orden físico de los datos, por lo que cuando cree el nuevo índice agrupado, los datos se reordenarán; Si es una mesa grande, planee que esto tome un tiempo.

Respuesta4

Si crea una tabla con una clave primaria agrupada y luego descarta la PK agrupada, el orden físico de los datos en la tabla no se alterará. Sin embargo, no se garantiza que el orden físico de los resultados de la consulta sea el mismo que el orden en la tabla, por lo que este orden no tiene prácticamente sentido.

Si luego agrega una columna de números enteros y crea una clave primaria agrupada en ella, la tabla se reorganizará en cualquier orden en que se clasifique la clave. Este puede ser o no el mismo orden físico que el GUID dependiendo de cómo se asigne la clave. Puede asignarlo explícitamente según el orden de clasificación de la clave GUID (por ejemplo, usando número_fila() en lugar del orden de claves anterior), o puede asignarlo de otra manera. A menos que tome medidas para garantizar que el orden sea explícitamente el mismo, no se garantiza que el orden físico o las filas de la tabla impulsen el orden de su nueva clave.

información relacionada