Di SQL Server, Anda dapat menggunakan ALTER PARTITION FUNCTION
untuk menggabungkan dua partisi menjadi satu partisi.
Untuk melakukannya, gunakan MERGE RANGE
argumen, sambil memberikan nilai batas partisi untuk dijatuhkan.
Operasi ini menghapus partisi dan menggabungkan nilai apa pun yang ada di partisi ke dalam partisi yang tersisa.
Contoh
Bayangkan kita memiliki lima partisi yang ingin kita jadikan empat.
Partisi Saat Ini
Kami memiliki fungsi partisi yang disebut MoviesPartitionFunction
dengan empat nilai batas.
SELECT
prv.boundary_id,
prv.[value]
FROM sys.partition_range_values prv
INNER JOIN sys.partition_functions pf
ON prv.function_id = pf.function_id
WHERE pf.name = 'MoviesPartitionFunction';
Hasil:
+---------------+---------+ | boundary_id | value | |---------------+---------| | 1 | -1 | | 2 | 100 | | 3 | 500 | | 4 | 10000 | +---------------+---------+
Ini berarti ada lima partisi.
Untuk contoh ini, kami akan menghapus rentang batas 500.
Juga, bayangkan kita sudah memiliki tabel dengan data yang didistribusikan di beberapa partisi ini.
Inilah cara baris saat ini didistribusikan di seluruh partisi.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Hasil:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 400 | | 4 | 3579 | | 5 | 0 | +--------------------+-------------+
Saya harus menunjukkan bahwa Microsoft sebenarnya menyarankan untuk tidak menggabungkan (atau memisahkan) partisi yang berisi data. Namun, untuk tujuan contoh ini, kami akan berhati-hati dan menggabungkan dua partisi yang berisi data.
Gabungkan Partisi
Oke, mari kita gabungkan partisi.
ALTER PARTITION FUNCTION MoviesPartitionFunction()
MERGE RANGE (500);
Hasil:
Commands completed successfully.
Kami berhasil menggabungkan partisi.
Periksa Hasilnya
Mari kita periksa hasilnya.
SELECT
prv.boundary_id,
prv.[value]
FROM sys.partition_range_values prv
INNER JOIN sys.partition_functions pf
ON prv.function_id = pf.function_id
WHERE pf.name = 'MoviesPartitionFunction';
Hasil:
+---------------+---------+ | boundary_id | value | |---------------+---------| | 1 | -1 | | 2 | 100 | | 3 | 10000 | +---------------+---------+
Seperti yang diharapkan, rentang batas 500 telah dijatuhkan, dan kita hanya memiliki tiga rentang batas.
Mari kita lihat bagaimana data didistribusikan di seluruh partisi.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Hasil:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 3979 | | 4 | 0 | +--------------------+-------------+
Sekali lagi seperti yang diharapkan, data dari partisi 3 dan 4 telah bergabung menjadi satu partisi (partisi 3).
Mengapa Memiliki Partisi Kosong?
Jika Anda bertanya-tanya mengapa saya memiliki partisi kosong di setiap ujungnya, ini dilakukan secara khusus untuk memfasilitasi pemisahan dan penggabungan partisi.
Membiarkan partisi tetap kosong di setiap ujungnya mencegah pergerakan data tak terduga yang mungkin Anda dapatkan saat memisahkan atau menggabungkan partisi.
Praktik ini juga direkomendasikan oleh Microsoft, untuk alasan ini.
Menggabungkan Partisi yang Mengandung Data
Seperti yang disebutkan, Microsoft merekomendasikan untuk tidak menggabungkan partisi yang sudah berisi data.
Memisahkan atau menggabungkan partisi yang terisi bisa menjadi tidak efisien. Mereka bisa menjadi tidak efisien karena pemisahan atau penggabungan dapat menyebabkan pembuatan log sebanyak empat kali lebih banyak, dan juga dapat menyebabkan penguncian yang parah.