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

Разделете дял на две в SQL Server (T-SQL)

Ако имате разделена таблица или индекс в SQL Server, но имате нужда от повече дялове, можете да добавите дял към функцията за дял, като използвате ALTER PARTITION FUNCTION израз с SPLIT RANGE аргумент.

Когато направите това, разделяте съществуващ дял на две.

Пример

Ето пример за демонстрация. Първо, нека разгледаме текущата ни настройка.

Текуща настройка

Вече имаме четири дяла и искаме да добавим пети.

Така че вече създадохме функция за дялове като тази:

CREATE PARTITION FUNCTION MoviesPartitionFunction (int)  
    AS RANGE LEFT FOR VALUES (-1, 100, 10000);

Този код води до дялове, които съхраняват стойности, както следва.

Дял Стойности
1 <=–1
2 > –1 И <=100
3 > 100 И <=10000
4 > 10000

За този пример ще добавим нова гранична стойност от 500.

Затова искаме да изглежда така:

Дял Стойности
1 <=–1
2 > –1 И <=100
3 > 100 И <=500
4 > 500 И <=10000
5 > 10000

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

Нека да разгледаме набързо как са разпределени редовете между нашите дялове:

SELECT 
    partition_number,
    row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');

Резултат:

+--------------------+-------------+
| partition_number   | row_count   |
|--------------------+-------------|
| 1                  | 0           |
| 2                  | 100         |
| 3                  | 3979        |
| 4                  | 0           |
+--------------------+-------------+

Така че сега искаме да добавим нов дял с гранична стойност 500.

В този случай ще разделим дяла между гранични стойности 100 и 10000.

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

Въпреки това, за целите на този пример, ние ще разделим дял, който съдържа данни.

Разделете дяла

Ето къде продължаваме и разделяме дяла.

Използваме ALTER PARTITION FUNCTION оператор за разделяне на дяла.

Въпреки това, разделянето на дял създава два дяла от един и затова трябва да се уверим, че има файлова група за новия дял. Също така трябва да се уверим, че нашата схема на дялове знае коя файлова група да използва, когато разделим дяла.

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

Нека създадем нов.

Ето кода, който можем да използваме, за да направим всичко по-горе:

ALTER DATABASE Test ADD FILEGROUP MoviesFg5;

ALTER DATABASE Test   
ADD FILE   
(  
    NAME = MoviesFg5dat,  
    FILENAME = '/var/opt/mssql/data/MoviesFg5dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB  
)  
TO FILEGROUP MoviesFg5;

ALTER PARTITION SCHEME MoviesPartitionScheme  
NEXT USED MoviesFg5;

ALTER PARTITION FUNCTION MoviesPartitionFunction()
SPLIT RANGE (500);

Резултат:

Commands completed successfully.

Успешно разделихме дяла.

Проверете разделянето

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

SELECT 
    prv.boundary_id,
    prv.[value]
FROM sys.partition_range_values prv
INNER JOIN sys.partition_functions pf
ON prv.function_id = pf.function_id
WHERE pf.name = 'MoviesPartitionFunction';

Резултат:

+---------------+---------+
| boundary_id   | value   |
|---------------+---------|
| 1             | -1      |
| 2             | 100     |
| 3             | 500     |
| 4             | 10000   |
+---------------+---------+

Така можем да видим, че новата гранична стойност е добавена успешно.

И ето как сега данните се разпределят между дяловете.

SELECT 
    partition_number,
    row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');

Резултат:

+--------------------+-------------+
| partition_number   | row_count   |
|--------------------+-------------|
| 1                  | 0           |
| 2                  | 100         |
| 3                  | 400         |
| 4                  | 3579        |
| 5                  | 0           |
+--------------------+-------------+

Така че сега имаме 5 дяла.

Защо да имаме празни дялове?

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

Поддържането на празни дялове от всеки край предотвратява всяко неочаквано движение на данни, което може да получите при разделяне или сливане на дялове.

Тази практика се препоръчва и от Microsoft, точно по тази причина.

Разделяне на дялове, които съдържат данни

Както споменахме, Microsoft препоръчва да не се разделят дялове, които вече съдържат данни.

Разделянето или сливането на населени дялове може да бъде неефективно. Те могат да бъдат неефективни, тъй като разделянето или сливането може да доведе до четири пъти повече генериране на регистрационни файлове и може също да причини сериозно заключване.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. EXEC sp_executesql с множество параметри

  2. Грешка 28000:Неуспешно влизане за потребител DOMAIN\\user с pyodbc

  3. Как да изброите остарелите функции в екземпляр на SQL сървър с помощта на T-SQL

  4. Кеширане на временни обекти на SQL Server

  5. SQL Server - Връщане на стойност след INSERT