Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да съпоставите множество дялове в една файлова група в SQL Server (T-SQL)

Ако сте запознати със създаването на разделени таблици в SQL Server, може да сте свикнали да създавате отделна файлова група за всеки дял. Това има своите предимства и може да бъде методът, който бихте избрали в повечето сценарии.

Имате обаче и опцията да съпоставите множество дялове в една файлова група.

В тази статия споделям два примера за съпоставяне на множество дялове в една файлова група.

  • Пример 1 показва всички дялове към една файлова група.
  • Пример 2 картографира някои дялове към една файлова група, а други към друга.

Пример 1 – Съпоставяне на всички дялове в една файлова група

За да съпоставите всички дялове в една файлова група, използвайте аргумента ALL. Това указва, че всички дялове се съпоставят с посочената файлова група или с първичната файлова група, ако [PRIMARY] е посочено.

Имайте предвид, че когато ALL е посочено, може да се посочи само една файлова група.

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

Ето, направих следното:

  • Създадена файлова група и свързан файл
  • Създадена функция за дял
  • Създадена схема на дялове
  • Създаде таблица, която използва тази схема на дялове

Ключовата част е последният ред от CREATE PARTITION SCHEME изявление. По-конкретно, това е ALL ключова дума, която съпоставя всички дялове с посочената файлова група.

Ако ги съпоставяте в множество файлови групи, ще пропуснете ALL , след това има разделен със запетая списък с файлови групи вместо само една.

Проверете картографирането

Можем да използваме следната заявка, за да проверим дали всеки дял е съпоставен с една и съща файлова група.

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

Резултат:

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

Тази заявка също ни показва колко реда има във всеки дял. Не сме вмъкнали никакви данни, така че всички са нулеви.

Пример 2 – Съпоставяне на някои дялове в една файлова група

Този пример е почти идентичен с предишния пример, с изключение на това, че картографираме дванадесетте дяла в две отделни файлови групи.

В този случай пропускаме ALL аргумент, тъй като може да се посочи само една файлова група, когато ALL е посочено.

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

Проверете картографирането

Нека видим как дяловете са съпоставени с файловите групи.

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

Резултат:

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

Както се очаква, първите шест дяла са съпоставени с първата файлова група, а останалите са съпоставени с втората.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ISDATE() Примери в SQL Server

  2. Защо SQL сървърът издава тази грешка:Не може да се вмъкне стойността NULL в колона "id"?

  3. Пакет за настройка на Spotlight Basic:Най-добрият безплатен инструмент за оптимизиране на SQL

  4. Защо логическите показания за прозоречни агрегатни функции са толкова високи?

  5. Лесен начин изберете дясната колона като първичен ключ за дадена таблица