Se você estiver familiarizado com a criação de tabelas particionadas no SQL Server, poderá estar acostumado a criar um grupo de arquivos separado para cada partição. Isso tem seus benefícios e pode muito bem ser o método que você escolheria na maioria dos cenários.
No entanto, você também tem a opção de mapear várias partições para um único grupo de arquivos.
Neste artigo, compartilho dois exemplos de mapeamento de várias partições para um único grupo de arquivos.
- Exemplo 1 mapeia todos partições para um único grupo de arquivos.
- O exemplo 2 mapeia algumas partições para um grupo de arquivos e outras para outro.
Exemplo 1 – Mapear todas as partições para um único grupo de arquivos
Para mapear todas as partições para um único grupo de arquivos, use o argumento ALL. Isso especifica que todas as partições mapeiam para o grupo de arquivos especificado ou para o grupo de arquivos primário se
[PRIMARY]
é especificado. Observe que quando
ALL
for especificado, apenas um grupo de arquivos poderá ser especificado. -- 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
Aqui fiz o seguinte:
- Criado um grupo de arquivos e arquivo associado
- Criou uma função de partição
- Criado um esquema de partição
- Criou uma tabela que usa esse esquema de partição
A parte chave é a última linha do
CREATE PARTITION SCHEME
demonstração. Especificamente, é o ALL
palavra-chave que mapeia todas as partições para o grupo de arquivos especificado. Se você estivesse mapeando-os para vários grupos de arquivos, omitiria
ALL
, terá uma lista de grupos de arquivos separados por vírgulas em vez de apenas um. Verifique o mapeamento
Podemos usar a seguinte consulta para verificar se cada partição está mapeada para o mesmo grupo de arquivos.
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');
Resultado:
+-------------+--------------+--------+ | 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 | +-------------+--------------+--------+
Essa consulta também nos mostra quantas linhas existem em cada partição. Não inserimos nenhum dado, então todos são zero.
Exemplo 2 – Mapear algumas partições para um único grupo de arquivos
Este exemplo é quase idêntico ao exemplo anterior, exceto que mapeamos as doze partições em dois grupos de arquivos separados.
Neste caso, omitimos o
ALL
argumento, porque apenas um grupo de arquivos pode ser especificado quando ALL
é especificado. -- 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
Verifique o mapeamento
Vamos ver como as partições são mapeadas para os grupos de arquivos.
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');
Resultado:
+-------------+--------------+--------+ | 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 | +-------------+--------------+--------+
Conforme esperado, as primeiras seis partições são mapeadas para o primeiro grupo de arquivos e o restante é mapeado para o segundo.