Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Превключване на дял в SQL Server (T-SQL)

В SQL Server можете да превключвате дялове в и извън разделена таблица.

Можете да направите това с ALTER TABLE изявление. По принцип става така:

ALTER TABLE OldTable
SWITCH TO NewTable PARTITION x

Това превключва дяла за OldTable в дял x на NewTable (където x е номерът на дял).

Пример

Преди да започнем да превключваме, нека настроим две маси. Един (наречен OrdersOld ) ще съдържа данните, които искаме да „превключим“ към другата таблица (наречена OrdersNew ).

Ще разделим OrdersNew на четири дяла.

-- 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;

Резултат:

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

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

И така, както е в момента, OrdersOld съдържа 5 реда и OrdersNew е празен.

Време е за превключване на данните.

ALTER TABLE OrdersOld
SWITCH TO OrdersNew PARTITION 3;

Резултат:

Commands completed successfully.

Данните вече са успешно прехвърлени към дял 3 на целевата таблица.

Нека отново проверим двете таблици.

SELECT COUNT(*) AS OrdersOld 
FROM OrdersOld;

SELECT COUNT(*) AS OrdersNew
FROM OrdersNew;

Резултат:

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

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

Този път OrdersOld е празен и OrdersNew съдържа 5 реда.

Можем също да изпълним следната заявка, за да проверим действителния дял, в който се намират данните.

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];

Резултат:

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

Както се очаква, всичките 5 реда са разпределени на дял 3, в OrdersNewFg3 файлова група.

Чести грешки

Грешка 4982

В моя пример по-горе ще забележите, че създадох CHECK ограничение при създаване на OrdersOld таблица.

Ако получите съобщение за грешка 4982 (ALTER TABLE SWITCH statement failed... ), възможно е да не сте създали CHECK ограничение на изходната таблица.

Или може да се окаже, че сте създали CHECK ограничение, но не налага стойности между диапазона на превключващия дял.

Трябва да се уверите, че стойностите за включване всъщност са в рамките на диапазона, дефиниран от дяла, и SQL Server ще търси CHECK ограничение на изходната таблица, което потвърждава това.

Грешка 4939

Друга често срещана е грешка 4939 (ALTER TABLE SWITCH statement failed... ).

Ако получите тази грешка, това вероятно е, защото се опитвате да превключите към дял, който използва различна файлова група спрямо таблицата източник.

Едно от изискванията за превключване на дялове е както изходната таблица или дял, така и целевата таблица или дял трябва да се намират в една и съща файлова група.

За да коригирате тази грешка, уверете се, че изходната таблица използва същата файлова група като целевия дял.

Изключване

Вижте Изключване на дял в SQL Server за това как да изключите дял.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създам ограничение за проверка на множество таблици?

  2. Как да зададете инвариантната култура, когато използвате FORMAT() в SQL Server

  3. Преобразувайте „datetime2“ в „datetime“ в SQL Server (T-SQL примери)

  4. Как да вградите функционалност RUNAS /NETONLY в програма (C#/.NET/WinForms)?

  5. Можете ли да се обадите на уеб услуга от TSQL код?