Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak mapować wiele partycji do jednej grupy plików w programie SQL Server (T-SQL)

Jeśli znasz się na tworzeniu partycjonowanych tabel w SQL Server, możesz być przyzwyczajony do tworzenia oddzielnej grupy plików dla każdej partycji. Ma to swoje zalety i może być metodą, którą wybierzesz w większości scenariuszy.

Istnieje jednak również możliwość mapowania wielu partycji do jednej grupy plików.

W tym artykule udostępnię dwa przykłady mapowania wielu partycji do jednej grupy plików.

  • Przykład 1 mapy wszystkie partycje do jednej grupy plików.
  • Przykład 2 mapuje niektóre partycje do jednej grupy plików, a niektóre do innej.

Przykład 1 – mapowanie wszystkich partycji do pojedynczej grupy plików

Aby zmapować wszystkie partycje do jednej grupy plików, użyj argumentu ALL. Określa, że ​​wszystkie partycje są mapowane na określoną grupę plików lub na podstawową grupę plików, jeśli [PRIMARY] jest określony.

Zauważ, że gdy ALL jest określony, można określić tylko jedną grupę plików.

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

Tutaj zrobiłem co następuje:

  • Utworzono grupę plików i skojarzony plik
  • Utworzono funkcję partycji
  • Utworzono schemat partycji
  • Utworzono tabelę, która używa tego schematu partycji

Kluczową częścią jest ostatnia linia CREATE PARTITION SCHEME oświadczenie. W szczególności jest to ALL słowo kluczowe, które mapuje wszystkie partycje do określonej grupy plików.

Jeśli mapowałeś je do wielu grup plików, pominąłbyś ALL , a następnie przygotuj listę grup plików oddzielonych przecinkami zamiast tylko jednej.

Sprawdź mapowanie

Możemy użyć następującego zapytania, aby sprawdzić, czy każda partycja jest zmapowana do tej samej grupy plików.

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

Wynik:

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

To zapytanie pokazuje nam również, ile wierszy znajduje się w każdej partycji. Nie wstawiliśmy żadnych danych, więc wszystkie są zerowe.

Przykład 2 – mapowanie niektórych partycji do pojedynczej grupy plików

Ten przykład jest prawie identyczny z poprzednim, z wyjątkiem tego, że mapujemy dwanaście partycji na dwie oddzielne grupy plików.

W takim przypadku pomijamy ALL argument, ponieważ można określić tylko jedną grupę plików, gdy ALL jest określony.

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

Sprawdź mapowanie

Zobaczmy, jak partycje są mapowane do grup plików.

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

Wynik:

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

Zgodnie z oczekiwaniami, pierwsze sześć partycji jest mapowanych na pierwszą grupę plików, a pozostałe na drugą.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Porównaj daty w T-SQL, ignorując część czasu

  2. Powolna wstawka zbiorcza do tabeli z wieloma indeksami

  3. Użyj CRYPT_GEN_RANDOM(), aby utworzyć kryptograficzną, losową liczbę w SQL Server

  4. Jak WYBRAĆ * ale bez Nazwy kolumn muszą być unikalne w każdym widoku

  5. Różnica między sys.sql_modules, sys.system_sql_modules i sys.all_sql_modules w SQL Server