Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So ordnen Sie mehrere Partitionen einer einzelnen Dateigruppe in SQL Server (T-SQL) zu

Wenn Sie mit dem Erstellen partitionierter Tabellen in SQL Server vertraut sind, sind Sie möglicherweise daran gewöhnt, für jede Partition eine separate Dateigruppe zu erstellen. Dies hat seine Vorteile und ist möglicherweise die Methode, die Sie in den meisten Szenarien wählen würden.

Sie haben jedoch auch die Möglichkeit, mehrere Partitionen einer einzelnen Dateigruppe zuzuordnen.

In diesem Artikel teile ich zwei Beispiele für die Zuordnung mehrerer Partitionen zu einer einzelnen Dateigruppe.

  • Beispiel 1 bildet alle ab Partitionen in eine einzelne Dateigruppe.
  • Beispiel 2 ordnet einige Partitionen einer Dateigruppe und einige einer anderen zu.

Beispiel 1 – Ordnen Sie alle Partitionen einer einzigen Dateigruppe zu

Um alle Partitionen einer einzelnen Dateigruppe zuzuordnen, verwenden Sie das Argument ALL. Dies gibt an, dass alle Partitionen der angegebenen Dateigruppe oder der primären Dateigruppe zugeordnet werden, wenn [PRIMARY] angegeben ist.

Beachten Sie, dass bei ALL angegeben ist, kann nur eine Dateigruppe angegeben werden.

-- 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 habe ich Folgendes getan:

  • Erstellte eine Dateigruppe und zugehörige Datei
  • Erstellte eine Partitionsfunktion
  • Ein Partitionsschema erstellt
  • Eine Tabelle erstellt, die dieses Partitionsschema verwendet

Der Schlüsselteil ist die letzte Zeile des CREATE PARTITION SCHEME Erklärung. Genauer gesagt ist es ALL Schlüsselwort, das alle Partitionen der angegebenen Dateigruppe zuordnet.

Wenn Sie sie mehreren Dateigruppen zuordnen, lassen Sie ALL weg , dann haben Sie eine durch Kommas getrennte Liste von Dateigruppen statt nur einer.

Überprüfen Sie die Zuordnung

Wir können die folgende Abfrage verwenden, um zu überprüfen, ob jede Partition derselben Dateigruppe zugeordnet ist.

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

Ergebnis:

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

Diese Abfrage zeigt uns auch, wie viele Zeilen sich in jeder Partition befinden. Wir haben keine Daten eingefügt, also sind sie alle Null.

Beispiel 2 – Ordnen Sie einige Partitionen einer einzelnen Dateigruppe zu

Dieses Beispiel ist fast identisch mit dem vorherigen Beispiel, außer dass wir die zwölf Partitionen zwei separaten Dateigruppen zuordnen.

In diesem Fall lassen wir ALL weg Argument, da nur eine Dateigruppe angegeben werden kann, wenn ALL angegeben ist.

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

Überprüfen Sie die Zuordnung

Sehen wir uns an, wie die Partitionen den Dateigruppen zugeordnet werden.

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

Ergebnis:

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

Wie erwartet werden die ersten sechs Partitionen der ersten Dateigruppe und die restlichen der zweiten zugeordnet.