sql >> Databáze >  >> RDS >> Sqlserver

Sloučit dva oddíly do jednoho v SQL Server (T-SQL)

V SQL Server můžete použít ALTER PARTITION FUNCTION sloučit dva oddíly do jednoho oddílu.

K tomu použijte MERGE RANGE argument a zároveň poskytuje hraniční hodnotu oddílu, který má být zrušen.

Tato operace zruší oddíl a sloučí všechny hodnoty, které v oddílu existují, do zbývajícího oddílu.

Příklad

Představte si, že máme pět oddílů, ze kterých se chceme stát čtyřmi.

Aktuální oddíly

Máme funkci oddílu s názvem MoviesPartitionFunction se čtyřmi hraničními hodnotami.

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

Výsledek:

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

To znamená, že existuje pět oddílů.

V tomto příkladu zrušíme hraniční rozsah 500.

Představte si také, že již máme tabulku s daty distribuovanými přes některé z těchto oddílů.

Zde je návod, jak jsou řádky aktuálně rozděleny mezi oddíly.

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

Výsledek:

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

Měl bych zdůraznit, že Microsoft ve skutečnosti nedoporučuje slučovat (nebo rozdělovat) oddíly, které obsahují data. Pro účely tohoto příkladu však zahodíme opatrnost a sloučíme dva oddíly, které obsahují data.

Sloučit oddíly

OK, pojďme sloučit oddíly.

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

Výsledek:

Commands completed successfully.

Úspěšně jsme sloučili oddíly.

Zkontrolujte výsledek

Pojďme zkontrolovat výsledek.

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

Výsledek:

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

Jak se očekávalo, hraniční rozsah 500 byl vypuštěn a zbývají nám pouze tři hraniční rozsahy.

Podívejme se, jak jsou data distribuována mezi oddíly.

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

Výsledek:

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

Opět podle očekávání se data z oddílů 3 a 4 sloučila do jednoho oddílu (oddíl 3).

Proč mít oddíly prázdné?

Pokud vás zajímá, proč mám na každém konci prázdné oddíly, je to speciálně provedeno pro usnadnění rozdělování a slučování oddílů.

Ponechání prázdných oddílů na obou koncích zabrání jakémukoli neočekávanému přesunu dat, ke kterému může dojít při rozdělování nebo slučování oddílů.

Tento postup je také doporučován společností Microsoft, a to právě z tohoto důvodu.

Sloučení oddílů, které obsahují data

Jak již bylo zmíněno, Microsoft nedoporučuje slučovat oddíly, které již obsahují data.

Rozdělení nebo sloučení obsazených oddílů může být neefektivní. Mohou být neefektivní, protože rozdělení nebo sloučení může způsobit až čtyřikrát více generování protokolu a může také způsobit vážné zamykání.


  1. Backendová verze není podporována pro návrh databázových diagramů nebo tabulek

  2. Operátor PostgreSQL IN se slabým výkonem poddotazu

  3. Jeden bezpečnostní systém pro aplikaci, sdružování připojení a PostgreSQL – případ LDAP

  4. 8 funkcí pro vrácení dne z data v MariaDB