SQL Server mendukung tabel dan indeks yang dipartisi. Ketika tabel atau indeks yang dipartisi dipartisi, datanya dibagi menjadi unit-unit yang dapat tersebar di lebih dari satu grup file.
Oleh karena itu, untuk membuat tabel yang dipartisi di SQL Server, Anda harus terlebih dahulu membuat filegroup/s yang akan menampung setiap partisi. Anda juga perlu membuat fungsi partisi dan skema partisi.
Jadi begini:
- Buat grup file
- Buat fungsi partisi
- Buat skema partisi
- Buat tabel yang dipartisi
Di bawah ini adalah contoh penggunaan langkah-langkah ini untuk membuat tabel dengan empat partisi.
Buat Filegroups
Pertama, kami menambahkan empat grup file ke database yang disebut Uji , lalu tentukan file fisik untuk setiap grup file tersebut.
ALTER DATABASE Test
ADD FILEGROUP MoviesFg1;
GO
ALTER DATABASE Test
ADD FILEGROUP MoviesFg2;
GO
ALTER DATABASE Test
ADD FILEGROUP MoviesFg3;
GO
ALTER DATABASE Test
ADD FILEGROUP MoviesFg4;
ALTER DATABASE Test
ADD FILE
(
NAME = MoviesFg1dat,
FILENAME = '/var/opt/mssql/data/MoviesFg1dat.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP MoviesFg1;
ALTER DATABASE Test
ADD FILE
(
NAME = MoviesFg2dat,
FILENAME = '/var/opt/mssql/data/MoviesFg2dat.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP MoviesFg2;
GO
ALTER DATABASE Test
ADD FILE
(
NAME = MoviesFg3dat,
FILENAME = '/var/opt/mssql/data/MoviesFg3dat.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP MoviesFg3;
GO
ALTER DATABASE Test
ADD FILE
(
NAME = MoviesFg4dat,
FILENAME = '/var/opt/mssql/data/MoviesFg4dat.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP MoviesFg4;
GO
Anda harus mengubah kode ini, tergantung pada kebutuhan Anda. Anda juga harus mengubah jalur file agar sesuai dengan lingkungan Anda. Misalnya, jika Anda menggunakan Windows, jalur Anda mungkin lebih mirip D:\mssql\data\MoviesFg4dat.ndf
.
Juga, jika Anda membutuhkan lebih banyak partisi, tambahkan lebih banyak grup file di sini. Sebaliknya, jika Anda membutuhkan lebih sedikit partisi, tentukan lebih sedikit grup file di sini.
Buat Fungsi Partisi
Selanjutnya kita membuat fungsi partisi bernama MoviesPartitionFunction yang akan mempartisi tabel menjadi empat partisi.
CREATE PARTITION FUNCTION MoviesPartitionFunction (int)
AS RANGE LEFT FOR VALUES (1, 100, 1000);
GO
int part menentukan tipe data kolom yang digunakan untuk mempartisi.
Semua tipe data valid untuk digunakan sebagai kolom partisi, kecuali teks , nteks , gambar , xml , stempel waktu , varchar(maks) , nvarchar(maks) , varbinary(maks) , tipe data alias, atau tipe data yang ditentukan pengguna CLR.
Di sini, saya menggunakan tiga nilai batas (1, 100
, dan 1000
) untuk menentukan empat partisi. Nilai batas ini harus cocok atau secara implisit dapat dikonversi ke tipe data yang ditentukan dalam tanda kurung setelah nama fungsi partisi.
Mengingat nilai batas ini, dan fakta bahwa saya menetapkan RANGE LEFT
partisi, keempat partisi akan menyimpan nilai seperti yang ditentukan dalam tabel berikut.
Partisi | Nilai |
---|---|
1 | <= 1 |
2 | > 1 DAN <= 100 |
3 | > 100 DAN <=1000 |
4 | > 1000 |
Jika saya telah menentukan RANGE RIGHT
partisi, perinciannya akan sedikit berbeda, seperti diuraikan dalam tabel berikut.
Partisi | Nilai |
---|---|
1 | < 1 |
2 | >= 1 DAN < 100 |
3 | >= 100 DAN < 1000 |
4 | >= 1000 |
Konsep yang sama berlaku jika kolom partisi menggunakan tipe data lain, seperti nilai tanggal/waktu.
Buat Skema Partisi
Selanjutnya kita perlu membuat skema partisi.
Skema partisi memetakan partisi tabel atau indeks yang dipartisi ke grup file baru.
Dalam kasus kami, kodenya akan terlihat seperti ini:
CREATE PARTITION SCHEME MoviesPartitionScheme
AS PARTITION MoviesPartitionFunction
TO (MoviesFg1, MoviesFg2, MoviesFg3, MoviesFg4);
GO
Perhatikan bahwa kita mereferensikan fungsi partisi yang kita buat pada langkah sebelumnya. Kami juga mereferensikan grup file yang kami buat di langkah pertama.
Buat Tabel yang Dipartisi
Akhirnya kita bisa membuat tabel yang dipartisi.
CREATE TABLE Movies (
MovieId int IDENTITY PRIMARY KEY,
MovieName varchar(60)
)
ON MoviesPartitionScheme (MovieId);
GO
Satu-satunya perbedaan antara ini dan membuat tabel yang tidak dipartisi adalah bahwa saat membuat tabel yang dipartisi, kami menggunakan ON
argumen untuk menentukan skema partisi yang akan digunakan. Dalam kasus kami, kami menentukan skema partisi yang kami buat di langkah sebelumnya, dan menentukan MovieId kolom sebagai kolom partisi.
Anda akan melihat bahwa MovieId kolom memiliki tipe data int , yang cocok dengan nilai batas yang kita tentukan saat membuat fungsi partisi.
Perhatikan bahwa jika Anda menggunakan kolom yang dihitung dalam fungsi partisi, kolom tersebut harus secara eksplisit ditandai PERSISTED
.
Periksa Fungsi Partisi
Anda dapat menggunakan sys.partition_functions
view untuk mengembalikan semua fungsi partisi.
SELECT * FROM sys.partition_functions;
Hasil (menggunakan keluaran vertikal):
name | MoviesPartitionFunction function_id | 65536 type | R type_desc | RANGE fanout | 4 boundary_value_on_right | 0 is_system | 0 create_date | 2020-10-10 05:37:41.330 modify_date | 2020-10-10 05:37:41.330
Periksa Skema Partisi
Anda dapat menggunakan sys.partition_schemes
untuk memeriksa skema partisi.
SELECT * FROM sys.partition_schemes;
Hasil (menggunakan keluaran vertikal):
name | MoviesPartitionScheme data_space_id | 65601 type | PS type_desc | PARTITION_SCHEME is_default | 0 is_system | 0 function_id | 65536
Atau, Anda dapat menggunakan kueri berikut untuk menampilkan detail lainnya, seperti skema, tabel, indeks, dll.
SELECT
object_schema_name(i.object_id) AS [Schema],
object_name(i.object_id) AS [Object],
i.name AS [Index],
s.name AS [Partition Scheme]
FROM sys.indexes i
INNER JOIN sys.partition_schemes s ON i.data_space_id = s.data_space_id;
Hasil (menggunakan keluaran vertikal):
Schema | dbo Object | Movies Index | PK__Movies__4BD2941A0ED85ACA Partition Scheme | MoviesPartitionScheme
Periksa Tabel yang Dipartisi
Anda dapat menjalankan sys.dm_db_partition_stats
view untuk mengembalikan informasi halaman dan jumlah baris untuk setiap partisi dalam database saat ini.
Tetapi menjalankannya sebelum memasukkan data apa pun ke dalam tabel akan menghasilkan sebagian besar statistik menjadi nol.
Jadi saya akan memasukkan data terlebih dahulu.
INSERT INTO Movies
SELECT name FROM OtherDb.dbo.Movies;
Hasil:
(4079 rows affected)
Kita dapat melihat bahwa 4.079 baris dimasukkan.
Sekarang mari kita query sys.dm_db_partition_stats
lihat.
SELECT *
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Hasil:
+-------------------+-------------+------------+--------------------+--------------------------+--------------------------+------------------------------+-----------------------+---------------------------+--------------------------------+------------------------------------+-------------------+-----------------------+-------------+ | partition_id | object_id | index_id | partition_number | in_row_data_page_count | in_row_used_page_count | in_row_reserved_page_count | lob_used_page_count | lob_reserved_page_count | row_overflow_used_page_count | row_overflow_reserved_page_count | used_page_count | reserved_page_count | row_count | |-------------------+-------------+------------+--------------------+--------------------------+--------------------------+------------------------------+-----------------------+---------------------------+--------------------------------+------------------------------------+-------------------+-----------------------+-------------| | 72057594048413696 | 2030630277 | 1 | 1 | 1 | 2 | 9 | 0 | 0 | 0 | 0 | 2 | 9 | 1 | | 72057594048479232 | 2030630277 | 1 | 2 | 1 | 2 | 9 | 0 | 0 | 0 | 0 | 2 | 9 | 99 | | 72057594048544768 | 2030630277 | 1 | 3 | 3 | 5 | 25 | 0 | 0 | 0 | 0 | 5 | 25 | 900 | | 72057594048610304 | 2030630277 | 1 | 4 | 10 | 12 | 33 | 0 | 0 | 0 | 0 | 12 | 33 | 3079 | +-------------------+-------------+------------+--------------------+--------------------------+--------------------------+------------------------------+-----------------------+---------------------------+--------------------------------+------------------------------------+-------------------+-----------------------+-------------+
Tampilan ini mengembalikan banyak kolom, jadi mari kita persempit kolom menjadi hanya beberapa.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Hasil:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 1 | | 2 | 99 | | 3 | 900 | | 4 | 3079 | +--------------------+-------------+
Kita dapat melihat bagaimana baris dialokasikan di seluruh partisi. Mereka dialokasikan persis seperti yang kami tentukan dalam fungsi partisi. Total baris 4.079, persis berapa banyak baris yang kita sisipkan.
Namun, perlu dicatat bahwa dokumentasi Microsoft sebenarnya menyatakan bahwa kolom ini hanyalah perkiraan jumlah baris di setiap partisi.
Praktik Terbaik
Microsoft menyarankan agar kami selalu menyimpan partisi kosong di kedua ujung rentang partisi.
Ini jika Anda perlu memisahkan atau menggabungkan partisi di masa mendatang.
Alasan rekomendasi ini adalah untuk menjamin bahwa pemisahan partisi dan penggabungan partisi tidak menimbulkan perpindahan data yang tidak diharapkan.
Oleh karena itu, berdasarkan data dalam contoh saya, saya dapat mengubah fungsi partisi menjadi seperti ini:
CREATE PARTITION FUNCTION MoviesPartitionFunction (int)
AS RANGE LEFT FOR VALUES (-1, 100, 10000);
GO
Atau jika saya mengantisipasi lebih dari 10.000 baris, saya dapat menggunakan jumlah yang lebih besar (atau membuat lebih banyak partisi).
Jika saya membuat ulang semua langkah lagi, untuk membuat tabel yang dipartisi, statistik partisi saya akan terlihat seperti ini:
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 | +--------------------+-------------+
Sekarang data saya terkonsentrasi di dua partisi tengah, dan partisi di kedua ujungnya kosong.