sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man mappar flera partitioner till en enda filgrupp i SQL Server (T-SQL)

Om du är bekant med att skapa partitionerade tabeller i SQL Server kan du vara van vid att skapa en separat filgrupp för varje partition. Detta har sina fördelar och kan mycket väl vara den metod du skulle välja i de flesta scenarier.

Men du har också möjlighet att mappa flera partitioner till en enda filgrupp.

I den här artikeln delar jag två exempel på att mappa flera partitioner till en enda filgrupp.

  • Exempel 1 kartor alla partitioner till en enda filgrupp.
  • Exempel 2 mappar vissa partitioner till en filgrupp och några till en annan.

Exempel 1 – Mappa alla partitioner till en enda filgrupp

För att mappa alla partitioner till en enda filgrupp, använd ALL-argumentet. Detta anger att alla partitioner mappas till den angivna filgruppen, eller till den primära filgruppen om [PRIMARY] anges.

Observera att när ALL är specificerad, kan endast en filgrupp anges.

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

Här gjorde jag följande:

  • Skapade en filgrupp och tillhörande fil
  • Skapade en partitionsfunktion
  • Skapade ett partitionsschema
  • Skapade en tabell som använder det partitionsschemat

Nyckeldelen är den sista raden i CREATE PARTITION SCHEME påstående. Specifikt är det ALL nyckelord som mappar alla partitioner till den angivna filgruppen.

Om du mappade dem till flera filgrupper skulle du utelämna ALL , har sedan en kommaseparerad lista med filgrupper istället för bara en.

Kontrollera mappningen

Vi kan använda följande fråga för att verifiera att varje partition är mappad till samma filgrupp.

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

Den här frågan visar oss också hur många rader som finns i varje partition. Vi har inte infogat några data så de är alla noll.

Exempel 2 – Mappa vissa partitioner till en enskild filgrupp

Det här exemplet är nästan identiskt med det föregående exemplet, förutom att vi mappar de tolv partitionerna över två separata filgrupper.

I det här fallet utelämnar vi ALL argument, eftersom endast en filgrupp kan anges när ALL anges.

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

Kontrollera mappningen

Låt oss se hur partitionerna mappas till filgrupperna.

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 väntat mappas de första sex partitionerna till den första filgruppen, och resten mappas till den andra.


  1. Beräkna MD5-hash för en UTF8-sträng

  2. Vad exakt gör citattecken runt tabellnamnet?

  3. Använda ADO asynkront i Microsoft Access för att snabba upp formulär

  4. Lär dig hur du använder CASE-sats i SQL