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

Výukový program dělení tabulek a oddílů serveru SQL Server

Problém

V tomto článku se zaměříme na demonstraci rozdělení tabulek. Nejjednodušším vysvětlením rozdělení tabulek lze nazvat rozdělení velkých tabulek na malé. Toto téma poskytuje škálovatelnost a spravovatelnost.

Co je rozdělení tabulek na SQL Server?

Předpokládejme, že máme stůl a ten den ode dne roste. V tomto případě může tabulka způsobit určité problémy, které je třeba vyřešit podle níže uvedených kroků:

  • Udržujte tuto tabulku. Bude to trvat dlouho a spotřebuje to více zdrojů (CPU, IO atd.).
  • Zálohujte.
  • Problémy se zamykáním.

Z výše uvedených důvodů potřebujeme rozdělení tabulky. Tento přístup má následující výhody:

  • Možnost správy:Pokud tabulku rozdělíme, můžeme spravovat každý oddíl tabulky. Například můžeme vytvořit pouze jeden oddíl tabulky.
  • Schopnost archivace:Některé oddíly tabulky se používají pouze z tohoto důvodu. Tento oddíl tabulky nemusíme zálohovat. Můžeme použít zálohu skupiny souborů a zálohovat ji pouze změnou oddílu tabulky.
  • Výkon dotazů:Optimalizátor dotazů SQL Server se rozhodne použít odstranění oddílů. Znamená to, že SQL Server neprovádí žádné hledání nesouvisejícího oddílu tabulky.

Vertikální a horizontální rozdělení tabulky na oddíly v SQL Server

Rozdělení tabulek je obecný pojem. Existuje několik typů rozdělení, které fungují pro konkrétní případy. Nejpodstatnější a nejrozšířenější jsou dva přístupy:vertikální dělení a horizontální dělení.

Specifičnost každého typu odráží podstatu tabulky jako struktury sestávající ze sloupců a řádků:

• Vertikální rozdělení rozdělí tabulku na sloupce.
• Horizontální rozdělení rozdělí tabulku na řádky.

Nejtypičtějším příkladem rozdělení vertikální tabulky je tabulka zaměstnanců s jejich podrobnostmi – jména, e-maily, telefonní čísla, adresy, narozeniny, povolání, platy a všechny další informace, které mohou být potřeba. Část těchto údajů je důvěrná. Kromě toho ve většině případů operátoři potřebují pouze některá základní data, jako jsou jména a e-mailové adresy.

Vertikální rozdělení vytváří několik „užších“ tabulek s potřebnými údaji po ruce. Dotazy cílí pouze na konkrétní část. Tímto způsobem podniky snižují zátěž, urychlují úkoly a zajišťují, že důvěrná data nebudou vyzrazena.

Horizontální rozdělení tabulky vede k rozdělení jedné obecné tabulky na několik menších, kde každá tabulka částic má stejný počet sloupců, ale počet řádků je menší. Je to standardní přístup pro nadměrné tabulky s chronologickými údaji.

Například tabulku s údaji za celý rok lze rozdělit na menší části pro každý měsíc nebo týden. Potom se dotaz bude týkat pouze jedné konkrétní menší tabulky. Horizontální dělení zlepšuje škálovatelnost objemů dat s jejich růstem. Rozdělené tabulky zůstanou menší a snadno zpracovatelné.

Jakékoli rozdělení tabulek na serveru SQL by mělo být zváženo opatrně. Někdy si musíte vyžádat data z několika rozdělených tabulek najednou a pak budete potřebovat JOINy ​​v dotazech. Kromě toho může vertikální rozdělení stále vést k velkým tabulkám a budete je muset více rozdělit. Při své práci byste se měli spoléhat na rozhodnutí pro vaše konkrétní obchodní účely.

Nyní, když jsme objasnili koncept rozdělení tabulek na SQL Server, je čas přejít k demonstraci.

Vyhneme se jakémukoli skriptu T-SQL a všechny kroky rozdělení tabulky zvládneme pomocí průvodce rozdělením SQL Serveru.

Co potřebujete k vytvoření oddílů databáze SQL?

  • Ukázková databáze WideWorldImporters
  • SQL Server 2017 Developer Edition

Níže uvedený obrázek nám ukazuje, jak navrhnout rozdělení tabulky. Vytvoříme rozdělení tabulky podle let a najdeme různé skupiny souborů.

