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 databáze v Microsoft Fabric
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.
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.
Souběžnost úloh můžete zlepšit umožněním eskalace zámků na úrovni oddílu místo na úrovni tabulky. To může omezit kolize zámků v tabulce. Chcete-li omezit obsazenost zámku umožněním eskalace zámku do oddílu, nastavte možnost
LOCK_ESCALATIONpříkazuALTER TABLEnaAUTO.
Komponenty a koncepty
Následující termíny platí pro dělení tabulek a indexů.
Funkce oddílu
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 oddílu definuje počet oddílů a hranice oddílů, které tabulka obsahuje. 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 jsou hraniční hodnoty funkce rozdělení umístěny do výsledných částí:
- Oblast
LEFTurčuje, že hodnota hranice patří do levé strany intervalu hodnot hranic, pokud jsou hodnoty intervalu seřazeny databázovým strojem vzestupně odleva doprava. Tedy, nejvyšší ohraničující hodnota je zahrnuta v partici. - Oblast
RIGHTurčuje, že hodnota hranice patří na pravou stranu intervalu hodnot hranic, pokud jsou hodnoty intervalu seřazeny databázovým strojem vzestupně odleva doprava. Jinými slovy, nejnižší ohraničující hodnota je zahrnuta v části.
Pokud LEFT nebo RIGHT není zadaný, LEFT je typ rozsahu výchozí.
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žívá se typ rozsahu RIGHT, který označuje, že hraniční hodnoty slouží jako dolní mezní hodnoty v každém oddílu.
RIGHT Rozsahy jsou často jednodušší na práci při dělení tabulky na základě sloupce datového typu datetime, datetime2 nebo datetimeoffset, protože řádky s hodnotou půlnoci se ukládají do stejného oddílu jako řádky s pozdějšími hodnotami v rámci stejného dne. Podobně platí, že pokud používáte datový typ datum a používáte oddíly o velikosti jednoho měsíce nebo více, zachovává se RIGHT rozsah dat, který ponechává první den v měsíci ve stejném oddílu jako pozdější dny v tomto měsíci. 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 je rozdělena tabulka nebo index, které používají tuto funkci oddílu při dělení sloupce datecol . 1. února je první hraniční bod definovaný ve funkci. Protože je použit typ rozsahu RIGHT, je 1. únor dolní hranice oddílu 2.
| Partition | 1 | 2 | ... | 11 | 12 |
|---|---|---|---|---|---|
| Values |
Datecol<2022-02-01 12:00AM |
Datecol>= 2022-02-01 12:00AM A 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 |
U obou, RANGE LEFT a RANGE RIGHT, má nejlevější oddíl minimální hodnotu datového typu jako dolní limit a nejpravější oddíl maximální hodnotu datového typu jako horní limit.
Další příklady funkcí dělení používajících typy oblastí LEFT a RIGHT najdete v tématu 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 příklady syntaxe pro vytvoření schémat oddílů v CREATE PARTITION SCHEME.
Filegroups
Existují dva důvody použití schématu oddílů s více skupinami 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ě.
- Každou skupinu souborů můžete zálohovat a obnovovat nezávisle. To znamená, že můžete přeskočit opakované zálohy oddílů, které se nemění, nebo zkrátit dobu obnovení, když je potřeba obnovit jenom data v některých oddílech.
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ů a pokud nepoužíváte vrstvené úložiště, 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é.
Další informace o vytváření skupin souborů v SQL Server a Azure SQL Managed Instance najdete v tématu ALTER DATABASE (Transact-SQL) Možnosti souboru a skupiny souborů.
Dělicí sloupec
Sloupec tabulky nebo indexu, který je vstupem funkce oddílu. Při výběru sloupce dělení platí následující aspekty:
- Počítané sloupce, které se účastní partitionovací funkce, musí být explicitně vytvořeny jako
PERSISTED.- Vzhledem k tomu, že jako sloupec dělení lze použít jenom jeden sloupec, může být v některých případech užitečné zřetězení více sloupců v počítaném sloupci.
- 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ů LOB, jako je ntext, text, image, xml, varchar(max), nvarchar(max) a varbinary(max) nelze zadat.
- Sloupce používající uživatelem definované datové typy CLR a datové typy aliasů nelze zadat.
Chcete-li rozdělit tabulku nebo index, zadejte schéma oddílů a sloupec oddílu v příkazech CREATE TABLE, ALTER TABLE a CREATE INDEX.
Při vytváření neclusterovaného indexu, pokud není zadáno schéma oddílu 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 postaven na stejném schématu oddílů jako odpovídající tabulka, se nazývá zarovnaný index. Když je tabulka a její neclusterované indexy zarovnané, může databázový stroj rychle a efektivně přepínat oddíly v tabulce nebo mimo tabulku při zachování struktury oddílů tabulky i indexů. Index nemusí používat stejnou funkci oddílu, aby byl zarovnaný se svou základní 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í. Když rozdělíte neunikátní shlukovaný index a sloupec pro dělení není explicitně uveden v klíči shlukování, databázový stroj ve výchozím nastavení přidá tento sloupec do seznamu klíčů shlukovaného indexu. Pokud je clusterovaný index jedinečný, musíte do clusterovaného indexového klíče explicitně přidat 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. Index tedy používá funkci oddílu s jinou definicí hranic oddílů nebo používá jiný sloupec dělení. Vytvoření 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ý, neobsahuje sloupec dělení tabulky a musí být zachována jedinečnost indexu.
- Chcete použít alokovaná spojení mezi tabulkou a několika dalšími tabulkami, které mají odlišné rozdělení.
Odstranění oddílů
Když predikát dotazu odkazuje na sloupec dělení, databázový stroj může být schopen odstranit nebo přeskočit některé oddíly při čtení dělené tabulky nebo indexu. To může zlepšit výkon dotazů.
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.
Limitations
Před SQL Serverem 2016 (13.x) SP1 nebyly dělené tabulky a indexy dostupné v každé edici SQL Serveru. Pro seznam funkcí podporovaných edicí v SQL Server viz Edice a podporované funkce SQL Server 2025.
Particionované tabulky a indexy jsou k dispozici ve všech tarifech služby Azure SQL Database, SQL database v prostředí Fabric a ve službě Azure SQL Managed Instance.
- V Azure SQL Database a databázi SQL v systému Fabric musí být všechny oddíly umístěny do
PRIMARYskupiny souborů, protože je k dispozici pouzePRIMARYskupina souborů.
- V Azure SQL Database a databázi SQL v systému Fabric musí být všechny oddíly umístěny do
Dělení tabulek je k dispozici 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.
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. Partition funkce a partition schémata nepatří do schématu.
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
RANGE RIGHTje 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.Databázový stroj podporuje až 15 000 oddílů. 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.
Pokyny k výkonu
Databázový stroj podporuje až 15 000 oddílů na tabulku nebo index. Použití velkého počtu oddílů má ale vliv na paměť, operace dělených indexů, příkazy DBCC, úpravy schématu a výkon dotazů. Tato část popisuje důsledky výkonu návrhů, které zahrnují velký počet oddílů, a poskytuje alternativní řešení podle potřeby.
Výstraha
Pokud váš návrh používá mnoho stovek nebo tisíc oddílů na tabulku nebo index, ujistěte se, že dobře rozumíte výkonovým dopadům, otestujte a ověřte kritické scénáře použití, abyste měli plán pro řešení jakéhokoli dopadu na výkon.
Pokud to není nezbytně nutné, vyhněte se návrhům s počtem oddílů v řádu stovek nebo tisíců.
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í hlavně v případě, že index není zarovnaný se základní tabulkou nebo není zarovnaný s jeho clusterovaným indexem.
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í velikosti výpočetních prostředků databáze, abyste získali 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 může být 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 případě, že 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í proběhne ú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 v operaci sestavení indexu. Čím větší je stupeň paralelismu (DOP), tím vyšší 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 snížit stupeň paralelismu jako alternativní řešení, a to na úkor potenciálně delší doby sestavení indexu.
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ů.
Queries
Po dělení tabulky nebo indexu můžou dotazy používající odstranění oddílů mít srovnatelný nebo vylepšený výkon. 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 a B.
- 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í na sloupci A provede eliminaci partice a prohledá podmnožinu všech particí. 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í TOP, MAXnebo MIN u jiných sloupců než ve sloupci 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í s jedním řádkem nebo prohledávání malého rozsahu, trvá oproti dělené tabulce delší než u tabulky, která není rozdělená do oddílů, pokud predikát dotazu neobsahuje sloupec dělení, protože bude muset provádět 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.
Díky tomu může optimalizátor dotazů spojení zpracovat rychleji, protože spojení zpracovává data z párů kolokovaných partící. 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 tématu $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.
Výpočet statistiky během dělených operací indexu
Když se vytvoří nebo znovu sestaví nepartitionovaný index, databázový engine také vytvoří statistiky indexu prohledáním všech řádků v indexu. Při vytvoření nebo přestavbě děleného indexu se ale statistiky vytvoří pomocí výchozího algoritmu vzorkování.
Pokud chcete vytvořit nebo aktualizovat statistiky pro dělené indexy skenováním většího vzorku nebo všech řádků v tabulce, použijte CREATE STATISTICS nebo UPDATE STATISTICS s klauzulemi SAMPLE nebo FULLSCAN.
Související obsah
- Vytvoření dělených tabulek a indexů
- $PARTITION (Transact-SQL)
- Škálování pomocí Azure SQL Database
- Dělení tabulek ve vyhrazeném fondu SQL
- Průvodce architekturou a návrhem indexu
- 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