Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A sorcsoport minőségét egy sorcsoport sorainak száma határozza meg. A rendelkezésre álló memória növelése maximalizálhatja az oszlopcentrikus index által az egyes sorcsoportokba tömörített sorok számát. Ezekkel a módszerekkel javíthatja az oszlopcentrikus indexek tömörítési sebességét és lekérdezési teljesítményét.
Miért fontos a sorcsoport mérete?
Mivel egy oszlopcentrikus index az egyes sorcsoportok oszlopszegmenseinek vizsgálatával vizsgál be egy táblát, az egyes sorcsoportokban lévő sorok számának maximalizálása növeli a lekérdezési teljesítményt. Ha a sorcsoportok nagy számú sorból állnak, az adattömörítés javul, ami azt jelenti, hogy kevesebb adatot kell beolvasni a lemezről.
További információ a sorcsoportokról: Oszlopcentrikus indexek útmutatója.
Célméret sorcsoportokhoz
A legjobb lekérdezési teljesítmény érdekében a cél az oszlopcentrikus indexben lévő sorcsoportonkénti sorok számának maximalizálása. Egy sorcsoport legfeljebb 1 048 576 sort tartalmazhat. Nem baj, ha nem rendelkezik a sorcsoportonkénti sorok maximális számával. Az oszlopcentrikus indexek akkor érnek el jó teljesítményt, ha a sorcsoportok legalább 100 000 sort tartalmaznak.
A sorcsoportok tömörítés közben levághatók
A tömeges terhelés vagy az oszlopcentrikus index újraépítése során néha nem áll rendelkezésre elegendő memória az egyes sorcsoportokhoz kijelölt összes sor tömörítéséhez. Memóriaterhelés esetén az oszlopcentrikus indexek levágják a sorcsoport méretét, hogy az oszloptárba történő tömörítés sikeres legyen.
Ha nincs elegendő memória ahhoz, hogy legalább 10 000 sort tömörítsen az egyes sorcsoportokba, hibaüzenet jelenik meg.
A tömeges betöltésről további információt a Fürtözött oszlopcentrikus indexbe történő tömeges betöltés című témakörben talál.
A sorcsoport minőségének monitorozása
A dinamikus felügyeleti nézet (DMV) (sys.dm_db_column_store_row_group_physical_stats tartalmazza az SQL DB-nek megfelelő nézetdefiníciót), amely hasznos információkat tesz közzé, például a sorcsoportok sorainak számát és a vágás okát, ha vágás történt. A következő nézetet hasznos eszközként hozhatja létre a DMV lekérdezéséhez, hogy információt szerezzen a sorcsoportok vágásáról.
CREATE VIEW dbo.vCS_rg_physical_stats
AS
WITH cte
AS
(
select tb.[name] AS [logical_table_name]
, rg.[row_group_id] AS [row_group_id]
, rg.[state] AS [state]
, rg.[state_desc] AS [state_desc]
, rg.[total_rows] AS [total_rows]
, rg.[trim_reason_desc] AS trim_reason_desc
, mp.[physical_name] AS physical_name
FROM sys.[schemas] sm
JOIN sys.[tables] tb ON sm.[schema_id] = tb.[schema_id]
JOIN sys.[pdw_table_mappings] mp ON tb.[object_id] = mp.[object_id]
JOIN sys.[pdw_nodes_tables] nt ON nt.[name] = mp.[physical_name]
JOIN sys.[dm_pdw_nodes_db_column_store_row_group_physical_stats] rg ON rg.[object_id] = nt.[object_id]
AND rg.[pdw_node_id] = nt.[pdw_node_id]
AND rg.[distribution_id] = nt.[distribution_id]
)
SELECT *
FROM cte;
A trim_reason_desc oszlop azt jelzi, hogy a sorcsoportot levágták-e (trim_reason_desc = NO_TRIM azt jelzi, hogy nincs vágás, és a sorcsoport optimális minőségű). A következő metszési okok a sorcsoport korai metszését jelzik:
- BULKLOAD: Ezt a vágási okot akkor használják, ha a feltöltéshez beérkezett sorok kötege kevesebb mint 1 millió sort tartalmazott. A motor tömörített sorcsoportokat hoz létre, ha több mint 100 000 sort szúrnak be (ahelyett, hogy a deltatárolóba szúrná be őket), de a vágás okának beállításához a BULKLOAD értéket használja. Ebben a forgatókönyvben fontolja meg a tételterhelés növelését, hogy több sor kerüljön bele. Emellett értékelje újra a particionálási sémát, hogy ne legyen túl részletes, mivel a sorcsoportok nem tudják átfogni a partícióhatárokat.
- MEMORY_LIMITATION: Az 1 millió sorból álló sorcsoportok létrehozásához a motornak bizonyos mennyiségű munkamemóriára van szüksége. Ha a betöltési munkamenet rendelkezésre álló memóriája kisebb, mint a szükséges munkamemória, a sorcsoportok idő előtt le lesznek vágva. A következő szakaszok ismertetik, hogyan becsülhető meg a szükséges memória, és hogyan lehet több memóriát kiosztani.
- DICTIONARY_SIZE: Ez a vágási ok azt jelzi, hogy a sorcsoport vágása azért történt, mert volt legalább egy karakterlánc-oszlop széles és/vagy magas kardinalitású karakterláncokkal. A szótár mérete 16 MB-ra van korlátozva a memóriában, és a korlát elérése után a sorcsoport tömörítve lesz. Ha mégis belefut ebbe a helyzetbe, fontolja meg a problémás oszlop elkülönítését egy külön táblába.
Memóriakövetelmények becslése
Az egy sorcsoport tömörítéséhez szükséges maximális memória körülbelül a következő:
- 72 MB +
- #rows * #columns * 8 bájt +
- #rows * #rövid-karakteroszlopok * 32 bájt +
- #long-string-columns * 16 MB a tömörítési szótárhoz
Megjegyzés
Ahol a rövid karakterláncoszlopok <= 32 bájtos karakterlánc adattípust használnak, a hosszú karakterláncoszlopok pedig > = 32 bájtos karakterlánc adattípust használnak.
A hosszú sztringeket szöveg tömörítésére tervezett módszerrel tömörítik. Ez a tömörítési módszer egy szótári-et használ a szövegminták tárolására. A szótár maximális mérete 16 MB. A sorcsoport minden hosszú sztringoszlopához csak egy szótár tartozik.
A memóriakövetelmények csökkentésének módjai
Az alábbi technikákkal csökkentheti a sorcsoportok oszlopcentrikus indexekbe való tömörítésének memóriakövetelményeit.
Kevesebb oszlop használata
Ha lehetséges, tervezzen kevesebb oszlopot tartalmazó táblát. Ha egy sorcsoportot tömörít az oszloptárba, az oszloptár index külön tömöríti minden oszlopszegmenst. Ezért a sorcsoportok tömörítéséhez szükséges memóriakövetelmények az oszlopok számának növekedésével nőnek.
Kevesebb sztringoszlop használata
A sztring adattípusok oszlopai több memóriát igényelnek, mint a numerikus és a dátum típusú adattípusok. A memóriaigény csökkentése érdekében fontolja meg a sztringoszlopok eltávolítását a ténytáblákból, és helyezze őket kisebb dimenziótáblákba.
További memóriakövetelmények a sztringtömörítéshez:
- A legfeljebb 32 karakter hosszúságú sztring adattípusok értékenként 32 bájtot igényelhetnek.
- A 32 karakternél több karaktert tartalmazó sztring adattípusok szótári módszerekkel vannak tömörítve. A sorcsoport minden oszlopához további 16 MB szükséges a szótár létrehozásához.
Kerülje a túlparticionálást
Az oszlopcentrikus indexek partíciónként egy vagy több sorcsoportot hoznak létre. Az Azure Synapse Analyticsben az adattárházak esetében a partíciók száma gyorsan nő, mivel az adatok elosztottak, és az egyes disztribúciók particionálva lesznek. Ha a tábla túl sok partícióval rendelkezik, előfordulhat, hogy nincs elegendő sor a sorcsoportok kitöltéséhez. A sorok hiánya nem okoz memóriaterhelést a tömörítés során, de olyan sorcsoportokhoz vezet, amelyek nem érik el a legjobb oszlopcentrikus lekérdezési teljesítményt.
A túlparticionálás elkerülésének másik oka, hogy a sorok egy particionált tábla oszlopcentrikus indexébe való betöltése memóriaterheléssel jár. A terhelés során számos partíció fogadhatja a bejövő sorokat, amelyek a memóriában maradnak, amíg minden partícióhoz elegendő sor nem lesz tömörítve. A túl sok partíció további memóriaterhelést eredményez.
A terheléses lekérdezés egyszerűsítése
Az adatbázis megosztja a lekérdezés memória-megadását a lekérdezés összes operátora között. Ha egy terheléses lekérdezés összetett rendezésekkel és illesztésekkel rendelkezik, a tömörítéshez rendelkezésre álló memória csökken.
Úgy tervezheti meg a betöltési lekérdezést, hogy csak a lekérdezés betöltésére összpontosítson. Ha átalakításokat kell futtatnia az adatokon, futtassa őket a terhelési lekérdezéstől elkülönítve. Az adatokat például egy halomtáblában előkészítheti, futtathatja az átalakításokat, majd betölti az előkészítési táblát az oszlopalapú indexbe.
A MAXDOP beállítása
Minden disztribúció párhuzamosan tömöríti a sorcsoportokat az oszloptárba, ha eloszlásonként egynél több processzormag érhető el. A párhuzamosság további memóriaerőforrásokat igényel, ami memóriaterheléshez és sorcsoport-vágáshoz vezethet.
A memóriaterhelés csökkentése érdekében a MAXDOP lekérdezési tipp használatával kényszerítheti a terhelési műveletet soros módban való futtatásra az egyes disztribúciókon belül.
CREATE TABLE MyFactSalesQuota
WITH (DISTRIBUTION = ROUND_ROBIN)
AS SELECT * FROM FactSalesQuota
OPTION (MAXDOP 1);
További memória lefoglalásának módjai
A DWU mérete és a felhasználói erőforrásosztály együttesen határozzák meg, hogy mennyi memória áll rendelkezésre egy felhasználói lekérdezéshez. A terheléses lekérdezés memóriahasználatának növeléséhez növelheti a DWU-k számát, vagy növelheti az erőforrásosztályt.
- A DWU-k növeléséhez lásd Hogyan méretezhetem a teljesítményt?
- A lekérdezés erőforrásosztályának módosításáról a Felhasználói erőforrásosztály-példa módosításacímű témakörben olvashat.
Következő lépések
A Synapse SQL teljesítményének javításához további lehetőségeket a Teljesítmény áttekintésecímű cikkben talál.