V tomto kroku vytvoříme dvě skupiny souborů (FG_2013, FG_2014). Klepněte pravým tlačítkem myši na databázi a potom klepněte na kartu Skupiny souborů.

Nyní připojíme skupiny souborů k novým souborům PDF.

Naše struktura databázového úložiště je připravena na rozdělení tabulek. Najdeme tabulku, kterou chceme rozdělit, a spustíme průvodce vytvořením oddílu.

Na níže uvedeném snímku obrazovky vybereme sloupec, na který chceme použít funkci oddílu. Vybraný sloupec je „Datum faktury“.

Na následujících dvou obrazovkách pojmenujeme funkci oddílu a schéma oddílů.

Funkce oddílu bude definovat, jak provést rozdělení řádků [Prodej].[Faktury] na základě sloupce Datum faktury.

Schéma oddílů bude definovat mapy pro řádky Sales.Invoices na skupiny souborů.

Přiřaďte oddíly skupinám souborů a nastavte hranice.

Left/Right Boundary definuje stranu každého intervalu hraničních hodnot, která může být levá nebo pravá. Nastavíme takto hranice a klikneme na Odhad úložiště. Tato volba nám poskytuje informaci o počtu řádků, které mají být umístěny v hranicích.

A nakonec vybereme možnost Spustit okamžitě a poté klikneme na tlačítko Další.

Jakmile je operace úspěšná, klikněte na Zavřít.

Jak můžete vidět, naše tabulka Sales.Invoices byla rozdělena. Tento dotaz zobrazí podrobnosti o rozdělené tabulce.

SELECT
  OBJECT_SCHEMA_NAME(pstats.object_id) AS SchemaName
  ,OBJECT_NAME(pstats.object_id) AS TableName
  ,ps.name AS PartitionSchemeName
  ,ds.name AS PartitionFilegroupName
  ,pf.name AS PartitionFunctionName
  ,CASE pf.boundary_value_on_right WHEN 0 THEN 'Range Left' ELSE 'Range Right' END AS PartitionFunctionRange
  ,CASE pf.boundary_value_on_right WHEN 0 THEN 'Upper Boundary' ELSE 'Lower Boundary' END AS PartitionBoundary
  ,prv.value AS PartitionBoundaryValue
  ,c.name AS PartitionKey
  ,CASE 
    WHEN pf.boundary_value_on_right = 0 
    THEN c.name + ' > ' + CAST(ISNULL(LAG(prv.value) OVER(PARTITION BY pstats.object_id ORDER BY pstats.object_id, pstats.partition_number), 'Infinity') AS VARCHAR(100)) + ' and ' + c.name + ' <= ' + CAST(ISNULL(prv.value, 'Infinity') AS VARCHAR(100)) 
    ELSE c.name + ' >= ' + CAST(ISNULL(prv.value, 'Infinity') AS VARCHAR(100))  + ' and ' + c.name + ' < ' + CAST(ISNULL(LEAD(prv.value) OVER(PARTITION BY pstats.object_id ORDER BY pstats.object_id, pstats.partition_number), 'Infinity') AS VARCHAR(100))
  END AS PartitionRange
  ,pstats.partition_number AS PartitionNumber
  ,pstats.row_count AS PartitionRowCount
  ,p.data_compression_desc AS DataCompression
FROM sys.dm_db_partition_stats AS pstats
INNER JOIN sys.partitions AS p ON pstats.partition_id = p.partition_id
INNER JOIN sys.destination_data_spaces AS dds ON pstats.partition_number = dds.destination_id
INNER JOIN sys.data_spaces AS ds ON dds.data_space_id = ds.data_space_id
INNER JOIN sys.partition_schemes AS ps ON dds.partition_scheme_id = ps.data_space_id
INNER JOIN sys.partition_functions AS pf ON ps.function_id = pf.function_id
INNER JOIN sys.indexes AS i ON pstats.object_id = i.object_id AND pstats.index_id = i.index_id AND dds.partition_scheme_id = i.data_space_id AND i.type <= 1 /* Heap or Clustered Index */
INNER JOIN sys.index_columns AS ic ON i.index_id = ic.index_id AND i.object_id = ic.object_id AND ic.partition_ordinal > 0
INNER JOIN sys.columns AS c ON pstats.object_id = c.object_id AND ic.column_id = c.column_id
LEFT JOIN sys.partition_range_values AS prv ON pf.function_id = prv.function_id AND pstats.partition_number = (CASE pf.boundary_value_on_right WHEN 0 THEN prv.boundary_id ELSE (prv.boundary_id+1) END)
WHERE pstats.object_id = OBJECT_ID('Sales.Invoices')
ORDER BY TableName, PartitionNumber;

