Teljesítmény-finomhangolás rendezett fürtözött oszlopcentrikus index használatával
A következőkre vonatkozik: Azure Synapse Analytics dedikált SQL-készlet, SQL Server 2022 (16.x) és újabb verziók
Amikor a felhasználók egy dedikált SQL-készletben lévő oszlopcentrikus táblát kérdeznek le, az optimalizáló ellenőrzi az egyes szegmensekben tárolt minimális és maximális értékeket. A lekérdezési predikátum határain kívül eső szegmensek nem lesznek beolvasva a lemezről a memóriába. A lekérdezések gyorsabban befejeződhetnek, ha az olvasandó szegmensek száma és a teljes méretük kicsi.
Rendezett és nem rendezett fürtözött oszlopcentrikus index
Alapértelmezés szerint minden indexbeállítás nélkül létrehozott tábla esetében egy belső összetevő (indexszerkesztő) létrehoz egy nem rendezett fürtözött oszlopcentrikus indexet (CCI). Az egyes oszlopokban lévő adatok külön CCI sorcsoport-szegmensbe lesznek tömörítve. Az egyes szegmensek értéktartományában vannak metaadatok, így a lekérdezési predikátum határain kívül eső szegmensek nem lesznek beolvasva a lemezről a lekérdezés végrehajtása során. A CCI a legmagasabb szintű adattömörítést biztosítja, és csökkenti az olvasási szegmensek méretét, hogy a lekérdezések gyorsabban fussanak. Mivel azonban az indexszerkesztő nem rendezi az adatokat, mielőtt szegmensekbe tömörítené őket, egymást átfedő értéktartományokkal rendelkező szegmensek fordulhatnak elő, így a lekérdezések több szegmenst olvasnak be a lemezről, és tovább tart a befejezésük.
Rendezett fürtözött oszlopcentrikus indexek a hatékony szegmenseliiminálás engedélyezésével, ami sokkal gyorsabb teljesítményt eredményez azáltal, hogy kihagy nagy mennyiségű rendezett adatot, amelyek nem felelnek meg a lekérdezési predikátumnak. Rendezett CCI létrehozásakor a dedikált SQL-készletmotor a rendelési kulcs(ok) alapján rendezi a meglévő adatokat a memóriában, mielőtt az indexszerkesztő indexszegmensekbe tömörítené őket. A rendezett adatok esetében a szegmensek átfedése csökken, így a lekérdezések hatékonyabb szegmenseliminálást és ezáltal gyorsabb teljesítményt eredményeznek, mivel a lemezről beolvasandó szegmensek száma kisebb. Ha az összes adat egyszerre rendezhető a memóriában, akkor elkerülhető a szegmensek átfedése. Az adattárházakban lévő nagy táblák miatt ez a forgatókönyv nem gyakran fordul elő.
Egy oszlop szegmenstartományainak ellenőrzéséhez futtassa a következő parancsot a tábla nevével és az oszlop nevével:
SELECT o.name, pnp.index_id,
cls.row_count, pnp.data_compression_desc,
pnp.pdw_node_id, pnp.distribution_id, cls.segment_id,
cls.column_id,
cls.min_data_id, cls.max_data_id,
cls.max_data_id-cls.min_data_id as difference
FROM sys.pdw_nodes_partitions AS pnp
JOIN sys.pdw_nodes_tables AS Ntables ON pnp.object_id = NTables.object_id AND pnp.pdw_node_id = NTables.pdw_node_id
JOIN sys.pdw_table_mappings AS Tmap ON NTables.name = TMap.physical_name AND substring(TMap.physical_name,40, 10) = pnp.distribution_id
JOIN sys.objects AS o ON TMap.object_id = o.object_id
JOIN sys.pdw_nodes_column_store_segments AS cls ON pnp.partition_id = cls.partition_id AND pnp.distribution_id = cls.distribution_id
JOIN sys.columns as cols ON o.object_id = cols.object_id AND cls.column_id = cols.column_id
WHERE o.name = '<Table Name>' and cols.name = '<Column Name>' and TMap.physical_name not like '%HdTable%'
ORDER BY o.name, pnp.distribution_id, cls.min_data_id;
Megjegyzés
Egy rendezett CCI-táblában az ugyanazon DML- vagy adatbetöltési műveletekből származó új adatok az adott kötegen belül vannak rendezve, a tábla összes adata között nincs globális rendezés. A felhasználók újraépíthetik a rendezett CCI-t a tábla összes adatának rendezéséhez. A dedikált SQL-készletben az oszlopcentrikus index REBUILD egy offline művelet. Particionált tábla esetén a REBUILD egy partíciót hoz létre egyszerre. Az újraépített partícióban lévő adatok "offline" állapotban vannak, és nem érhetők el, amíg a REBUILD be nem fejeződik az adott partícióhoz.
Lekérdezési teljesítmény
A lekérdezések rendezett CCI-ből származó teljesítménynövekedése a lekérdezési mintáktól, az adatok méretétől, az adatok rendezettségétől, a szegmensek fizikai szerkezetétől, valamint a lekérdezés végrehajtásához kiválasztott DWU- és erőforrásosztálytól függ. A felhasználóknak érdemes áttekinteniük ezeket a tényezőket, mielőtt kiválasztanák a rendezési oszlopokat egy rendezett CCI-tábla tervezésekor.
Az összes ilyen mintával rendelkező lekérdezések általában gyorsabban futnak a rendezett CCI-vel.
- A lekérdezések egyenlőségi, egyenlőtlenségi vagy tartománypredikátumokkal rendelkeznek
- A predikátumoszlopok és a rendezett CCI-oszlopok megegyeznek.
Ebben a példában a T1 tábla egy fürtözött oszlopcentrikus indexet tartalmaz, amely Col_C, Col_B és Col_A sorrendben van rendezve.
CREATE CLUSTERED COLUMNSTORE INDEX MyOrderedCCI ON T1
ORDER (Col_C, Col_B, Col_A);
Az 1. lekérdezés és a 2. lekérdezés teljesítménye jobban kihasználhatja a rendezett CCI-t, mint a többi lekérdezést, mivel az összes rendezett CCI-oszlopra hivatkoznak.
-- Query #1:
SELECT * FROM T1 WHERE Col_C = 'c' AND Col_B = 'b' AND Col_A = 'a';
-- Query #2
SELECT * FROM T1 WHERE Col_B = 'b' AND Col_C = 'c' AND Col_A = 'a';
-- Query #3
SELECT * FROM T1 WHERE Col_B = 'b' AND Col_A = 'a';
-- Query #4
SELECT * FROM T1 WHERE Col_A = 'a' AND Col_C = 'c';
Adatbetöltési teljesítmény
A rendezett CCI-táblába való adatbetöltés teljesítménye hasonló a particionált táblákhoz. Az adatok rendezett CCI-táblába való betöltése hosszabb időt vehet igénybe, mint a nem rendezett CCI-táblák az adatrendezési művelet miatt, de a lekérdezések később gyorsabban futhatnak a rendezett CCI-vel.
Íme egy példa az adatok különböző sémákkal rendelkező táblákba való betöltésének teljesítmény-összehasonlítására.
Íme egy példa a CCI és a rendezett CCI lekérdezési teljesítményének összehasonlítására.
Szegmens átfedésének csökkentése
Az egymást átfedő szegmensek száma a rendezendő adatok méretétől, a rendelkezésre álló memóriától és a maximális párhuzamossági foktól (MAXDOP) függ a rendezett CCI-létrehozás során. A következő stratégiák csökkentik a szegmensek átfedését a rendezett CCI létrehozásakor.
Használjon
xlargerc
erőforrásosztályt egy magasabb szintű DWU-n, hogy több memóriát biztosíthasson az adatrendezéshez, mielőtt az indexszerkesztő szegmensekbe tömörítené az adatokat. Az indexszegmensben az adatok fizikai helye nem módosítható. Nincs adatrendezés egy szegmensen belül vagy szegmensek között.Rendezett CCI létrehozása a paranccsal
OPTION (MAXDOP = 1)
. A rendezett CCI-létrehozáshoz használt szálak az adatok egy részhalmazán működnek, és helyileg rendezik őket. Nincs globális rendezés a különböző szálak szerint rendezett adatok között. A párhuzamos szálak használata csökkentheti a rendezett CCI-k létrehozásának idejét, de több egymást átfedő szegmenst eredményez, mint egyetlen szál használata. Egyetlen szálláncos művelettel a legmagasabb tömörítési minőséget biztosítja. Például:
CREATE TABLE Table1 WITH (DISTRIBUTION = HASH(c1), CLUSTERED COLUMNSTORE INDEX ORDER(c1) )
AS SELECT * FROM ExampleTable
OPTION (MAXDOP 1);
Megjegyzés
Jelenleg az Azure Synapse Analytics dedikált SQL-készleteiben a MAXDOP beállítás csak a parancs használatával CREATE TABLE AS SELECT
rendezett CCI-tábla létrehozásához támogatott. A rendezett CCI-k vagy CREATE TABLE
parancsok használatával CREATE INDEX
történő létrehozása nem támogatja a MAXDOP beállítást. Ez a korlátozás nem vonatkozik SQL Server 2022-SQL Server és újabb verziókra, ahol megadhatja a MAXDOP-t a vagy CREATE TABLE
parancsokkalCREATE INDEX
.
- Rendezze előre az adatokat a rendezési kulcs(ok) alapján, mielőtt betöltené őket a táblákba.
Íme egy példa egy rendezett CCI-táblaeloszlásra, amelynek nulla szegmense átfedésben van a fenti javaslatok alapján. A rendezett CCI-tábla egy DWU1000c adatbázisban jön létre CTAS-en keresztül egy 20 GB-os halomtáblából a MAXDOP 1 és xlargerc
a használatával. A CCI egy BIGINT oszlopra van rendezve, ismétlődések nélkül.
Rendezett CCI létrehozása nagy táblákon
A rendezett CCI létrehozása offline művelet. Partíció nélküli táblák esetén az adatok nem lesznek elérhetők a felhasználók számára, amíg a megrendelt CCI-létrehozási folyamat be nem fejeződik. Particionált táblák esetén, mivel a motor partíciónként hozza létre a rendezett CCI-partíciót, a felhasználók továbbra is hozzáférhetnek az adatokhoz olyan partíciókban, ahol a rendezett CCI-létrehozás nincs folyamatban. Ezzel a beállítással minimalizálhatja az állásidőt a nagy táblákon rendezett CCI-létrehozás során:
- Hozzon létre partíciókat a cél nagy táblán (nevű
Table_A
). - Hozzon létre egy üres rendezett CCI-táblát (nevű
Table_B
) ugyanazzal a táblával és partíciós sémával, mint a következővelTable_A
: . - Váltson át egy partícióról
Table_A
a -reTable_B
. - Futtassa a parancsot
ALTER INDEX <Ordered_CCI_Index> ON <Table_B> REBUILD PARTITION = <Partition_ID>
a bekapcsolt partíció újraépítéséhez a következőn:Table_B
. - Ismételje meg a 3. és a 4. lépést a partíciók esetében.
Table_A
- Miután az összes partíció át lett váltva a-ról
Table_A
a-reTable_B
, és újraépítették, helyezze aTable_A
elemet, és nevezze át a következőreTable_B
:Table_A
.
Tipp
Rendezett CCI-vel rendelkező dedikált SQL-készlettáblák esetén az ALTER INDEX REBUILD újrarendezi az adatokat a használatával tempdb
. Monitorozás tempdb
az újraépítési műveletek során. Ha több tempdb
helyre van szüksége, vertikálisan skálázza fel a készletet. Az index újraépítése után vertikálisan leskálázható.
Rendezett CCI-vel rendelkező dedikált SQL-készlettáblák esetén az ALTER INDEX REORGANIZE nem rendezi újra az adatokat. Az adatok használatához használja az ALTER INDEX REBUILD parancsot.
A CCI rendezett karbantartásával kapcsolatos további információkért lásd: Fürtözött oszlopcentrikus indexek optimalizálása.
Funkcióbeli különbségek SQL Server 2022 képességeiben
SQL Server 2022 -ben (16.x) rendezett fürtözött oszlopcentrikus indexek jelentek meg, hasonlóan a dedikált SQL-készletek Azure Synapse funkcióhoz.
- Jelenleg csak SQL Server 2022-es (16.x) és újabb verziók támogatják a fürtözött oszlopcentrikus bővített szegmenseliminálási képességeket a sztring-, bináris- és guid adattípusokhoz, valamint a datetimeoffset adattípust a kettőnél nagyobb skálázáshoz. Korábban ez a szegmenseliminálás a numerikus, dátum- és időadattípusokra, valamint a datetimeoffset adattípusra vonatkozik, amely skálázása kisebb vagy egyenlő kettőnél.
- Jelenleg csak a 2022-SQL Server (16.x) és újabb verziók támogatják a fürtözött oszlopcentrikus sorcsoport eltávolítását a predikátumok előtagja
LIKE
esetében, példáulcolumn LIKE 'string%'
. A szegmensek megszüntetése nem támogatott a LIKE előtag nélküli használatához, példáulcolumn LIKE '%string'
: .
További információ: Az oszlopcentrikus indexek újdonságai.
Példák
A. A rendezett oszlopok és a sorrendi sorrend ellenőrzése:
SELECT object_name(c.object_id) table_name, c.name column_name, i.column_store_order_ordinal
FROM sys.index_columns i
JOIN sys.columns c ON i.object_id = c.object_id AND c.column_id = i.column_id
WHERE column_store_order_ordinal <>0;
B. Az oszlop sorszámának módosításához vegyen fel vagy távolítson el oszlopokat a rendelési listából, vagy váltson a CCI-ről rendezett CCI-ra:
CREATE CLUSTERED COLUMNSTORE INDEX InternetSales ON dbo.InternetSales
ORDER (ProductKey, SalesAmount)
WITH (DROP_EXISTING = ON);
Következő lépések
- További fejlesztési tippekért tekintse meg a fejlesztés áttekintését.
- Oszlopcentrikus indexek – Áttekintés
- Az oszlopcentrikus indexek újdonságai
- Oszlopcentrikus indexek – Tervezési útmutató
- Oszlopcentrikus indexek – Lekérdezési teljesítmény