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

Cara Memetakan Banyak Partisi ke Satu Filegroup di SQL Server (T-SQL)

Jika Anda terbiasa membuat tabel yang dipartisi di SQL Server, Anda mungkin terbiasa membuat grup file terpisah untuk setiap partisi. Ini memiliki manfaatnya, dan mungkin merupakan metode yang akan Anda pilih di sebagian besar skenario.

Namun, Anda juga memiliki opsi untuk memetakan beberapa partisi ke satu grup file.

Pada artikel ini saya membagikan dua contoh pemetaan beberapa partisi ke satu filegroup.

  • Contoh 1 memetakan semua partisi ke satu filegroup.
  • Contoh 2 memetakan beberapa partisi ke satu filegroup, dan beberapa ke yang lain.

Contoh 1 – Memetakan Semua Partisi ke Satu Filegroup

Untuk memetakan semua partisi ke satu filegroup, gunakan argumen ALL. Ini menetapkan bahwa semua partisi dipetakan ke grup file yang ditentukan, atau ke grup file utama jika [PRIMARY] ditentukan.

Perhatikan bahwa ketika ALL ditentukan, hanya satu grup file yang dapat ditentukan.

-- Create one filegroup
ALTER DATABASE Test ADD FILEGROUP OrdersNewFg1;
GO

ALTER DATABASE Test   
ADD FILE   
(  
    NAME = OrdersNewFg1dat,  
    FILENAME = '/var/opt/mssql/data/OrdersNewFg1dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB  
)  
TO FILEGROUP OrdersNewFg1;
GO

-- Create a partition function that will result in twelve partitions  
CREATE PARTITION FUNCTION OrdersNewPartitionFunction (date)  
    AS RANGE RIGHT FOR VALUES (
        '20200201', 
        '20200301',
        '20200401', 
        '20200501',
        '20200601',
        '20200701',
        '20200801',
        '20200901',
        '20201001',
        '20201101',
        '20201201'
    );
GO

-- Create a partition scheme that maps all partitions to the OrdersNewFg1 filegroup
CREATE PARTITION SCHEME OrdersNewPartitionScheme
    AS PARTITION OrdersNewPartitionFunction  
    ALL TO (OrdersNewFg1);  
GO

-- Create a partitioned table
CREATE TABLE OrdersNew (
    OrderDate date NOT NULL,
    OrderId int IDENTITY NOT NULL,
    OrderDesc varchar(255) NOT NULL
    )  
    ON OrdersNewPartitionScheme (OrderDate);  
GO

Di sini, saya melakukan hal berikut:

  • Membuat grup file dan file terkait
  • Membuat fungsi partisi
  • Membuat skema partisi
  • Membuat tabel yang menggunakan skema partisi tersebut

Bagian kuncinya adalah baris terakhir dari CREATE PARTITION SCHEME penyataan. Secara khusus, ini adalah ALL kata kunci yang memetakan semua partisi ke grup file yang ditentukan.

Jika Anda memetakannya ke beberapa grup file, Anda akan menghilangkan ALL , lalu buat daftar grup file yang dipisahkan koma, bukan hanya satu.

Periksa Pemetaan

Kita dapat menggunakan kueri berikut untuk memverifikasi bahwa setiap partisi dipetakan ke grup file yang sama.

SELECT 
    p.partition_number AS [Partition], 
    fg.name AS [Filegroup], 
    p.Rows
FROM sys.partitions p
    INNER JOIN sys.allocation_units au
    ON au.container_id = p.hobt_id
    INNER JOIN sys.filegroups fg
    ON fg.data_space_id = au.data_space_id
WHERE p.object_id = OBJECT_ID('OrdersNew');

Hasil:

+-------------+--------------+--------+
| Partition   | Filegroup    | Rows   |
|-------------+--------------+--------|
| 1           | OrdersNewFg1 | 0      |
| 2           | OrdersNewFg1 | 0      |
| 3           | OrdersNewFg1 | 0      |
| 4           | OrdersNewFg1 | 0      |
| 5           | OrdersNewFg1 | 0      |
| 6           | OrdersNewFg1 | 0      |
| 7           | OrdersNewFg1 | 0      |
| 8           | OrdersNewFg1 | 0      |
| 9           | OrdersNewFg1 | 0      |
| 10          | OrdersNewFg1 | 0      |
| 11          | OrdersNewFg1 | 0      |
| 12          | OrdersNewFg1 | 0      |
+-------------+--------------+--------+