MS Výkon rozdělování SQL Serveru

Porovnáme výkon dělené a nerozdělené tabulky pro stejnou tabulku. Chcete-li to provést, použijte níže uvedený dotaz a aktivujte Zahrnout skutečný plán provedení.

DECLARE @Dt as date  = '20131231'
SELECT COUNT(InvoiceDate)
  FROM [Sales].[Invoices]
  where InvoiceDate < @Dt

Když prozkoumáme plán provádění, zjistíme, že zahrnuje vlastnosti „Rozdělený“, „Aktuální počet oddílů“ a „Skutečný přístup k oddílům“.

Vlastnost dělená označuje, že tato tabulka je povolena pro oddíl.

Skutečný počet oddílů vlastnost je celkový počet oddílů, které čte stroj SQL Server.

Aktuální přístup k rozdělení vlastnost je čísla oddílů vyhodnocená strojem SQL Server. SQL Server eliminuje přístup pro jiné oddíly, jak se tomu říká eliminace oddílu, a získává výhodu ve výkonu dotazů.

Nyní se podívejte na plán provádění nerozdělené tabulky.

Hlavní rozdíl mezi těmito dvěma plány provádění je Počet přečtených řádků protože tato vlastnost udává, kolik řádků je pro tento dotaz přečteno. Jak můžete vidět z níže uvedeného grafu komprese, hodnoty rozdělené tabulky jsou příliš nízké. Z tohoto důvodu bude spotřebovávat nízkou IO.

Dále spusťte dotaz a prozkoumejte plán provádění.

DECLARE @DtBeg as date  = '20140502'
DECLARE @DtEnd as date  = '20140701'

SELECT COUNT(InvoiceDate)
  FROM [Sales].[Invoices]
  where InvoiceDate between @DtBeg and @DtEnd

Eskalace uzamčení na úrovni oddílu

Eskalace uzamčení je mechanismus, který používá SQL Server Lock Manager. Zajistí uzamčení úrovně objektů. Když se počet řádků k uzamčení zvýší, správce zámků změní zamykací objekt. Toto je úroveň hierarchie eskalace zámku „Řádek -> Stránka -> Tabulka -> Databáze“. Ale v rozdělené tabulce můžeme zamknout jeden oddíl, protože to zvyšuje souběžnost a výkon. Výchozí úroveň eskalace uzamčení je na serveru SQL „TABLE“.

Proveďte dotaz pomocí níže uvedeného příkazu UPDATE.

BEGIN TRAN
DECLARE @Dt as date  = '20131221'
UPDATE [Sales].[Invoices] SET CreditNoteReason = 'xxx'   where InvoiceDate < @Dt
SP_LOCK

Červené pole definuje exkluzivní zámek, který zajišťuje, že nelze provést více aktualizací stejného zdroje současně. Vyskytuje se v tabulce Faktury.

Nyní nastavíme režim eskalace pro tabulku Sales.Invoices, abychom ji zautomatizovali, a znovu spustíme dotaz.

ALTER TABLE Sales.Invoices SET (LOCK_ESCALATION = AUTO)

Nyní červený rámeček definuje výhradní zámek odsazení, který chrání požadované nebo získané výhradní zámky u některých zdrojů níže v hierarchii. Krátce nám tato úroveň zámku umožňuje aktualizovat nebo smazat další oddíly tabulek. To znamená, že můžeme spustit další aktualizaci nebo vložit jiný oddíl tabulky.

V předchozích příspěvcích jsme také prozkoumali problém přepínání mezi rozdělením tabulek a poskytli návod. Tyto informace vám mohou pomoci, pokud budete řešit tyto případy. Další informace naleznete v článku.

Odkazy

  1. Režimy uzamčení
  2. Dělené tabulky a indexy

  1. Přidružování tabulek pomocí databáze místností v Android Studiu

  2. Jak vygenerovat GUID v Oracle?

  3. Mysql:jak vybrat skupiny s určitými hodnotami?

  4. Jak RANK() funguje v SQL Server