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

Matikan Partisi di SQL Server (T-SQL)

Di SQL Server, pengalihan partisi memungkinkan Anda memuat data dalam jumlah besar ke dalam atau ke luar tabel dengan sangat cepat. Ini menyelamatkan Anda dari keharusan menjalankan pernyataan hapus atau sisipkan, dan bisa sangat berguna saat bekerja dengan kumpulan data besar.

Anda dapat menggunakan ALTER TABLE pernyataan untuk mengganti partisi masuk atau keluar dari tabel.

Untuk mengganti partisi dari tabel, kodenya seperti ini:

ALTER TABLE Table1
SWITCH PARTITION x TO Table2

Ini mengganti partisi x dari Table1 ke Table2 (di mana x adalah nomor partisi).

Contoh

Penyiapan

Sebelum kita mulai beralih, kita akan membuat pengaturan dasar. Ini akan terdiri dari dua tabel. Satu akan menjadi tabel sumber yang dipartisi, yang lain akan menjadi tabel tujuan. Kami juga akan membuat empat grup file – satu untuk setiap partisi.

-- Create filegroups
ALTER DATABASE Test ADD FILEGROUP OrdersLatestFg1;
GO

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

ALTER DATABASE Test ADD FILEGROUP OrdersLatestFg2;
GO

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

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

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

-- Create a partition function that will result in four partitions  
CREATE PARTITION FUNCTION OrdersLatestPartitionFunction (date)  
    AS RANGE RIGHT FOR VALUES (
        '20200201', 
        '20200301',
        '20200401'
    );
GO

-- Create a partition scheme that maps the partitions to the filegroups
CREATE PARTITION SCHEME OrdersLatestPartitionScheme
    AS PARTITION OrdersLatestPartitionFunction  
    TO (
        OrdersLatestFg1,
        OrdersLatestFg2,
        OrdersLatestFg3,
        OrdersLatestFg4
        );  
GO

-- Create a partitioned table called OrdersLatest that uses the OrderDate column as the partitioning column
CREATE TABLE OrdersLatest (
    OrderDate date NOT NULL,
    OrderId int IDENTITY NOT NULL,
    OrderDesc varchar(255) NOT NULL,
    CONSTRAINT PKOrdersLatest PRIMARY KEY CLUSTERED(OrderDate, OrderId)
    )  
    ON OrdersLatestPartitionScheme(OrderDate);  
GO

-- Insert data into the OrdersLatest table. 
-- This will end up in partition 3, which is the partition we will switch out to the OrdersMarch table.
INSERT INTO OrdersLatest(OrderDate, OrderDesc) VALUES
    ('20200302', 'Cat food'),
    ('20200315', 'Water bowl'),
    ('20200318', 'Saddle for camel'),
    ('20200321', 'Dog biscuits'),
    ('20200328', 'Bigfoot shoes');
GO

-- Create a table that contains the data that we will be switching out to.  
-- Note that the filegroup matches the filegroup of the partition that we will switch out of.
CREATE TABLE OrdersMarch (
    OrderDate date NOT NULL,
    OrderId int IDENTITY NOT NULL,
    OrderDesc varchar(255) NOT NULL,
    CONSTRAINT PKOrdersMarch PRIMARY KEY CLUSTERED(OrderDate, OrderId)
    )
    ON OrdersLatestFg3;
GO

-- Check how many rows are in each table
SELECT COUNT(*) AS OrdersLatest
FROM OrdersLatest;

SELECT COUNT(*) AS OrdersMarch 
FROM OrdersMarch;

Hasil:

+----------------+
| OrdersLatest   |
|----------------|
| 5              |
+----------------+

+---------------+
| OrdersMarch   |
|---------------|
| 0             |
+---------------+

Jadi seperti saat ini, kami memiliki lima baris di OrdersLatest table, yang merupakan tabel kita yang dipartisi.

Kelima baris harus berada di partisi 3. Mari kita periksa.

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('OrdersLatest')
ORDER BY [Partition];

Hasil:

+-------------+-----------------+--------+
| Partition   | Filegroup       | Rows   |
|-------------+-----------------+--------|
| 1           | OrdersLatestFg1 | 0      |
| 2           | OrdersLatestFg2 | 0      |
| 3           | OrdersLatestFg3 | 5      |
| 4           | OrdersLatestFg4 | 0      |
+-------------+-----------------+--------+

Ya, jadi kita bisa melihat bahwa kelima baris berada di partisi 3. Kita juga bisa melihat bahwa partisi 3 dipetakan ke OrdersLatestFg3 grup file. Agar "switch out" kita berhasil, kita perlu memastikan bahwa tabel tujuan kita menggunakan filegroup ini. Untungnya, kode kami di atas melakukan hal itu. Kami menggunakan ON OrdersLatestFg3 saat membuat tabel untuk menentukan bahwa tabel harus dibuat pada filegroup tersebut.

Matikan

OK, jadi semuanya siap untuk dimatikan. Ayo lakukan.

ALTER TABLE OrdersLatest
SWITCH PARTITION 3 TO OrdersMarch;

Hasil:

Commands completed successfully.

Bagus sekali. Pengalihan kami berhasil.

Mari kita periksa kembali jumlah baris di setiap tabel.

SELECT COUNT(*) AS OrdersLatest
FROM OrdersLatest;

SELECT COUNT(*) AS OrdersMarch 
FROM OrdersMarch;

Hasil:

+----------------+
| OrdersLatest   |
|----------------|
| 0              |
+----------------+

+---------------+
| OrdersMarch   |
|---------------|
| 5             |
+---------------+

Jadi kita bisa melihat bahwa data telah dipindahkan dari OrdersLatest tabel ke OrdersMarch tabel.

Mari kita periksa info partisi untuk OrdersLatest .

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('OrdersLatest')
ORDER BY [Partition];

Hasil:

+-------------+-----------------+--------+
| Partition   | Filegroup       | Rows   |
|-------------+-----------------+--------|
| 1           | OrdersLatestFg1 | 0      |
| 2           | OrdersLatestFg2 | 0      |
| 3           | OrdersLatestFg3 | 0      |
| 4           | OrdersLatestFg4 | 0      |
+-------------+-----------------+--------+

Seperti yang diharapkan, OrdersLatestFg3 partisi sekarang kosong. Ini karena telah dimatikan.

Mari kita periksa info partisi untuk OrdersMarch tabel.

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('OrdersMarch')
ORDER BY [Partition];

Hasil:

+-------------+-----------------+--------+
| Partition   | Filegroup       | Rows   |
|-------------+-----------------+--------|
| 1           | OrdersLatestFg3 | 5      |
+-------------+-----------------+--------+

Sekali lagi seperti yang diharapkan, tabel OrdersMarch berisi lima baris. Mereka disimpan di partisi 1 (satu-satunya partisi) di OrdersLatest3 grup file.

Beralih

Lihat Mengalihkan Partisi di SQL Server untuk cara mengaktifkan partisi.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DATEPART() Contoh di SQL Server

  2. 4 Tips untuk Menjalankan Diagnostik SQL Server

  3. Menemukan Induk Tingkat Teratas di SQL

  4. Berbagai Cara untuk Membandingkan Skema dan Data Tabel SQL Server

  5. Dapatkan 1 baris teratas setiap grup