sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan tilknyttes flere partitioner til en enkelt filgruppe i SQL Server (T-SQL)

Hvis du er fortrolig med at oprette partitionerede tabeller i SQL Server, kan du være vant til at oprette en separat filgruppe for hver partition. Dette har sine fordele og kan meget vel være den metode, du ville vælge i de fleste scenarier.

Du har dog også mulighed for at tilknytte flere partitioner til en enkelt filgruppe.

I denne artikel deler jeg to eksempler på at kortlægge flere partitioner til en enkelt filgruppe.

  • Eksempel 1 kort alle partitioner til en enkelt filgruppe.
  • Eksempel 2 kortlægger nogle partitioner til én filgruppe og nogle til en anden.

Eksempel 1 – Tilknyt alle partitioner til en enkelt filgruppe

For at tilknytte alle partitioner til en enkelt filgruppe skal du bruge ALL-argumentet. Dette angiver, at alle partitioner er knyttet til den angivne filgruppe eller til den primære filgruppe, hvis [PRIMARY] er angivet.

Bemærk, at når ALL er angivet, kan kun én filgruppe angives.

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

Her gjorde jeg følgende:

  • Oprettet en filgruppe og tilhørende fil
  • Oprettet en partitionsfunktion
  • Oprettet et partitionsskema
  • Oprettet en tabel, der bruger det partitionsskema

Nøgledelen er den sidste linje i CREATE PARTITION SCHEME udmelding. Specifikt er det ALL nøgleord, der knytter alle partitioner til den angivne filgruppe.

Hvis du tilknyttede dem til flere filgrupper, ville du udelade ALL , så har du en kommasepareret liste over filgrupper i stedet for kun én.

Tjek kortlægningen

Vi kan bruge følgende forespørgsel til at bekræfte, at hver partition er knyttet til den samme filgruppe.

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

Resultat:

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

Denne forespørgsel viser os også, hvor mange rækker der er i hver partition. Vi har ikke indsat nogen data, så de er alle nul.

Eksempel 2 – Tilknyt nogle partitioner til en enkelt filgruppe

Dette eksempel er næsten identisk med det forrige eksempel, bortset fra at vi kortlægger de tolv partitioner på tværs af to separate filgrupper.

I dette tilfælde udelader vi ALL argument, fordi kun én filgruppe kan angives, når ALL er angivet.

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

Tjek kortlægningen

Lad os se, hvordan partitionerne er knyttet til filgrupperne.

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

Resultat:

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

Som forventet tilknyttes de første seks partitioner til den første filgruppe, og de resterende tilknyttes den anden.


  1. Selvprovisionering af brugerkonti i PostgreSQL via uprivilegeret anonym adgang

  2. Hvordan gemmes datoer i Oracle?

  3. Hvad pokker er en DTU?

  4. Installation af postgresql med NSIS