Когато компресирате разделена таблица в SQL Server, можете да компресирате всички дялове, някои или само един дял.
За да направите това, използвайте REBUILD PARTITION
синтаксис в ALTER TABLE
изявление.
Когато правите това, можете да възстановите само посочения дял или всички дялове. Като алтернатива можете да изградите отново всички дялове, като същевременно компресирате само конкретен дял или списък с дялове.
Пример 1 – Възстановяване на един дял
В този първи пример ние възстановяваме и компресираме само един дял в таблицата.
Оценка на спестяванията от компресия
Представете си, че искаме да компресираме един дял в таблица, наречена Movies
.
Първо, можем да използваме sp_estimate_data_compression_savings
системна съхранена процедура за оценка на спестяванията, които бихме получили от компресирането на таблицата.
EXEC sp_estimate_data_compression_savings
@schema_name = 'dbo',
@object_name = 'Movies',
@index_id = NULL,
@partition_number = 3,
@data_compression = 'ROW';
Резултат (с помощта на вертикален изход):
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
Според sp_estimate_data_compression_savings
, размерът на дяла трябва да намалее от 120 KB на 88 KB, след като го компресираме.
Компресирайте дяла
Да продължим и да го компресираме.
ALTER TABLE Movies
REBUILD PARTITION = 3 WITH (DATA_COMPRESSION = ROW);
В този случай използвах компресия на редове.
Проверете спестяванията от компресия
Сега, ако потърсим sp_estimate_data_compression_savings
отново ще видим, че сегашният размер е точно както беше оценен преди (88 KB).
EXEC sp_estimate_data_compression_savings
@schema_name = 'dbo',
@object_name = 'Movies',
@index_id = NULL,
@partition_number = 3,
@data_compression = 'NONE';
Резултат (с помощта на вертикален изход):
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
В този пример получавам оценка на изискванията за пространство, ако трябва да премахна компресията (т.е. да я задам на NONE
).
Проверете кои дялове използват компресия
Можем също да използваме sys.partitions
преглед, за да проверите дали дялът има компресия.
SELECT
[partition_number],
[data_compression],
[data_compression_desc]
FROM sys.partitions
WHERE object_id = OBJECT_ID('Movies');
Резултат:
+--------------------+--------------------+-------------------------+ | partition_number | data_compression | data_compression_desc | |--------------------+--------------------+-------------------------| | 1 | 0 | NONE | | 2 | 0 | NONE | | 4 | 0 | NONE | | 3 | 1 | ROW | +--------------------+--------------------+-------------------------+
Премахване на компресията
Преди да преминем към пример 2, нека премахнем компресията от дяла.
ALTER TABLE Movies
REBUILD PARTITION = 3 WITH (DATA_COMPRESSION = NONE);
Пример 2 – Компресиране на множество дялове
В този пример ние изграждаме отново всички дялове, но указваме само дяловете, които искаме да бъдат компресирани.
Това е алтернативен метод на нашия първи пример. Използвайки този синтаксис, можем да посочим списък с дялове за компресиране.
ALTER TABLE Movies
REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = ROW ON PARTITIONS(2,3));
В този случай възстанових всички дялове, но компресирах само дялове 2 и 3.
Отново можем да използваме sys.partitions
за да проверите дали са компресирани.
SELECT
[partition_number],
[data_compression],
[data_compression_desc]
FROM sys.partitions
WHERE object_id = OBJECT_ID('Movies');
Резултат:
+--------------------+--------------------+-------------------------+ | partition_number | data_compression | data_compression_desc | |--------------------+--------------------+-------------------------| | 1 | 0 | NONE | | 2 | 1 | ROW | | 3 | 1 | ROW | | 4 | 0 | NONE | +--------------------+--------------------+-------------------------+