sql >> Database >  >> RDS >> Sqlserver

Meerdere partities toewijzen aan een enkele bestandsgroep in SQL Server (T-SQL)

Als u bekend bent met het maken van gepartitioneerde tabellen in SQL Server, bent u misschien gewend om voor elke partitie een aparte bestandsgroep te maken. Dit heeft zijn voordelen, en zou in de meeste scenario's heel goed de methode kunnen zijn die u zou kiezen.

U hebt echter ook de mogelijkheid om meerdere partities aan een enkele bestandsgroep toe te wijzen.

In dit artikel deel ik twee voorbeelden van het toewijzen van meerdere partities aan een enkele bestandsgroep.

  • Voorbeeld 1 brengt alle in kaart partities naar een enkele bestandsgroep.
  • Voorbeeld 2 wijst sommige partities toe aan de ene bestandsgroep en sommige aan een andere.

Voorbeeld 1 – Wijs alle partities toe aan een enkele bestandsgroep

Gebruik het argument ALL om alle partities toe te wijzen aan een enkele bestandsgroep. Dit specificeert dat alle partities worden toegewezen aan de opgegeven bestandsgroep, of aan de primaire bestandsgroep als [PRIMARY] is opgegeven.

Merk op dat wanneer ALL is opgegeven, kan slechts één bestandsgroep worden opgegeven.

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

Hier deed ik het volgende:

  • Een bestandsgroep en bijbehorend bestand gemaakt
  • Een partitiefunctie gemaakt
  • Een partitieschema gemaakt
  • Een tabel gemaakt die dat partitieschema gebruikt

Het belangrijkste onderdeel is de laatste regel van het CREATE PARTITION SCHEME uitspraak. Het is met name de ALL trefwoord dat alle partities toewijst aan de opgegeven bestandsgroep.

Als u ze aan meerdere bestandsgroepen zou toewijzen, zou u ALL . weglaten , heb dan een door komma's gescheiden lijst van bestandsgroepen in plaats van slechts één.

Controleer de toewijzing

We kunnen de volgende query gebruiken om te verifiëren dat elke partitie is toegewezen aan dezelfde bestandsgroep.

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

Resultaat:

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

Deze query laat ons ook zien hoeveel rijen er in elke partitie zijn. We hebben geen gegevens ingevoegd, dus ze zijn allemaal nul.

Voorbeeld 2 – Enkele partities toewijzen aan een enkele bestandsgroep

Dit voorbeeld is bijna identiek aan het vorige voorbeeld, behalve dat we de twaalf partities toewijzen aan twee afzonderlijke bestandsgroepen.

In dit geval laten we de ALL . weg argument, omdat er slechts één bestandsgroep kan worden opgegeven wanneer ALL is opgegeven.

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

Controleer de toewijzing

Laten we eens kijken hoe de partities zijn toegewezen aan de bestandsgroepen.

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

Resultaat:

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

Zoals verwacht worden de eerste zes partities toegewezen aan de eerste bestandsgroep en de rest wordt toegewezen aan de tweede.


  1. Meerdere kolommen bijwerken in MySQL

  2. Interne onderdelen voor transactiereplicatie van SQL Server

  3. Salesforce SOQL van Crystal Reports

  4. Werken met Salesforce.com-gegevens in SQL Server Reporting Services