Kueri ini juga menunjukkan kepada kita berapa banyak baris di setiap partisi. Kami belum memasukkan data apa pun sehingga semuanya nol.

Contoh 2 – Memetakan Beberapa Partisi ke Satu Filegroup

Contoh ini hampir identik dengan contoh sebelumnya, kecuali bahwa kami memetakan dua belas partisi di dua grup file yang terpisah.

Dalam hal ini, kami menghilangkan ALL argumen, karena hanya satu grup file yang dapat ditentukan saat ALL ditentukan.

-- Create two filegroups
ALTER DATABASE Test ADD FILEGROUP OrdersNewFg1;
GO

ALTER DATABASE Test   
ADD FILE   
(  
    NAME = OrdersNewFg1dat,  
    FILENAME = '/var/opt/mssql/data/OrdersNewFg1dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB  
)  
TO FILEGROUP OrdersNewFg1;
GO

ALTER DATABASE Test ADD FILEGROUP OrdersNewFg2;
GO

ALTER DATABASE Test   
ADD FILE   
(  
    NAME = OrdersNewFg2dat,  
    FILENAME = '/var/opt/mssql/data/OrdersNewFg2dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB  
)  
TO FILEGROUP OrdersNewFg2;
GO

-- Create a partition function that will result in twelve partitions  
CREATE PARTITION FUNCTION OrdersNewPartitionFunction (date)  
    AS RANGE RIGHT FOR VALUES (
        '20200201', 
        '20200301',
        '20200401', 
        '20200501',
        '20200601',
        '20200701',
        '20200801',
        '20200901',
        '20201001',
        '20201101',
        '20201201'
    );
GO

-- Create a partition scheme that maps all partitions to the OrdersNewFg1 filegroup
CREATE PARTITION SCHEME OrdersNewPartitionScheme
    AS PARTITION OrdersNewPartitionFunction  
    TO (
        OrdersNewFg1,
        OrdersNewFg1,
        OrdersNewFg1,
        OrdersNewFg1,
        OrdersNewFg1,
        OrdersNewFg1,
        OrdersNewFg2,
        OrdersNewFg2,
        OrdersNewFg2,
        OrdersNewFg2,
        OrdersNewFg2,
        OrdersNewFg2
        );  
GO

-- Create a partitioned table
CREATE TABLE OrdersNew (
    OrderDate date NOT NULL,
    OrderId int IDENTITY NOT NULL,
    OrderDesc varchar(255) NOT NULL
    )  
    ON OrdersNewPartitionScheme (OrderDate);  
GO

Periksa Pemetaan

Mari kita lihat bagaimana partisi dipetakan ke grup file.

SELECT 
    p.partition_number AS [Partition], 
    fg.name AS [Filegroup], 
    p.Rows
FROM sys.partitions p
    INNER JOIN sys.allocation_units au
    ON au.container_id = p.hobt_id
    INNER JOIN sys.filegroups fg
    ON fg.data_space_id = au.data_space_id
WHERE p.object_id = OBJECT_ID('OrdersNew');

Hasil:

+-------------+--------------+--------+
| Partition   | Filegroup    | Rows   |
|-------------+--------------+--------|
| 1           | OrdersNewFg1 | 0      |
| 2           | OrdersNewFg1 | 0      |
| 3           | OrdersNewFg1 | 0      |
| 4           | OrdersNewFg1 | 0      |
| 5           | OrdersNewFg1 | 0      |
| 6           | OrdersNewFg1 | 0      |
| 7           | OrdersNewFg2 | 0      |
| 8           | OrdersNewFg2 | 0      |
| 9           | OrdersNewFg2 | 0      |
| 10          | OrdersNewFg2 | 0      |
| 11          | OrdersNewFg2 | 0      |
| 12          | OrdersNewFg2 | 0      |
+-------------+--------------+--------+

Seperti yang diharapkan, enam partisi pertama dipetakan ke grup file pertama, dan sisanya dipetakan ke grup kedua.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara menghasilkan skrip Batasan Unik drop di Database SQL Server - Tutorial SQL Server / TSQL Bagian 99

  2. Bagaimana Saya Dapat Mendeteksi dan Mengikat Perubahan Antara Nilai Baris dalam Tabel SQL?

  3. Mesin Virtual Azure untuk Penggunaan SQL Server

  4. Memecahkan masalah kueri yang berjalan lama di MS SQL Server

  5. Menyebarkan Grup Ketersediaan SQL Server AlwaysOn di Linux