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

Обединете два дяла в един в SQL Server (T-SQL)

В SQL Server можете да използвате ALTER PARTITION FUNCTION за да обедините два дяла в един дял.

За да направите това, използвайте MERGE RANGE аргумент, като същевременно предоставя граничната стойност на дяла за отпадане.

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

Пример

Представете си, че имаме пет дяла, които искаме да станем четири.

Текущи дялове

Имаме функция за дял, наречена MoviesPartitionFunction с четири гранични стойности.

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

Това означава, че има пет дяла.

За този пример ще премахнем граничния диапазон 500.

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

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

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

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

Обединяване на дяловете

Добре, нека обединим дяловете.

ALTER PARTITION FUNCTION MoviesPartitionFunction()  
MERGE 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             | 10000   |
+---------------+---------+

Както се очакваше, граничният диапазон от 500 беше премахнат и ни останаха само три гранични диапазона.

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

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

Отново, както се очаква, данните от дялове 3 и 4 се обединиха в един дял (раздел 3).

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

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

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

Тази практика се препоръчва и от 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. Проучване на различните ограничения в SQL Server

  2. Възможно ли е да се извършват множество актуализации с един оператор UPDATE SQL?

  3. Тригери на SQL Server – Част 2 DDL &LOGON тригери

  4. Кой е най-добрият начин за създаване и попълване на таблица с числа?

  5. Представяме ви нова функция - Spotlight Cloud Reports