sql >> Base de Datos >  >> RDS >> Sqlserver

Comprimir una partición específica dentro de una tabla en SQL Server (T-SQL)

Cuando comprime una tabla particionada en SQL Server, puede comprimir todas las particiones, algunas o solo una partición.

Para hacer esto, use el REBUILD PARTITION sintaxis dentro de ALTER TABLE declaración.

Al hacer esto, puede reconstruir solo la partición especificada o todas las particiones. Alternativamente, puede reconstruir todas las particiones, mientras comprime solo una partición específica o una lista de particiones.

Ejemplo 1:reconstrucción de una partición

En este primer ejemplo, reconstruimos y comprimimos solo una partición en la tabla.

Estimación del ahorro de compresión

Imagina que queremos comprimir una sola partición en una tabla llamada Movies .

Primero, podemos usar el sp_estimate_data_compression_savings procedimiento almacenado del sistema para estimar el ahorro que obtendríamos al comprimir la tabla.

EXEC sp_estimate_data_compression_savings 
    @schema_name = 'dbo', 
    @object_name = 'Movies', 
    @index_id = NULL, 
    @partition_number = 3, 
    @data_compression = 'ROW';

Resultado (usando salida vertical):

object_name                                        | Movies
schema_name                                        | dbo
index_id                                           | 1
partition_number                                   | 3
size_with_current_compression_setting(KB)          | 120
size_with_requested_compression_setting(KB)        | 88
sample_size_with_current_compression_setting(KB)   | 128
sample_size_with_requested_compression_setting(KB) | 96

Según sp_estimate_data_compression_savings , el tamaño de la partición debería reducirse de 120 KB a 88 KB una vez que la hayamos comprimido.

Comprimir la partición

Avancemos y comprimámoslo.

ALTER TABLE Movies
REBUILD PARTITION = 3 WITH (DATA_COMPRESSION = ROW);

En este caso usé compresión de filas.

Verificar los ahorros de compresión

Ahora, si consultamos sp_estimate_data_compression_savings de nuevo, veremos que el tamaño actual ahora es exactamente como se estimó anteriormente (88 KB).

EXEC sp_estimate_data_compression_savings 
    @schema_name = 'dbo', 
    @object_name = 'Movies', 
    @index_id = NULL, 
    @partition_number = 3, 
    @data_compression = 'NONE';

Resultado (usando salida vertical):

object_name                                        | Movies
schema_name                                        | dbo
index_id                                           | 1
partition_number                                   | 3
size_with_current_compression_setting(KB)          | 88
size_with_requested_compression_setting(KB)        | 112
sample_size_with_current_compression_setting(KB)   | 96
sample_size_with_requested_compression_setting(KB) | 128

En este ejemplo, obtengo una estimación de los requisitos de espacio si tuviera que eliminar la compresión (es decir, establecerla en NONE) ).

Verificar qué particiones usan compresión

También podemos usar las sys.partitions ver para verificar que la partición tiene compresión.

SELECT
    [partition_number],
    [data_compression],
    [data_compression_desc]
FROM sys.partitions
WHERE object_id = OBJECT_ID('Movies');

Resultado:

+--------------------+--------------------+-------------------------+
| partition_number   | data_compression   | data_compression_desc   |
|--------------------+--------------------+-------------------------|
| 1                  | 0                  | NONE                    |
| 2                  | 0                  | NONE                    |
| 4                  | 0                  | NONE                    |
| 3                  | 1                  | ROW                     |
+--------------------+--------------------+-------------------------+

Eliminar compresión

Antes de pasar al ejemplo 2, eliminemos la compresión de la partición.

ALTER TABLE Movies
REBUILD PARTITION = 3 WITH (DATA_COMPRESSION = NONE);

Ejemplo 2:comprimir varias particiones

En este ejemplo, reconstruimos todas las particiones, pero especificamos solo las particiones que queremos comprimir.

Este es un método alternativo a nuestro primer ejemplo. Usando esta sintaxis, podemos especificar una lista de particiones para comprimir.

ALTER TABLE Movies
REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = ROW ON PARTITIONS(2,3));

En este caso, reconstruí todas las particiones, pero solo comprimí las particiones 2 y 3.

Nuevamente, podemos usar sys.partitions para verificar que fueron comprimidos.

SELECT
    [partition_number],
    [data_compression],
    [data_compression_desc]
FROM sys.partitions
WHERE object_id = OBJECT_ID('Movies');

Resultado:

+--------------------+--------------------+-------------------------+
| partition_number   | data_compression   | data_compression_desc   |
|--------------------+--------------------+-------------------------|
| 1                  | 0                  | NONE                    |
| 2                  | 1                  | ROW                     |
| 3                  | 1                  | ROW                     |
| 4                  | 0                  | NONE                    |
+--------------------+--------------------+-------------------------+