Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Membuat Tabel yang Dipartisi di SQL Server (T-SQL)

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:

  1. Buat grup file
  2. Buat fungsi partisi
  3. Buat skema partisi
  4. 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server:Filter keluaran sp_who2

  2. Bagaimana cara mendapatkan tanggal pertama dan terakhir tahun ini?

  3. Hindari 4 Kesalahan Umum DBA Ini

  4. Cara Mengembalikan Hanya Nilai Numerik di SQL Server

  5. Temukan Tipe Data Kolom yang Dikembalikan dalam Kumpulan Hasil di SQL Server