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

Rozdělit oddíl na dva v SQL Server (T-SQL)

Pokud máte na SQL Server rozdělenou tabulku nebo index, ale potřebujete více oddílů, můžete přidat oddíl k funkci oddílu pomocí ALTER PARTITION FUNCTION příkaz s SPLIT RANGE argument.

Když to uděláte, rozdělíte existující oddíl na dva.

Příklad

Zde je příklad k demonstraci. Nejprve se podívejme na naše aktuální nastavení.

Aktuální nastavení

Máme již čtyři oddíly a chceme přidat pátý.

Takže jsme již vytvořili funkci oddílu, jako je tato:

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

Výsledkem tohoto kódu jsou oddíly, které ukládají hodnoty následovně.

Oddíl Hodnoty
1 <=–1
2 > –1 AND <=100
3 > 100 AND <=10000
4 > 10000

V tomto příkladu přidáme novou hraniční hodnotu 500.

Takže chceme, aby to vypadalo takto:

Oddíl Hodnoty
1 <=–1
2 > –1 AND <=100
3 > 100 AND <=500
4 > 500 AND <=10000
5 > 10000

Pro účely tohoto příkladu si také představte, že máme tabulku, která je rozdělena pomocí výše uvedené funkce rozdělení a aktuálně obsahuje něco přes čtyři tisíce řádků dat.

Pojďme se rychle podívat na to, jak jsou řádky rozděleny mezi naše 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           |
+--------------------+-------------+

Nyní tedy chceme přidat nový oddíl s hraniční hodnotou 500.

V tomto případě rozdělíme oddíl mezi hraniční hodnoty 100 a 10000.

Měl bych zmínit, že Microsoft nedoporučuje rozdělovat obsazené oddíly. Je tedy třeba mít na paměti.

Pro účely tohoto příkladu však rozdělíme oddíl, který obsahuje data.

Rozdělit oddíl

Zde pokračujeme a rozdělíme oddíl.

Používáme ALTER PARTITION FUNCTION příkaz k rozdělení oddílu.

Rozdělením oddílu se však vytvoří dva oddíly z jednoho, a proto se musíme ujistit, že pro nový oddíl existuje skupina souborů. Musíme se také ujistit, že naše schéma rozdělení ví, kterou skupinu souborů použít, když rozdělujeme oddíl.

Můžete použít existující skupinu souborů nebo můžete vytvořit novou.

Pojďme vytvořit nový.

Zde je kód, který můžeme použít ke všemu výše uvedenému:

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

Výsledek:

Commands completed successfully.

Úspěšně jsme rozdělili oddíl.

Ověřte rozdělení

Nyní můžeme ověřit, že funkce oddílu byla upravena tak, aby odrážela nové hraniční hodnoty.

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

Můžeme tedy vidět, že nová hraniční hodnota byla úspěšně přidána.

A takto jsou nyní 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                  | 400         |
| 4                  | 3579        |
| 5                  | 0           |
+--------------------+-------------+

Takže teď máme 5 oddílů.

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.

Rozdělení oddílů, které obsahují data

Jak již bylo zmíněno, Microsoft nedoporučuje rozdělovat 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. Přechod z MySQL 5.7 na MySQL 8.0 – Co byste měli vědět

  2. Porovnání replikačních řešení od Oracle a MySQL

  3. CURRENT_TIMESTAMP v milisekundách

  4. Neuspořádané výsledky v SQL