Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro: SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL Server, Azure SQL Database a Azure SQL Managed Instance podporují dělení tabulek a indexů. Data dělených tabulek a indexů jsou rozdělena do jednotek, které mohou být rozloženy do více než jedné skupiny souborů v databázi nebo uloženy v jedné skupině souborů. Pokud ve skupině souborů existuje více souborů, data se šíří mezi soubory pomocí algoritmu proporcionální výplně. Data jsou rozdělena vodorovně, takže skupiny řádků se mapují na jednotlivé oddíly. Všechny oddíly jednoho indexu nebo tabulky se musí nacházet ve stejné databázi. Tabulka nebo index se považuje za jedinou logickou entitu při dotazech nebo aktualizacích provedených s daty.
Před SQL Serverem 2016 (13.x) SP1 nebyly dělené tabulky a indexy dostupné v každé edici SQL Serveru. Seznam funkcí podporovaných edicemi SQL Serveru najdete v tématu Edice a podporované funkce SYSTÉMU SQL Server 2022. Dělené tabulky a indexy jsou k dispozici ve všech úrovních služby Azure SQL Database a Azure SQL Managed Instance.
Dělení tabulek je k dispozici také ve vyhrazených fondech SQL ve službě Azure Synapse Analytics s některými rozdíly v syntaxi. Další informace najdete v Dělení tabulek ve vyhrazeném fondu SQL.
Důležité
Databázový stroj ve výchozím nastavení podporuje až 15 000 particí. Ve verzích starších než SQL Server 2012 (11.x) byl počet oddílů ve výchozím nastavení omezen na 1 000.
Výhody dělení
Rozdělení velkých tabulek nebo indexů může mít následující výhody správy a výkonu.
K podmnožinám dat můžete rychle a efektivně přistupovat a přitom zachovat integritu shromažďování dat. Například operace, jako je načtení dat z OLTP do systému OLAP, trvá jenom několik sekund, místo minut a hodin, které operace trvá, když data nejsou rozdělená na oddíly.
Operace údržby nebo uchovávání dat můžete provádět rychleji v jednom nebo několika oddílech. Operace jsou efektivnější, protože cílí pouze na tyto podmnožiny dat, nikoli na celou tabulku. Můžete například zkomprimovat data v jednom nebo více oddílech, znovu sestavit jeden nebo více oddílů indexu nebo zkrátit data v jednom oddílu. Můžete také přepnout jednotlivé oddíly z jedné tabulky a do archivační tabulky.
Výkon dotazů můžete zlepšit na základě typů dotazů, které často spouštíte. Optimalizátor dotazů může například zpracovávat dotazy equijoin mezi dvěma nebo více dělenými tabulkami rychleji, když jsou sloupce dělení stejné jako sloupce, na kterých jsou tabulky spojené. Další informace najdete v části Dotazy.
Výkon můžete zlepšit povolením zvyšování úrovně zámků na úrovni oddílu místo celé tabulky. To může omezit kolize zámků v tabulce. Pokud chcete omezit souběh zámků tím, že povolíte eskalaci zámku do oddílu, nastavte možnost ALTER TABLE
příkazu LOCK_ESCALATION
na AUTO.
Komponenty a koncepty
Následující termíny platí pro dělení tabulek a indexů.
Funkce Partition
Funkce oddílu je databázový objekt, který definuje, jak se řádky tabulky nebo indexu mapují na sadu oddílů na základě hodnot určitého sloupce označovaného jako sloupec dělení. Každá hodnota ve sloupci dělení je vstupem funkce dělení, která vrací hodnotu partice.
Funkce rozdělení definuje počet partíc a hranice partíc, které tabulka bude mít. Například vzhledem k tabulce, která obsahuje data prodejní objednávky, můžete tabulku rozdělit na 12 (měsíční) oddíly na základě sloupce datetime , jako je například datum prodeje.
Typ rozsahu (LEFT nebo RIGHT) určuje, jak budou hraniční hodnoty funkce dělení přiřazeny výsledným oddílům:
- Oblast VLEVO určuje, že hodnota hranice patří do levé strany intervalu hodnot hranic, pokud jsou hodnoty intervalu seřazeny databázovým strojem vzestupně odleva doprava. Jinými slovy, nejvyšší ohraničující hodnota bude zahrnuta do partice.
- Oblast VPRAVO určuje, že hodnota hranice patří do pravé strany intervalu hraniční hodnoty, pokud jsou hodnoty intervalu seřazeny databázovým enginem vzestupně zleva doprava. Jinými slovy, nejnižší ohraničující hodnota bude zahrnuta do každé části.
Pokud není zadána hodnota LEFT nebo RIGHT, je výchozí oblast LEFT.
Například následující partiční funkce rozdělí tabulku nebo index do 12 oddílů, jeden pro každý měsíc v rámci jednoho roku ve sloupci datetime. Použije se oblast RIGHT, což označuje, že mezní hodnoty budou sloužit jako dolní hranice v každé části. Při dělení tabulky na základě rozsahů typu RIGHT podle sloupce datových typů datetime nebo datetime2 je často jednodušší pracovat, protože řádky s hodnotou půlnoci budou uloženy ve stejném oddílu jako řádky s pozdějšími hodnotami během téhož dne. Podobně platí, že pokud používáte datový typ datum a používáte oddíly delší než jeden měsíc, rozsah RIGHT zachová první den v měsíci ve stejném oddílu jako následující dny toho měsíce. To pomáhá při přesné eliminaci oddílů při dotazu na celodenní data.
CREATE PARTITION FUNCTION [myDateRangePF1] (datetime)
AS RANGE RIGHT FOR VALUES ('2022-02-01', '2022-03-01', '2022-04-01',
'2022-05-01', '2022-06-01', '2022-07-01', '2022-08-01',
'2022-09-01', '2022-10-01', '2022-11-01', '2022-12-01');
Následující tabulka ukazuje, jak by se dělila tabulka nebo index, které tuto funkci oddílu používají při dělení sloupce datecol . 1. února je první hraniční bod definovaný ve funkci, takže funguje jako dolní hranice oddílu 2.
Oddíl | 1 | 2 | ... | 11 | 12 |
---|---|---|---|---|---|
Hodnoty |
datecol<2022-02-01 12:00AM |
datecol>= 2022-02-01 12:00AM AND datecol<2022-03-01 12:00AM |
datecol>= 2022-11-01 12:00AM A col1<2022-12-01 12:00AM |
datecol>= 2022-12-01 12:00AM |
Pro oblast ROZSAH VLEVO i ROZSAH VPRAVO má nejlevější oddíl minimální hodnotu datového typu jako dolní limit a nejpravější oddíl má maximální hodnotu datového typu jako horní limit.
Další příklady funkcí oddílů LEFT a RIGHT najdete v části CREATE PARTITION FUNCTION.
Schéma oddílů
Schéma oddílů je databázový objekt, který mapuje oddíly funkce oddílu na jednu skupinu souborů nebo na více skupin souborů.
Najděte ukázku syntaxe pro vytváření schémat oddílů v příkazu CREATE PARTITION SCHEME.
Skupiny souborů
Primárním důvodem pro umístění oddílů do více skupin souborů je zajistit, abyste mohli nezávisle provádět operace zálohování a obnovení oddílů. Důvodem je to, že můžete provádět zálohy pro jednotlivé skupiny souborů. Při použití vrstveného úložiště vám použití více skupin souborů umožňuje přiřadit konkrétní oddíly konkrétním úrovním úložiště, například umístit starší a méně často používané oddíly na pomalejší a levnější úložiště. Všechny ostatní výhody dělení platí bez ohledu na počet použitých skupin souborů nebo umístění oddílů u konkrétních skupin souborů.
Správa souborů a skupin souborů pro dělené tabulky může v průběhu času výrazně kompliovat úlohy správy. Pokud vaše postupy zálohování a obnovení nemají prospěch z použití více skupin souborů, doporučuje se jedna skupina souborů pro všechny oddíly. Stejná pravidla pro navrhování souborů a skupin souborů platí pro dělené objekty, které platí pro objekty, které nejsou rozdělené.
Poznámka:
Dělení není v Azure SQL Database plně podporované. Protože se ve službě Azure SQL Database podporuje jenom PRIMARY
skupina souborů, musí být všechny oddíly umístěné ve skupině PRIMARY
souborů.
Najděte ukázkový kód pro vytváření skupin souborů pro SQL Server a službu Azure SQL Managed Instance v možnostech ALTER DATABASE (Transact-SQL) a skupin souborů.
Dělení sloupce
Sloupec tabulky nebo indexu, který funkce oddílu používá k rozdělení tabulky nebo indexu. Při výběru sloupce dělení platí následující aspekty:
- Výpočtové sloupce, které se účastní dělící funkce, musí být explicitně vytvořeny jako PERSISTED.
- Vzhledem k tomu, že jako sloupec oddílu lze použít jen jeden sloupec, může být v některých případech praktické zřetězit více sloupců pomocí počítaného sloupce.
- Sloupce všech datových typů, které jsou platné pro použití jako sloupce klíče indexu, lze použít jako sloupec dělení s výjimkou časového razítka.
- Sloupce velkých datových typů objektu (LOB), například ntext, text, obrázek, xml, varchar(max), nvarchar(max), a varbinary(max), nelze zadat.
- Nelze zadat sloupce datových typů definovaných uživatelem a aliasů v modulu CLR (Common Language Runtime) systému Microsoft .NET Framework.
Chcete-li rozdělit objekt, zadejte schéma oddílů a dělení sloupce v příkazech CREATE TABLE, ALTER TABLE a CREATE INDEX .
Pokud při vytváření neclusterovaného indexu není zadaný partition_scheme_name nebo skupina souborů a tabulka je rozdělená na oddíly, index se umístí do stejného schématu oddílů pomocí stejného sloupce dělení jako podkladová tabulka. Pokud chcete změnit způsob dělení existujícího indexu, použijte create INDEX s klauzulí DROP_EXISTING. Díky tomu můžete rozdělit nerozdělený index, změnit dělený index na nerozdělený nebo změnit schéma oddílů indexu.
Zarovnaný index
Index, který je vytvořen podle stejného schématu oddílů jako odpovídající tabulka. Když je tabulka a její indexy v zarovnání, může databázový stroj rychle a efektivně přepínat oddíly v tabulce nebo mimo tuto tabulku a současně udržovat strukturu oddílů tabulky i jeho indexů. Index nemusí být součástí téže pojmenované funkce oddílu, aby byl zarovnaný se svou zdrojovou tabulkou. Funkce oddílování indexu a základní tabulky musí být v podstatě stejné v tom smyslu, že:
- Argumenty funkcí dělení mají stejný datový typ.
- Definují stejný počet oddílů.
- Definují stejné hodnoty hranic pro oddíly.
Dělení clusterovaných indexů
Při dělení clusterovaného indexu musí klíč clusteringu obsahovat sloupec dělení. Při dělení neunikátního clusterovaného indexu a sloupec oddílu není explicitně zadaný v klíči seskupení, databázový stroj přidá sloupec oddílu ve výchozím nastavení do seznamu clusterovaných indexových klíčů. Pokud je clusterovaný index jedinečný, musíte explicitně zadat, že clusterovaný indexový klíč obsahuje sloupec dělení. Další informace o clusterovaných indexech a architektuře indexů najdete v tématu Pokyny pro návrh clusterovaného indexu.
Dělení neclusterovaných indexů
Při dělení jedinečného neclusterovaného indexu musí klíč indexu obsahovat sloupec dělení. Při dělení neclusterovaného indexu přidá databázový stroj ve výchozím nastavení sloupec dělení jako neklíčový (zahrnutý) sloupec indexu, aby se zajistilo, že je index zarovnaný se základní tabulkou. Databázový stroj nepřidá do indexu sloupec dělení, pokud už je v indexu. Další informace o neclusterovaných indexech a architektuře indexů najdete v tématu Pokyny k návrhu neclusterovaného indexu.
Nerovnaný index
Index, který není zarovnaný, je rozdělený na oddíly odlišně od odpovídající tabulky. To znamená, že index má jiné schéma oddílů , které ho umístí do samostatné skupiny souborů nebo sady skupin souborů ze základní tabulky. Návrh nerovnaného děleného indexu může být užitečný v následujících případech:
- Základní tabulka nebyla rozčleněna.
- Klíč indexu je jedinečný a neobsahuje sloupec dělení tabulky.
- Chcete, aby se základní tabulka účastnila kolacovaných spojení s více tabulkami pomocí různých sloupců spojení.
Odstranění oddílů
Proces, podle kterého optimalizátor dotazů přistupuje pouze k relevantním oddílům, aby splňoval kritéria filtru dotazu.
Přečtěte si další informace o odstranění oddílů a souvisejících konceptech v vylepšeních zpracování dotazů v dělených tabulkách a indexech.
Omezení
Rozsah funkce oddílu a schématu je omezen na databázi, ve které byly vytvořeny. V databázi se podílové funkce nacházejí v odlišném oboru názvů než ostatní funkce.
Pokud některé řádky v dělené tabulce mají ve sloupci dělení hodnoty NUL, umístí se tyto řádky do levého oddílu. Pokud je však hodnota NULL zadána jako první hodnota hranice a funkce RANGE RIGHT je zadána v definici funkce oddílu, zůstane levý oddíl prázdný a hodnoty NULLs se umístí do druhého oddílu.
Pokyny k výkonu
Databázový stroj podporuje až 15 000 oddílů na tabulku nebo index. Použití více než 1 000 oddílů ale má vliv na paměť, operace dělených indexů, příkazy DBCC a dotazy. Tato část popisuje dopady na výkon při používání více než 1 000 oddílů a podle potřeby poskytuje alternativní řešení.
S až 15 000 oddíly povolenými pro každou dělenou tabulku nebo index můžete ukládat data po dlouhou dobu v jedné tabulce. Data byste ale měli uchovávat pouze po dobu, kdy jsou potřebná, a udržujte rovnováhu mezi výkonem a počtem oddílů.
Využití paměti a pokyny
Pokud se používá velký počet oddílů, doporučujeme použít alespoň 16 GB paměti RAM. Pokud systém nemá dostatek paměti, můžou selhat příkazy jazyka DML (Data Manipulation Language), příkazy DDL (Data Definition Language) a další operace kvůli nedostatku paměti. Systémy s 16 GB paměti RAM, na kterých běží mnoho procesů náročných na paměť, můžou na operacích, které běží na velkém počtu oddílů, docházet k nedostatku paměti. Proto čím více paměti máte více než 16 GB, tím méně pravděpodobné budou problémy s výkonem a pamětí.
Omezení paměti můžou ovlivnit výkon nebo schopnost databázového stroje vytvořit dělený index. To platí zejména v případě, že index není zarovnaný se základní tabulkou nebo není zarovnaný s clusterovaným indexem, pokud tabulka již obsahuje clusterovaný index.
V SQL Serveru a Azure SQL Managed Instance můžete zvýšit možnost konfigurace serveru index create memory (KB)
. Další informace naleznete v tématu Konfigurace serveru: vytvoření paměti indexu. U služby Azure SQL Database zvažte dočasné nebo trvalé zvýšení cíle na úrovni služby pro databázi na webu Azure Portal, aby se přidělila více paměti.
Dělené operace indexu
Vytváření a opětovné sestavení nerovnaných indexů v tabulce s více než 1 000 oddíly je možné, ale nepodporuje se. To může způsobit snížení výkonu nebo nadměrné využití paměti během těchto operací.
Vytváření a opětovné sestavování zarovnaných indexů může trvat déle, když se zvýší počet oddílů. Doporučujeme nespouštět více příkazů pro vytváření a opětovné sestavení indexu najednou, protože může docházet k problémům s výkonem a pamětí.
Když databázový stroj provádí řazení pro sestavení dělených indexů, nejprve vytvoří jednu tabulku řazení pro každý oddíl. Potom sestaví tabulky řazení buď v příslušné skupině souborů každého oddílu, nebo v tempdb
, pokud je zadána možnost indexu SORT_IN_TEMPDB. Každá tabulka řazení vyžaduje k sestavení minimální množství paměti. Při vytváření děleného indexu, který je zarovnaný s její základní tabulkou, se tabulky řazení sestavují po jednom a využívají méně paměti. Když ale vytváříte nerovný dělený index, tabulky řazení se sestaví současně. V důsledku toho musí být dostatek paměti pro zpracování těchto souběžných řazení. Čím větší je počet oddílů, tím více paměti je potřeba. Minimální velikost každé tabulky řazení pro každý oddíl je 40 stránek s 8 kilobajtů na stránku. Například nerovnaný dělený index s 100 oddíly vyžaduje dostatečnou paměť pro sériové řazení 4 000 (40 × 100) stránek najednou. Pokud je tato paměť dostupná, operace sestavení bude úspěšná, ale může dojít k snížení výkonu. Pokud tato paměť není dostupná, operace sestavení selže. Případně zarovnaný dělený index s 100 oddíly vyžaduje k seřazení 40 stránek pouze dostatek paměti, protože řazení se neprovádí současně.
U zarovnaných i nerovnaných indexů může být požadavek na paměť větší, pokud databázový stroj používá paralelismus dotazu na operaci sestavení v počítači s více procesory. Důvodem je, že větší stupeň paralelismu (DOP), tím větší je požadavek na paměť. Pokud například databázový stroj nastaví DOP na 4, nezarovnaný dělený index s 100 oddíly vyžaduje dostatečnou paměť pro čtyři procesory pro řazení 4 000 stránek najednou nebo 16 000 stránek. Pokud je dělený index zarovnaný, požadavek na paměť se sníží na čtyři procesory seřadící 40 stránek nebo 160 (4 × 40) stránek. Pomocí možnosti indexu MAXDOP můžete ručně snížit stupně paralelismu.
Příkazy DBCC
S větším počtem oddílů může provádění příkazů DBCC, jako je DBCC CHECKDB a DBCC CHECKTABLE , trvat déle, protože se zvyšuje počet oddílů.
Dotazy
Po rozdělení tabulky nebo indexu mohou dotazy používající eliminaci oddílů dosáhnout srovnatelného nebo lepšího výkonu při větším počtu oddílů. Dotazy, které nepoužívají odstranění oddílů, by mohly trvat delší dobu, než se zvýší počet oddílů.
Předpokládejme například, že tabulka má 100 milionů řádků a sloupců A
, B
a C
.
- Ve scénáři 1 je tabulka rozdělena na 1 000 oddílů podle sloupce
A
. - Ve scénáři 2 je tabulka rozdělena do 10 000 oddílů podle sloupce
A
.
Dotaz na tabulku s WHERE
klauzulí filtrující sloupec A
provede odstranění oddílu a prohledá jeden oddíl. Stejný dotaz může ve scénáři 2 běžet rychleji, protože v partici je méně řádků. Dotaz, který má WHERE
klauzuli filtrující sloupec B, prohledá všechny oddíly. Dotaz může běžet rychleji ve scénáři 1 než ve scénáři 2, protože je méně oddílů ke skenování.
Dotazy, které používají operátory, jako je TOP nebo MAX/MIN u jiných sloupců než u sloupce dělení, můžou mít nižší výkon při dělení, protože je potřeba vyhodnotit všechny oddíly.
Podobně dotaz, který provádí vyhledávání v jednom řádku nebo prohledávání malého rozsahu, bude trvat déle u tabulky, která je rozdělená do oddílů, než u tabulky, která není, pokud predikát dotazu neobsahuje sloupec dělení, protože bude muset provést tolik hledání nebo prohledávání, kolik je oddílů. Z tohoto důvodu dělení zřídka zvyšuje výkon v systémech OLTP, kde jsou tyto dotazy běžné.
Pokud často spouštíte dotazy, které zahrnují ekvijoin mezi dvěma nebo více particionovanými tabulkami, měly by být jejich partiční sloupce stejné jako sloupce, na kterých jsou tabulky spojeny. Kromě toho by měly být tabulky nebo jejich indexy spoluumístěny. To znamená, že buď používají stejnou funkci oddílu pojmenovanou stejně, nebo používají různé funkce oddílů, které jsou v podstatě totožné, protože:
- Mají stejný počet parametrů, které se používají k dělení, a odpovídající parametry jsou stejné datové typy.
- Definujte stejný počet oddílů.
- Definujte stejné hodnoty hranic pro oddíly.
Optimalizátor dotazů tak může spojení zpracovat rychleji, protože samotné oddíly se dají připojit. Pokud dotaz spojí dvě tabulky, které nejsou umístěné nebo nejsou rozdělené na spojovacím poli, může přítomnost rozdělení ve skutečnosti zpomalit zpracování dotazů místo jeho zrychlení.
V některých dotazech může být užitečné použít $PARTITION
. Další informace najdete v $PARTITION.
Další informace o zpracování oddílů při zpracování dotazů, včetně strategie paralelního spouštění dotazů pro dělené tabulky a indexy, a další osvědčené postupy najdete v tématu Vylepšení zpracování dotazů v dělených tabulkách a indexech.
Změny chování při výpočtech statistiky během operací dělených indexů
Ve službě Azure SQL Database, Azure SQL Managed Instance a SQL Server 2012 (11.x) a vyšších verzích se statistiky nevytvářejí prohledáváním všech řádků v tabulce při vytvoření nebo obnovení partičního indexu. Místo toho optimalizátor dotazů používá k vygenerování statistik výchozí algoritmus vzorkování.
Po upgradu databáze s dělenými indexy z verze SQL Serveru nižší než 2012 (11.x) si můžete všimnout rozdílu v datech histogramu pro tyto indexy. Tato změna chování může ovlivnit výkon dotazů. Pokud chcete získat statistiky o dělených indexech prohledáváním všech řádků v tabulce, použijte CREATE STATISTICS
nebo UPDATE STATISTICS
s klauzulí FULLSCAN
.
Související obsah
- Vytvoření dělených tabulek a indexů
- $PARTITION (Transact-SQL)
- Horizontální navýšení kapacity s Azure SQL Database
- Dělení tabulek ve vyhrazeném fondu SQL
- Průvodce architekturou a návrhem indexů pro SQL Server a Azure SQL
- Dělené strategie tabulek a indexů pomocí SQL Serveru 2008
- Implementace automatického posuvného okna
- Hromadné načítání do dělené tabulky
- Vylepšení zpracování dotazů u dělených tabulek a indexů
- Nejlepších 10 osvědčených postupů pro vytváření rozsáhlého relačního datového skladu