Tengo una tabla de almacenamiento dinámico que ocupa alrededor de 104 GB de espacio en disco con casi 3 mil millones de filas. Estoy tratando de crear un índice agrupado en esta tabla en la WeekEndingDate
columna [ ]. Tengo alrededor de 200 gb's gratis en el archivo de datos y alrededor de 280 gb's gratis en el tempdb.
He intentado dos métodos diferentes. Primero fue crear el índice directamente en la tabla con el siguiente comando:
CREATE CLUSTERED INDEX CX_WT_FOLD_HISTORY
ON WT_FOLD_HISTORY (WeekEndingDate ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = ON,
IGNORE_DUP_KEY = OFF
, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON,
DATA_COMPRESSION = PAGE)
Lo intenté con SORT_IN_TEMPDB = ON
y OFF
. Al usarlo ON
, llenaba el tempdb y con OFF
él llenaba la unidad de datos.
Otro método era crear una nueva tabla en blanco con el índice necesario y luego insertar los registros del montón en la nueva tabla. Esto también falló después de llenar la unidad de datos.
Cualquier otra sugerencia sobre qué hacer. La mayoría de las cosas que he leído indican que necesitaría aproximadamente 1,2 veces el tamaño de la tabla para usarla como espacio de trabajo al crear el índice. Tengo mucho más que eso y todavía falla. Cualquier sugerencia sera apreciada.
Aquí está mi estructura de tabla de montón original:
CREATE TABLE [dbo].[WT_FOLD_HISTORY](
[WeekEndingDate] [varchar](50) NULL,
[Division] [varchar](50) NULL,
[Store] [varchar](50) NULL,
[SKUNumber] [varchar](50) NULL,
[UPC] [varchar](50) NULL,
[SalesUnits] [varchar](50) NULL,
[SalesCost] [varchar](50) NULL,
[SalesRetail] [varchar](50) NULL,
[InventoryUnits] [varchar](50) NULL,
[InventoryCost] [varchar](50) NULL,
[InventoryRetail] [varchar](50) NULL,
[OnOrderUnits] [varchar](50) NULL,
[OnOrderCost] [varchar](50) NULL,
[OnOrderRetail] [varchar](50) NULL,
[ReceiptUnits] [varchar](50) NULL,
[ReceiptCost] [varchar](50) NULL,
[ReceiptRetail] [varchar](50) NULL,
[PermanentMarkdowns] [varchar](50) NULL,
[ReturnsToVendor] [varchar](50) NULL,
[POSMarkdowns] [varchar](50) NULL,
[TimeFK] [smallint] NULL,
[LocationFK] [int] NULL,
[ItemFK] [int] NULL
) ON [AcademySports_DataFG1]
fuente
DATA_COMPRESSION=NONE
? Si eso funciona, podría comprimir después.Respuestas:
Si tiene una necesidad a corto plazo de espacio en disco, una opción sería:
NOTA: como otros han sugerido, solo haría esto después de cosas como eliminar temporalmente los índices no agrupados de la tabla en cuestión. Esto en particular permitirá que la adición del índice agrupado vaya más rápido, ya que los índices no agrupados tendrían que reconstruirse de todos modos (con un índice agrupado en su lugar, la clave de índice se usa para ubicar las filas en la tabla misma) .
Ese es en realidad otro punto: ¿qué tan ancha es la clave en el índice agrupado? Si tiene índices no agrupados, y la clave en el índice agrupado es significativamente más ancha que el puntero en el montón, entonces los índices no agrupados consumirán más espacio después de crear el índice agrupado.
Si la clave del clúster consta de varias columnas, o incluso una columna grande (por ejemplo, una
varchar
columna con una longitud promedio de 25 o más), es posible que desee considerar una clave sustituta en su lugar (generalmente un valor monotónicamente creciente, para un mejorINSERT
rendimiento.fuente
Lo que está llenando su espacio es su megaclasificación (intenta ordenar todos sus 104Gb en conjunto), por lo que creo que se puede resolver haciendo la clasificación en porciones más pequeñas. Le sugiero que cree la nueva tabla agrupada e inserte los datos en pequeños fragmentos como este:
De esta forma, solo ordena 5000 filas a la vez y el único problema son las divisiones de página que no se pueden evitar ya que no realiza una inserción ordenada. Entonces, cuando termine, new_clustered_table se fragmentará pero puede reconstruirlo después.
fuente
Solo un consejo rápido: considere eliminar todos los índices no agrupados (si los hay) en este montón antes de intentar crear el Índice agrupado. Puede crear un script para aquellos que no son CI junto con sus detalles de columnas de inclusión y crearlos más tarde con esas definiciones después de que el Índice agrupado se haya creado correctamente.
fuente