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

Switch-In Partisi di SQL Server (T-SQL)

Di SQL Server, Anda dapat mengganti partisi masuk dan keluar dari tabel yang dipartisi.

Anda dapat melakukannya dengan ALTER TABLE penyataan. Pada dasarnya, ini seperti ini:

ALTER TABLE OldTable
SWITCH TO NewTable PARTITION x

Ini mengganti partisi untuk OldTable ke dalam partisi x dari NewTable (di mana x adalah nomor partisi).

Contoh

Sebelum kita mulai beralih, mari kita siapkan dua tabel. Satu (disebut OrdersOld ) akan berisi data yang ingin kita “alihkan” ke tabel lain (disebut OrdersNew ).

Kami akan mempartisi OrdersNew menjadi empat partisi.

-- Create 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
ALTER DATABASE Test ADD FILEGROUP OrdersNewFg3;
GO

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

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

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

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

-- Create a table that contains the data that we will be switching in.  
-- Note that the filegroup matches the filegroup of the partition that we will switch in to.
-- Include CHECK constraint to restrict data to the range specified in the switch-in partition
CREATE TABLE OrdersOld (
    OrderDate date NOT NULL,
    OrderId int IDENTITY NOT NULL,
    OrderDesc varchar(255) NOT NULL,
    CONSTRAINT chkDate CHECK (OrderDate >= '20200301' AND OrderDate < '20200401'),
    CONSTRAINT PKOrdersOld PRIMARY KEY CLUSTERED(OrderDate, OrderId)
    )
    ON OrdersNewFg3;
GO

-- Insert data into the OrdersOld table. This is the data we will be switching in to the OrdersNew table.
INSERT INTO OrdersOld(OrderDate, OrderDesc) VALUES
    ('20200302', 'Cat food'),
    ('20200315', 'Water bowl'),
    ('20200318', 'Saddle for camel'),
    ('20200321', 'Dog biscuits'),
    ('20200328', 'Bigfoot shoes');
GO

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

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

SELECT COUNT(*) AS OrdersNew
FROM OrdersNew;

Hasil:

+-------------+
| OrdersOld   |
|-------------|
| 5           |
+-------------+

+-------------+
| OrdersNew   |
|-------------|
| 0           |
+-------------+

Jadi seperti sekarang, OrdersOld berisi 5 baris dan OrdersNew kosong.

Saatnya beralih data.

ALTER TABLE OrdersOld
SWITCH TO OrdersNew PARTITION 3;

Hasil:

Commands completed successfully.

Data sekarang telah berhasil dialihkan ke partisi 3 dari tabel tujuan.

Mari kita periksa kedua tabel lagi.

SELECT COUNT(*) AS OrdersOld 
FROM OrdersOld;

SELECT COUNT(*) AS OrdersNew
FROM OrdersNew;

Hasil:

+-------------+
| OrdersOld   |
|-------------|
| 0           |
+-------------+

+-------------+
| OrdersNew   |
|-------------|
| 5           |
+-------------+

Kali ini OrdersOld kosong dan OrdersNew berisi 5 baris.

Kami juga dapat menjalankan kueri berikut untuk memeriksa partisi sebenarnya tempat data berada.

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

Hasil:

+-------------+--------------+--------+
| Partition   | Filegroup    | Rows   |
|-------------+--------------+--------|
| 1           | OrdersNewFg1 | 0      |
| 2           | OrdersNewFg2 | 0      |
| 3           | OrdersNewFg3 | 5      |
| 4           | OrdersNewFg4 | 0      |
+-------------+--------------+--------+

Seperti yang diharapkan, semua 5 baris dialokasikan ke partisi 3, di OrdersNewFg3 grup file.

Kesalahan Umum

Kesalahan 4982

Dalam contoh saya di atas, Anda akan melihat bahwa saya membuat CHECK kendala saat membuat OrdersOld tabel.

Jika Anda mendapatkan pesan kesalahan 4982 (pernyataan ALTER TABLE SWITCH gagal... ), bisa jadi Anda tidak membuat CHECK kendala pada tabel sumber.

Atau bisa juga Anda membuat CHECK kendala, tetapi tidak memberlakukan nilai antara rentang partisi switch-in.

Anda perlu memastikan bahwa nilai switch-in sebenarnya, dalam rentang yang ditentukan oleh partisi, dan SQL Server akan mencari CHECK kendala pada tabel sumber yang memverifikasi ini.

Kesalahan 4939

Kesalahan umum lainnya adalah kesalahan 4939 (pernyataan ALTER TABLE SWITCH gagal... ).

Jika Anda mendapatkan kesalahan ini, mungkin karena Anda mencoba beralih ke partisi yang menggunakan grup file berbeda ke tabel sumber.

Salah satu persyaratan untuk berpindah partisi adalah tabel atau partisi sumber, dan tabel atau partisi target, harus ditempatkan di grup file yang sama.

Untuk memperbaiki kesalahan ini, pastikan tabel sumber menggunakan grup file yang sama dengan partisi tujuan.

Mematikan

Lihat Mematikan Partisi di SQL Server untuk mengetahui cara mematikan 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. Cara berputar secara dinamis dengan tanggal sebagai kolom

  2. Bagaimana cara menghindari string di SQL Server menggunakan PHP?

  3. Menghubungkan SQL Server ke PostgreSQL

  4. Tidak dapat memuat SqlServerSpatial.dll

  5. Kompres Partisi Tertentu dalam Tabel di SQL Server (T-SQL)