Když komprimujete rozdělenou tabulku na SQL Server, můžete komprimovat všechny oddíly, některé nebo pouze jeden oddíl.
Chcete-li to provést, použijte REBUILD PARTITION
syntaxe v ALTER TABLE
prohlášení.
Když to uděláte, můžete znovu sestavit pouze určený oddíl nebo všechny oddíly. Případně můžete znovu sestavit všechny oddíly a přitom zkomprimovat pouze konkrétní oddíl nebo seznam oddílů.
Příklad 1 – Znovu sestavit jeden oddíl
V tomto prvním příkladu znovu sestavíme a zkomprimujeme pouze jeden oddíl v tabulce.
Odhadněte úspory komprese
Představte si, že chceme zkomprimovat jeden oddíl v tabulce s názvem Movies
.
Nejprve můžeme použít sp_estimate_data_compression_savings
systémová uložená procedura k odhadu úspor, které bychom získali komprimací tabulky.
EXEC sp_estimate_data_compression_savings
@schema_name = 'dbo',
@object_name = 'Movies',
@index_id = NULL,
@partition_number = 3,
@data_compression = 'ROW';
Výsledek (při použití vertikálního výstupu):
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
Podle sp_estimate_data_compression_savings
, velikost oddílu by se měla zmenšit ze 120 KB na 88 KB, jakmile jej zkomprimujeme.
Komprimujte oddíl
Pojďme to zkomprimovat.
ALTER TABLE Movies
REBUILD PARTITION = 3 WITH (DATA_COMPRESSION = ROW);
V tomto případě jsem použil kompresi řádků.
Ověřte kompresní úspory
Nyní, když se zeptáme na sp_estimate_data_compression_savings
opět uvidíme, že aktuální velikost je nyní přesně taková, jaká byla dříve odhadována (88 kB).
EXEC sp_estimate_data_compression_savings
@schema_name = 'dbo',
@object_name = 'Movies',
@index_id = NULL,
@partition_number = 3,
@data_compression = 'NONE';
Výsledek (při použití vertikálního výstupu):
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
V tomto příkladu získávám odhad prostorových požadavků, pokud bych měl odstranit kompresi (tj. nastavit ji na NONE
).
Ověřte, které oddíly používají kompresi
Můžeme také použít sys.partitions
zobrazit, abyste ověřili, že oddíl má kompresi.
SELECT
[partition_number],
[data_compression],
[data_compression_desc]
FROM sys.partitions
WHERE object_id = OBJECT_ID('Movies');
Výsledek:
+--------------------+--------------------+-------------------------+ | partition_number | data_compression | data_compression_desc | |--------------------+--------------------+-------------------------| | 1 | 0 | NONE | | 2 | 0 | NONE | | 4 | 0 | NONE | | 3 | 1 | ROW | +--------------------+--------------------+-------------------------+
Odstranit kompresi
Než přejdeme k příkladu 2, odeberme kompresi z oddílu.
ALTER TABLE Movies
REBUILD PARTITION = 3 WITH (DATA_COMPRESSION = NONE);
Příklad 2 – Komprimace více oddílů
V tomto příkladu znovu sestavíme všechny oddíly, ale určíme pouze oddíly, které chceme komprimovat.
Toto je alternativní metoda k našemu prvnímu příkladu. Pomocí této syntaxe můžeme specifikovat seznam oddílů ke komprimaci.
ALTER TABLE Movies
REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = ROW ON PARTITIONS(2,3));
V tomto případě jsem přestavěl všechny oddíly, ale zkomprimoval jsem pouze oddíly 2 a 3.
Opět můžeme použít sys.partitions
abyste ověřili, že byly komprimovány.
SELECT
[partition_number],
[data_compression],
[data_compression_desc]
FROM sys.partitions
WHERE object_id = OBJECT_ID('Movies');
Výsledek:
+--------------------+--------------------+-------------------------+ | partition_number | data_compression | data_compression_desc | |--------------------+--------------------+-------------------------| | 1 | 0 | NONE | | 2 | 1 | ROW | | 3 | 1 | ROW | | 4 | 0 | NONE | +--------------------+--------------------+-------------------------+