tempdb-adatbázis
A következőkre vonatkozik:SQL Server
Azure SQL Database
Azure SQL Felügyelt Példány
SQL-adatbázis a Microsoft Fabric szolgáltatásban
Ez a cikk a tempdb
rendszeradatbázist ismerteti, amely egy olyan globális erőforrás, amely az SQL Server, az Azure SQL Database vagy a felügyelt Azure SQL-példány adatbázismotor-példányához csatlakozó összes felhasználó számára elérhető.
Áttekintés
A tempdb
rendszeradatbázis egy globális erőforrás, amely a következőt tartalmazza:
kifejezetten létrehozott felhasználói objektumok. Ezek közé tartoznak a következők:
- Globális vagy helyi ideiglenes táblák és indexek ezeken a táblákon
- Ideiglenes tárolt eljárások
- Táblaváltozók
- Táblaértékelt függvényekben visszaadott táblák
- Kurzorok
A felhasználói adatbázisban létrehozható felhasználói objektumok
tempdb
is létrehozhatóak, azonban tartóssági garancia nélkül jönnek létre, és az adatbázismotor-példány újraindulásakor elvesznek.belső objektumok, amelyeket az adatbázismotor hoz létre. Ezek közé tartoznak a következők:
- A munkatáblák köztes eredményeket tárolnak az adatsorok, kurzorok, rendezések és ideiglenes nagy objektumtárolók (LOB) esetében.
- Munkafájlok kivonat-illesztési vagy kivonat-összesítési műveletekhez.
- Köztes rendezési eredmények olyan műveletekhez, mint például indexek létrehozása vagy újraépítése (ha
SORT_IN_TEMPDB
van megadva), vagy bizonyosGROUP BY
,ORDER BY
vagyUNION
lekérdezések.
Minden belső objektum legalább kilenc oldalt használ: egy IAM-oldalt és egy nyolcoldalas terjedelmet. Az oldalakról és a mértékekről további információt Lapok és mértékekcímű témakörben talál.
Verzió tárolja a, amelyek olyan adatoldalak gyűjteményei, amelyek sorverzióstámogatják az adatsorokat. Két típus létezik: egy közös verziótár és egy online index buildverzió-tároló. A verziótárak a következőket tartalmazzák:
- Sorverziók, amelyeket adatmódosítási tranzakciók generálnak egy olyan adatbázisban, amely sorverzióalapú
READ COMMITTED
vagySNAPSHOT
elkülönítési tranzakciókat használ. - Az adatmódosítási tranzakciók által létrehozott sorverziók olyan szolgáltatásokhoz, mint az online indexműveletek, a több aktív eredményhalmaz (MARS) és
AFTER
eseményindítók.
- Sorverziók, amelyeket adatmódosítási tranzakciók generálnak egy olyan adatbázisban, amely sorverzióalapú
A tempdb
belüli műveletek minimálisan naplózva vannak.
tempdb
az adatbázismotor minden indításakor újra létrejön, így a rendszer mindig üres tempdb
adatbázissal indul. A rendszer automatikusan elveti az ideiglenes tárolt eljárásokat és a helyi ideiglenes táblákat, amikor az őket létrehozó munkamenet megszakad.
tempdb
esetében soha nincs semmi, amit menteni kellene az adatbázismotor egyik üzemidőszakáról a másikra. A biztonsági mentési és visszaállítási műveletek nem engedélyezettek a tempdb
-n.
A tempdb fizikai tulajdonságai az SQL Serveren
Az alábbi táblázat az SQL Server tempdb
adatainak és naplófájljainak kezdeti konfigurációs értékeit sorolja fel. Az értékek a model
adatbázis alapértelmezett értékein alapulnak. Ezeknek a fájloknak a mérete kissé eltérhet az SQL Server különböző kiadásaiban.
Fájl | Logikai név | Fizikai név | Kezdeti méret | Fájlnövekedés |
---|---|---|---|---|
Elsődleges adatok | tempdev |
tempdb.mdf |
8 megabájt | Automatikus skálázás 64 MB-kal, amíg meg nem telik a lemez |
Másodlagos adatfájlok | temp# |
tempdb_mssql_#.ndf |
8 megabájt | Automatikus skálázás 64 MB-kal, amíg meg nem telik a lemez |
Napló | templog |
templog.ldf |
8 megabájt | Automatikusan növelje 64 megabájttal, legfeljebb 2 terabájtig |
Minden tempdb
adatfájlnak mindig azonos kezdeti méret- és növekedési paraméterekkel kell rendelkeznie.
Tempdb-adatfájlok száma
Az adatbázismotor verziójától, konfigurációjától és a számítási feladattól függően a tempdb
több adatfájlra is szükség lehet a foglalási versengés mérsékléséhez.
Az adatfájlok javasolt teljes száma a számítógép logikai processzorainak számától függ. Általános útmutatásként:
- Ha a logikai processzorok száma kisebb vagy egyenlő nyolcnál, használja ugyanazt az adatfájlszámot.
- Ha a logikai processzorok száma meghaladja a nyolcat, használjon nyolc adatfájlt.
- Ha
tempdb
foglalási versengés továbbra is fennáll, növelje az adatfájlok számát négy többszörösével, amíg a versengés elfogadható szintre nem csökken, vagy módosítsa a számítási feladatot.
További információ: Javaslatok az SQL Server tempdb-adatbázisfoglalási versengés csökkentésére.
A tempdb
aktuális méret- és növekedési paramétereinek ellenőrzéséhez használja a sys.database_files katalógusnézetet a tempdb
-ben.
A tempdb-adatok és naplófájlok áthelyezése az SQL Serveren
A tempdb
adatok és naplófájlok áthelyezésével kapcsolatban lásd: Rendszeradatbázisok áthelyezése.
A tempdb adatbázis-beállításai az SQL Serveren
Az alábbi táblázat az tempdb
adatbázis minden egyes beállításának alapértelmezett értékét sorolja fel, valamint azt, hogy a beállítás módosítható-e. A beállítások aktuális beállításainak megtekintéséhez használja a sys.databases katalógusnézetet.
Adatbázis-beállítás | Alapértelmezett érték | Módosítható |
---|---|---|
ACCELERATED_DATABASE_RECOVERY |
OFF |
Nem |
ALLOW_SNAPSHOT_ISOLATION |
OFF |
Igen |
ANSI_NULL_DEFAULT |
OFF |
Igen |
ANSI_NULLS |
OFF |
Igen |
ANSI_PADDING |
OFF |
Igen |
ANSI_WARNINGS |
OFF |
Igen |
ARITHABORT |
OFF |
Igen |
AUTO_CLOSE |
OFF |
Nem |
AUTO_CREATE_STATISTICS |
ON |
Igen |
AUTO_SHRINK |
OFF |
Nem |
AUTO_UPDATE_STATISTICS |
ON |
Igen |
AUTO_UPDATE_STATISTICS_ASYNC |
OFF |
Igen |
AUTOMATIC_TUNING (FORCE_LAST_GOOD_PLAN) |
OFF |
Nem |
CHANGE_TRACKING |
OFF |
Nem |
COMPATIBILITY_LEVEL |
Az adatbázismotor verziójától függ. További információ: ALTER DATABASE (Transact-SQL) kompatibilitási szintje. |
Igen |
CONCAT_NULL_YIELDS_NULL |
OFF |
Igen |
CONTAINMENT |
NONE |
Nem |
CURSOR_CLOSE_ON_COMMIT |
OFF |
Igen |
CURSOR_DEFAULT |
GLOBAL |
Igen |
Adatbázis állapota | ONLINE |
Nem |
Adatbázis frissítése | READ_WRITE |
Nem |
Adatbázis-felhasználó hozzáférése | MULTI_USER |
Nem |
DATE_CORRELATION_OPTIMIZATION |
OFF |
Igen |
DB_CHAINING |
ON |
Nem |
DELAYED_DURABILITY |
DISABLED Ettől függetlenül a késleltetett tartósság mindig tempdb engedélyezve van. |
Igen |
ENCRYPTION |
OFF |
Nem |
MIXED_PAGE_ALLOCATION |
OFF |
Nem |
NUMERIC_ROUNDABORT |
OFF |
Igen |
PAGE_VERIFY |
CHECKSUM az SQL Server új telepítéseihezA meglévő PAGE_VERIFY érték megmaradhat az SQL Server egy példányának frissítésekor. |
Igen |
PARAMETERIZATION |
SIMPLE |
Igen |
QUOTED_IDENTIFIER |
OFF |
Igen |
READ_COMMITTED_SNAPSHOT |
OFF |
Nem |
RECOVERY |
SIMPLE |
Nem |
RECURSIVE_TRIGGERS |
OFF |
Igen |
Szolgáltatásközvetítő | ENABLE_BROKER |
Igen |
TARGET_RECOVERY_TIME |
60 | Igen |
TEMPORAL_HISTORY_RETENTION |
ON |
Igen |
TRUSTWORTHY |
OFF |
Nem |
Ezeknek az adatbázis-beállításoknak a leírását az ALTER DATABASE SET Options (Transact-SQL)című témakörben talál.
tempdb az Azure SQL Database-ben
Az Azure SQL Database-ben a tempdb
viselkedésének és konfigurációjának néhány aspektusa eltér az SQL Servertől.
Önálló adatbázisok esetén a logikai kiszolgálón lévő minden egyes adatbázisnak saját tempdb
-ja van. Rugalmas készletben a tempdb
megosztott erőforrás az ugyanabban a készletben lévő összes adatbázishoz, de az egyik adatbázis által létrehozott ideiglenes objektumok nem láthatók az ugyanabban a rugalmas készletben lévő többi adatbázis számára.
A tempdb
objektumai , beleértve a katalógusnézeteket és a dinamikus felügyeleti nézeteket (DMV-ket) az tempdb
adatbázisközi hivatkozásán keresztül érhetők el. Lekérdezheti például a sys.database_files nézetet:
SELECT file_id,
type_desc,
name,
size,
max_size,
growth
FROM tempdb.sys.database_files;
Az Azure SQL Database globális ideiglenes táblái adatbázis-hatókörrel vannak elosztva. További információért lásd: Az Azure SQL Database-ben található adatbázis-hatókörű globális ideiglenes táblák.
Az Azure SQL Database tempdb
méreteiről az alábbiakban olvashat bővebben:
- virtuálismag-vásárlási modell: önálló adatbázisok, csoportosított adatbázisok
- DTU vásárlási modell: önálló adatbázisok, készletezett adatbázisok
tempdb a felügyelt SQL-példányban
A felügyelt Azure SQL-példányban a tempdb
viselkedésének és alapértelmezett konfigurációjának néhány aspektusa eltér az SQL Servertől.
Konfigurálhatja a tempdb
fájlok számát, a növekedésüket és a maximális méretüket. További információ a felügyelt Azure SQL-példány tempdb
beállításainak konfigurálásáról: Felügyelt Azure SQL-példány tempdb-beállításainak konfigurálása.
Az Azure SQL Managed Instance ugyanúgy támogatja az ideiglenes objektumokat, mint az SQL Servert, ahol minden globális ideiglenes tábla és globális ideiglenes tárolt eljárás elérhető az ugyanazon felügyelt SQL-példányon belüli összes felhasználói munkamenet számára.
A felügyelt Azure SQL-példányban található tempdb
méretekkel kapcsolatos további információkért tekintse át erőforráskorlátokat.
A tempdb az SQL-adatbázisban a Fabric környezetben
Ha többet szeretne megtudni a Microsoft Fabric SQL-adatbázis tempdb
méreteiről, tekintse át a Szolgáltatás-összehasonlítás: Azure SQL Database és SQL Database a Microsoft Fabric erőforrás-korlátok részét.
Az Azure SQL Database -hez hasonlóan a Microsoft Fabric SQL-adatbázisának globális ideiglenes táblái is adatbázis-hatókörrel vannak elosztva. További információért lásd az adatbázis-hatókörű globális ideiglenes táblákat az Azure SQL Database-ben.
Korlátozások
A következő műveletek nem hajthatóak végre a tempdb
adatbázison:
- Fájlcsoportok hozzáadása.
- Az adatbázis biztonsági mentése vagy visszaállítása.
- Rendezés módosítása. Az alapértelmezett rendezés a kiszolgáló rendezése.
- Az adatbázis tulajdonosának módosítása.
tempdb
satulajdonában van. - Adatbázis-pillanatkép létrehozása.
- Az adatbázis törlése.
- A vendég felhasználó elvetése az adatbázisból.
- Az adatrögzítés módosításának engedélyezése.
- Adatbázis-tükrözésben való részvétel.
- Az elsődleges fájlcsoport, az elsődleges adatfájl vagy a naplófájl eltávolítása.
- Az adatbázis vagy az elsődleges fájlcsoport átnevezése.
-
DBCC CHECKALLOC
futtatása. -
DBCC CHECKCATALOG
futtatása. - Az adatbázis beállítása
OFFLINE
-ra. - Az adatbázis vagy az elsődleges fájlcsoport beállítása
READ_ONLY
.
Engedélyek
Bármely felhasználó létrehozhat ideiglenes objektumokat tempdb
.
A felhasználók csak a saját, nem ideiglenes objektumaikat érhetik el tempdb
, kivéve, ha további engedélyeket kapnak.
A tempdb
CONNECT
engedélyének visszavonható, hogy egy adatbázis-felhasználó vagy szerepkör ne használja tempdb
. Ez nem ajánlott, mert sok művelethez tempdb
kell használni.
A tempdb teljesítményének optimalizálása az SQL Serveren
A tempdb
fájlok mérete és fizikai elhelyezése befolyásolhatja a teljesítményt. Ha például a tempdb
kezdeti mérete túl kicsi, előfordulhat, hogy az idő és az erőforrások az tempdb
automatikus növekedésére fordítódnak, hogy elérje a számítási feladat támogatásához szükséges méretet az adatbázis-motor példányának minden újraindításakor.
- Ha lehetséges, javíthatja az adatfájlok növekedési műveleteinek teljesítményét az azonnali fájlinicializálás használatával.
- Az SQL Server 2022 -től (16.x) kezdődően a tranzakciónapló-fájlok 64 MB-ig történő növekedési eseményei is kihasználhatják az azonnali fájl inicializálását. További információ: Azonnali fájl inicializálása és a tranzakciónapló.
- Helyezze előre a helyet az összes
tempdb
fájl számára úgy, hogy a fájlméretet olyan értékre állítja, amely elég nagy ahhoz, hogy a környezet tipikus számítási feladatait elférje. Az előfoglalás megakadályozza, hogy atempdb
túl gyakran automatikusan bővüljön, ami negatívan befolyásolhatja a teljesítményt. - A
tempdb
adatbázis fájljait úgy kell beállítani, hogy automatikusan növekedjenek, és így biztosítsanak helyet a nem tervezett növekedési események során. - A
tempdb
egyenlő méretű adatfájlokra való felosztása javíthatja atempdb
használó műveletek hatékonyságát.- Az adatkiosztási kiegyensúlyozatlanság elkerülése érdekében az adatfájloknak azonos kezdeti méret- és növekedési paraméterekkel kell rendelkezniük, mivel az adatbázismotor egy arányos kitöltési algoritmust használ, amely előnyben részesíti a szabadabb helyekkel rendelkező fájlok foglalásait.
- Állítsa be a fájlnövekedést ésszerű méretre (például 64 MB), és a növekedési növekményt minden adatfájl esetében azonosra állítsa a növekedés egyensúlyhiányának elkerülése érdekében.
A tempdb
aktuális méret- és növekedési paramétereinek ellenőrzéséhez használja a következő lekérdezést:
SELECT name AS file_name,
type_desc AS file_type,
size * 8.0 / 1024 AS size_mb,
max_size * 8.0 / 1024 AS max_size_mb,
CAST(IIF(max_size = 0, 0, 1) AS bit) AS is_autogrowth_enabled,
CASE WHEN growth = 0 THEN growth
WHEN growth > 0 AND is_percent_growth = 0 THEN growth * 8.0 / 1024
WHEN growth > 0 AND is_percent_growth = 1 THEN growth
END
AS growth_increment_value,
CASE WHEN growth = 0 THEN 'Autogrowth is disabled.'
WHEN growth > 0 AND is_percent_growth = 0 THEN 'Megabytes'
WHEN growth > 0 AND is_percent_growth = 1 THEN 'Percent'
END
AS growth_increment_value_unit
FROM tempdb.sys.database_files;
Helyezze a tempdb
adatbázist egy gyors I/O-alrendszerre. Az egyes adatfájloknak vagy tempdb
adatfájlok csoportjainak nem feltétlenül kell különböző lemezeken lenniük, hacsak nem tapasztal lemezszintű I/O-szűk keresztmetszeteket.
Ha az tempdb
és a felhasználói adatbázisok között I/O-versengés áll fenn, helyezze tempdb
fájlokat a felhasználói adatbázisok által használt lemezektől eltérő lemezekre.
Jegyzet
A teljesítmény javítása érdekében késleltetett tartóssági mindig engedélyezve van tempdb
akkor is, ha az adatbázis-beállítás DELAYED_DURABILITY
DISABLED
van beállítva. Mivel tempdb
az indításkor újra létre lesz hozva, nem megy át helyreállítási folyamaton, és nem nyújt tartóssági garanciát.
Teljesítménybeli fejlesztések az SQL Server tempdb-jében
Bevezetés az SQL Server 2016-ban (13.x)
- Az ideiglenes táblák és táblaváltozók gyorsítótárba kerülnek. A gyorsítótárazás lehetővé teszi, hogy az ideiglenes objektumok elvetésével és létrehozásával járó műveletek nagyon gyorsan fussanak. A gyorsítótárazás csökkenti a lapfoglalást és a metaadat-versengést is.
- A foglalási oldal reteszelési protokollja továbbfejlesztett, hogy csökkentse a használt
UP
(frissítési) reteszek számát. - A
tempdb
naplózási többletterhelése csökken, így atempdb
naplófájlban csökken a lemez I/O sávszélesség-felhasználása. - Az SQL Telepítő több
tempdb
adatfájlt ad hozzá egy új példány telepítése során. Tekintse át a javaslatokat, és konfiguráljatempdb
-t az SQL Telepítő adatbázismotor konfigurációs lapján, vagy használja a parancssori paramétert/SQLTEMPDBFILECOUNT
. Alapértelmezés szerint az SQL Telepítő annyitempdb
adatfájlt ad hozzá, mint a logikai processzorok száma, vagy nyolcat, amelyik alacsonyabb. - Ha több
tempdb
adatfájl is létezik, az összes fájl automatikusan, a növekedési beállításoktól függően egyszerre és azonos mennyiségben növekszik. Nyomkövetési jelző 1117 már nem szükséges. További információ a TEMPDB-re és a felhasználói adatbázisokra vonatkozó módosításokról a -T1117 és -T1118 cím alatt olvasható. - A
tempdb
összes foglalása egységes kiterjedéseket használ. A(z) 1118 követési jelzőre már nincs szükség. Atempdb
teljesítménybeli fejlesztésével kapcsolatos további információkért tekintse meg a TEMPDB - Fájlok és nyomkövetési jelzők és frissítések, Oh My!. - A
AUTOGROW_ALL_FILES
tulajdonság mindig be van kapcsolva aPRIMARY
fájlcsoport esetében.
Bevezetés az SQL Server 2017-ben (14.x)
- Az SQL-beállítási felület javítja a kezdeti
tempdb
fájlfoglalással kapcsolatos útmutatást. Az SQL Telepítő figyelmezteti az ügyfeleket, ha a kezdeti fájlméret 1 GB-nál nagyobb értékre van beállítva, és ha azonnali fájl inicializálási nincs engedélyezve, megakadályozza a példányok indítási késését. - A sys.dm_tran_version_store_space_usage dinamikus felügyeleti nézet az adatbázisonkénti verziótár-használatot követi nyomon. Ez a DMV olyan adatbázis-kezelők számára hasznos, akik proaktív módon szeretnék megtervezni
tempdb
méretezést az adatbázisonkénti verziótár használati követelményei alapján. -
Az intelligens lekérdezésfeldolgozási funkciók, például az adaptív illesztések és a memóriavisszajelzések csökkentik a lekérdezések egymást követő végrehajtásakor fellépő memória kiömléseket, csökkentve az
tempdb
erőforrás-kihasználtságot.
Bevezetés az SQL Server 2019-ben (15.x)
- Az adatbázismotor nem használja a
FILE_FLAG_WRITE_THROUGH
lehetőségettempdb
fájlok megnyitásakor a lemez maximális átviteli sebességének engedélyezéséhez. Miveltempdb
újra létrejön indításkor, ez a beállítás nem szükséges az adatok tartósságának biztosításához. AFILE_FLAG_WRITE_THROUGH
kapcsolatos további információkért lásd az SQL Serveradatmegbízhatóságát kiterjesztő naplózási és adattárolási algoritmusokat. -
memóriaoptimalizált TempDB-metaadatok megszüntetik
tempdb
ideiglenes objektum metaadataival kapcsolatos versengést. - Az egyidejű Page Free Space (PFS) lapfrissítések csökkentik a lapzárolási versengést minden adatbázisban, egy probléma, amely leggyakrabban a
tempdb
esetében fordul elő. Ez a fejlesztés megváltoztatja a PFS-lapfrissítések egyidejűségi kezelését, hogy azok a kizárólagos retesz helyett megosztott retesz alatt frissíthetők legyenek. Ez a viselkedés alapértelmezés szerint be van kapcsolva az SQL Server 2019-től kezdve (15.x) kezdődő összes adatbázisban (beleértve atempdb
is). A PFS-oldalakról további információt: A rejtett részletek: GAM, SGAM és PFS oldalak. - Alapértelmezés szerint az SQL Server linuxos új telepítése több
tempdb
adatfájlt hoz létre a logikai magok száma alapján (legfeljebb nyolc adatfájllal). Ez nem vonatkozik a helyszíni alverziós vagy főverzió-frissítésekre. Mindentempdb
adatfájl 8 MB, és automatikusan 64 MB-ra növekszik. Ez a viselkedés hasonló a Windows alapértelmezett SQL Server-telepítéséhez.
Bevezetés az SQL Server 2022-ben (16.x)
- Bevezetett a továbbfejlesztett méretezhetőséget a rendszeroldali oldalzárolás egyidejűségi fejlesztéseivel. A globális kiosztási térkép (GAM) és a megosztott globális kiosztási térkép (SGAM) oldalak egyidejű frissítése csökkenti az ütemezési konfliktusokat az adatoldalak és -tartományok kiosztásakor vagy felszabadításakor. Ezek a fejlesztések az összes felhasználói adatbázisra vonatkoznak, és különösen a
tempdb
nagy számítási feladatainak előnyeit élvezik. A GAM- és SGAM-oldalakról további információért olvasd el: A borítók alatt: GAM, SGAM és PFS oldalak. További információkért nézze meg a(z) System Page Latch Concurrency Enhancements (Ep. 6) | Data Exposedcímű részt.
Memóriaoptimalizált TempDB-metaadatok
Az ideiglenes objektum-metaadatok versengése korábban szűk keresztmetszetet képezett számos SQL Server-számítási feladat méretezhetősége szempontjából. Ennek megoldásához az SQL Server 2019 (15.x) egy olyan funkciót vezetett be, amely a memóriabeli adatbázis szolgáltatáscsalád része: memóriaoptimalizált TempDB-metaadatok.
A memóriaoptimalizált TempDB metaadat-szolgáltatás engedélyezésével megszűnik ez a szűk keresztmetszet a tempdb
belüli ideiglenes objektum-metaadat-versengés által korábban korlátozott számítási feladatok esetében. Az SQL Server 2019-től (15.x) kezdődően az ideiglenes objektum metaadatainak kezelésével foglalkozó rendszertáblák reteszmentes, nem tartós, memóriaoptimalizált táblákká válhatnak.
Borravaló
A jelenlegi korlátozásokmiatt azt javasoljuk, hogy csak akkor engedélyezze a memóriaoptimalizált TempDB-metaadatokat, ha az objektum metaadatainak versengése történik, és jelentősen befolyásolja a számítási feladatokat.
Az alábbi diagnosztikai lekérdezés egy vagy több sort ad vissza, ha ideiglenes objektum metaadatainak versengése történik. Minden sor egy rendszertáblátjelöl, és visszaadja az adott táblához való hozzáférésért felelős munkamenetek számát a diagnosztikai lekérdezés végrehajtásakor.
SELECT OBJECT_NAME(dpi.object_id, dpi.database_id) AS system_table_name,
COUNT(DISTINCT(r.session_id)) AS session_count
FROM sys.dm_exec_requests AS r
CROSS APPLY sys.fn_PageResCracker(r.page_resource) AS prc
CROSS APPLY sys.dm_db_page_info(prc.db_id, prc.file_id, prc.page_id, 'LIMITED') AS dpi
WHERE dpi.database_id = 2
AND dpi.object_id IN (3, 9, 34, 40, 41, 54, 55, 60, 74, 75)
AND UPPER(r.wait_type) LIKE N'PAGELATCH[_]%'
GROUP BY dpi.object_id, dpi.database_id;
Ebből a hétperces videóból megtudhatja, hogyan és mikor érdemes használni a Memóriaoptimalizált TempDB metaadat-szolgáltatását:
Jegyzet
A memóriaoptimalizált TempDB metaadat-szolgáltatás jelenleg nem érhető el az Azure SQL Database-ben, a Microsoft Fabric SQL-adatbázisában és a felügyelt Azure SQL-példányban.
Memóriaoptimalizált TempDB-metaadatok konfigurálása és használata
A következő szakaszok a memóriaoptimalizált TempDB metaadat-szolgáltatás engedélyezésének, konfigurálásának, ellenőrzésének és letiltásának lépéseit tartalmazzák.
Engedélyez
A funkció engedélyezéséhez használja a következő szkriptet:
ALTER SERVER CONFIGURATION SET MEMORY_OPTIMIZED TEMPDB_METADATA = ON;
További információ: ALTER SERVER. A konfigurációs módosítás érvénybe lépéséhez a szolgáltatás újraindítása szükséges.
Az alábbi T-SQL-paranccsal ellenőrizheti, hogy tempdb
memóriaoptimalizált-e:
SELECT SERVERPROPERTY('IsTempdbMetadataMemoryOptimized');
Ha a visszaadott érték 1, és a funkció engedélyezése után újraindult, a szolgáltatás engedélyezve van.
Ha a kiszolgáló a memóriaoptimalizált TempDB-metaadatok engedélyezése után bármilyen okból nem indul el, megkerülheti a funkciót, ha az adatbázismotor-példányt minimális konfigurációs a -f
indítási lehetőséggel indítja el. Ezután letilthatja a funkciót, és eltávolíthatja a -f
lehetőséget az adatbázismotor normál módban való újraindításához.
Kötés az erőforráskészlethez a memóriahasználat korlátozásához
Annak érdekében, hogy megvédje a kiszolgálót a memóriakihasználtságtól, javasoljuk, hogy tempdb
kössön egy erőforrás-vezérlőhöz erőforráskészlethez, amely korlátozza a memóriaoptimalizált TempDB-metaadatok által felhasznált memóriát. Az alábbi példaszkript létrehoz egy erőforráskészletet, a maximális memóriáját 20%-ra állítja be, az erőforrás-vezérlőtengedélyezi, és tempdb
-t az erőforráskészlethez köti.
Ez a példa bemutató célokra a memória-korlátként használja a 20%-t. A környezet optimális értéke a számítási feladattól függően nagyobb vagy kisebb lehet, és idővel változhat, ha a számítási feladat megváltozik.
CREATE RESOURCE POOL tempdb_resource_pool
WITH (MAX_MEMORY_PERCENT = 20);
ALTER RESOURCE GOVERNOR RECONFIGURE;
ALTER SERVER CONFIGURATION
SET MEMORY_OPTIMIZED TEMPDB_METADATA = ON
(RESOURCE_POOL = 'tempdb_resource_pool');
A módosításhoz a szolgáltatás újraindítása is szükséges, még akkor is, ha a memóriaoptimalizált TempDB-metaadatok már engedélyezve van.
Erőforráskészlet kötésének ellenőrzése és a memóriahasználat figyelése
Annak ellenőrzéséhez, hogy tempdb
erőforráskészlethez van-e kötve, és hogy a készlet memóriahasználati statisztikáit szeretné-e monitorozni, használja az alábbi lekérdezést:
WITH resource_pool AS
(
SELECT p.pool_id,
p.name,
p.max_memory_percent,
dp.max_memory_kb,
dp.target_memory_kb,
dp.used_memory_kb,
dp.out_of_memory_count
FROM sys.resource_governor_resource_pools AS p
INNER JOIN sys.dm_resource_governor_resource_pools AS dp
ON p.pool_id = dp.pool_id
)
SELECT SERVERPROPERTY('IsTempdbMetadataMemoryOptimized') AS is_tempdb_memory_optimized_metadata_enabled,
rp.name AS resource_pool_name,
rp.max_memory_percent,
rp.max_memory_kb,
rp.target_memory_kb,
rp.used_memory_kb,
rp.out_of_memory_count
FROM sys.databases AS d
LEFT JOIN resource_pool AS rp
ON d.resource_pool_id = rp.pool_id
WHERE d.name = 'tempdb';
Erőforráskészlet-kötés eltávolítása
Ha el szeretné távolítani az erőforráskészlet-kötést, miközben a memóriaoptimalizált TempDB-metaadatok engedélyezve maradnak, hajtsa végre a következő parancsot, és indítsa újra a szolgáltatást:
ALTER SERVER CONFIGURATION
SET MEMORY_OPTIMIZED TEMPDB_METADATA = ON;
Kikapcsolás
A memóriaoptimalizált TempDB-metaadatok letiltásához hajtsa végre a következő parancsot, és indítsa újra a szolgáltatást:
ALTER SERVER CONFIGURATION
SET MEMORY_OPTIMIZED TEMPDB_METADATA = OFF;
A memóriaoptimalizált TempDB-metaadatok korlátozásai
A memóriaoptimalizált TempDB metaadat-szolgáltatás engedélyezéséhez vagy letiltásához újra kell indítani.
Bizonyos esetekben előfordulhat, hogy a
MEMORYCLERK_XTP
memória-írnok magas memóriahasználatot észlel, ami memóriakihasználtsági hibákat okoz a számítási feladatban.Ha látni szeretné, hogy az
MEMORYCLERK_XTP
-írnok memóriahasználata az összes többi memóriajegyzőhöz viszonyítva és a célkiszolgáló memóriája alapján történik, hajtsa végre a következő lekérdezést:SELECT SUM(IIF(type = 'MEMORYCLERK_XTP', pages_kb, NULL)) / 1024. AS memoryclerk_xtp_pages_mb, SUM(IIF(type <> 'MEMORYCLERK_XTP', pages_kb, NULL)) / 1024. AS other_pages_mb, SUM(committed_target_kb) / 1024. AS committed_target_memory_mb FROM sys.dm_os_memory_clerks CROSS JOIN sys.dm_os_sys_info;
Ha
MEMORYCLERK_XTP
memória magas, az alábbiak szerint háríthatja el a problémát:- Kösse a
tempdb
adatbázist egy erőforráskészlethez, amely korlátozza a memóriahasználatot a memóriaoptimalizált TempDB-metaadatok alapján. További információ: Memóriaoptimalizált tempdb-metaadatok konfigurálása és használata. - Egy rendszer tárolt eljárása végrehajtható rendszeres időközönként a már nem szükséges
MEMORYCLERK_XTP
memória felszabadításához. További információ: sys.sp_xtp_force_gc (Transact-SQL).
További információért lásd a memóriaoptimalizált tempdb-metaadatok (HkTempDB) memóriahibák kapcsán jelzésű részt.
- Kösse a
Ha In-Memory OLTPhasznál, egyetlen tranzakció nem fér hozzá több adatbázis memóriaoptimalizált tábláihoz. Emiatt a felhasználói adatbázisban memóriaoptimalizált táblát tartalmazó olvasási vagy írási tranzakciók nem férhetnek hozzá
tempdb
rendszernézetekhez ugyanabban a tranzakcióban. Ha ez történik, a következő 41317-s hibaüzenet jelenik meg:A user transaction that accesses memory optimized tables or natively compiled modules cannot access more than one user database or databases model and msdb, and it cannot write to master.
Ez a korlátozás más olyan esetekre is vonatkozik, amikor egyetlen tranzakció több adatbázisban próbál hozzáférni a memóriaoptimalizált táblákhoz.
Előfordulhat például, hogy 41317-et kap, ha a sys.stats katalógusnézetét kérdezi le egy memóriaoptimalizált táblákat tartalmazó felhasználói adatbázisban. Ennek az az oka, hogy a lekérdezés statisztikát próbál elérni, a felhasználói adatbázis memóriaoptimalizált táblájának adatait, valamint a
tempdb
memóriaoptimalizált metaadatait.A következő példaszkript ezt a hibát eredményezi, ha a memóriaoptimalizált TempDB-metaadatok engedélyezve van:
BEGIN TRAN; -- Create an In-memory OLTP transaction that accesses a system view in tempdb SELECT name FROM tempdb.sys.tables; -- An attempt to create an In-memory OLTP transaction in the user database fails INSERT INTO <user database>.<schema>.<memory-optimized table> VALUES (1); COMMIT TRAN;
Jegyzet
Ez a korlátozás nem vonatkozik az ideiglenes táblákra. Létrehozhat egy ideiglenes táblát ugyanabban a tranzakcióban, amely egy memóriaoptimalizált táblához fér hozzá egy felhasználói adatbázisban.
A rendszerkatalógus-nézetek lekérdezései mindig a
READ COMMITTED
elkülönítési szintet használják. Ha engedélyezve van a memóriaoptimalizált TempDB-metaadatok, a rendszerkatalógus-nézetek lekérdezéseitempdb
aSNAPSHOT
elkülönítési szintet használják. Mindkét esetben a zárolási javaslatok nem kerülnek figyelembe vételre.Oszlop-tárolós indexek nem hozhatók létre ideiglenes táblákon, ha a memóriaoptimalizált TempDB-metaadatok engedélyezve vannak.
- Ennek következtében a
sp_estimate_data_compression_savings
rendszer által tárolt eljárás használata aCOLUMNSTORE
vagyCOLUMNSTORE_ARCHIVE
adattömörítési paraméterrel nem támogatott, ha engedélyezve van a memóriaoptimalizált TempDB-metaadatok használata.
- Ennek következtében a
A tempdb kapacitástervezése az SQL Serveren
A tempdb
megfelelő méretének meghatározása számos tényezőtől függ. Ezek közé tartoznak a számítási feladatok és a használt adatbázismotor-funkciók.
Javasoljuk, hogy elemezze tempdb
térhasználatot a következő feladatok elvégzésével egy tesztkörnyezetben, ahol reprodukálhatja a tipikus számítási feladatokat:
- Engedélyezze az automatikus növekedést
tempdb
fájlokhoz. Mindentempdb
adatfájlnak azonos kezdeti mérettel és automatikus növekedés beállításokkal kell rendelkeznie. - Reprodukálja a terhelést, és figyelje a
tempdb
térhasználatot. - Ha a rendszeres indexkarbantartásthasználja, hajtsa végre a karbantartási feladatokat, és figyelje a
tempdb
helyet. - A számítási feladatok teljes használatának előrejelzéséhez használja az előző lépésekben felhasznált maximális területet. Módosítsa ezt az értéket az egyidejűleg tervezett tevékenységhez, majd ennek megfelelően állítsa be a
tempdb
méretét.
Tempdb-használat figyelése
A lemezterület tempdb
való elfogyása jelentős fennakadásokat és alkalmazáskimaradást okozhat. A sys.dm_db_file_space_usage dinamikus felügyeleti nézettel figyelheti a tempdb
fájlokban használt területet.
A következő példaszkript például a következőket találja:
- A
tempdb
szabad lemezterülete (nem veszi figyelembe atempdb
növekedéséhez elérhető szabad lemezterületet) - A verziótár által használt terület
- Belső objektumok által használt terület
- A felhasználói objektumok által használt terület
SELECT SUM(unallocated_extent_page_count) * 8.0 / 1024 AS tempdb_free_data_space_mb,
SUM(version_store_reserved_page_count) * 8.0 / 1024 AS tempdb_version_store_space_mb,
SUM(internal_object_reserved_page_count) * 8.0 / 1024 AS tempdb_internal_object_space_mb,
SUM(user_object_reserved_page_count) * 8.0 / 1024 AS tempdb_user_object_space_mb
FROM tempdb.sys.dm_db_file_space_usage;
Az oldalfoglalási vagy -felszabadítási tevékenységet a tempdb
munkamenet- vagy tevékenységszinten való figyeléséhez használhatja a sys.dm_db_session_space_usage és a sys.dm_db_task_space_usage dinamikus felügyeleti nézeteket. Ezek a nézetek segítenek azonosítani azokat a lekérdezéseket, ideiglenes táblákat vagy táblaváltozókat, amelyek nagy mennyiségű tempdb
területet használnak.
A következő példaszkripttel például beolvashatja a belső objektumok által lefoglalt és felszabadított tempdb
területet az egyes munkamenetek összes jelenleg futó tevékenységében:
SELECT session_id,
SUM(internal_objects_alloc_page_count) AS task_internal_objects_alloc_page_count,
SUM(internal_objects_dealloc_page_count) AS task_internal_objects_dealloc_page_count
FROM sys.dm_db_task_space_usage
GROUP BY session_id;
Az alábbi példaszkripttel megkeresheti az egyes munkamenetek és kérések belső és felhasználói objektumai által lefoglalt és jelenleg felhasznált tempdb
, mind a futó, mind a befejezett feladatok esetében:
WITH tempdb_space_usage AS
(
SELECT session_id,
request_id,
user_objects_alloc_page_count + internal_objects_alloc_page_count AS tempdb_allocations_page_count,
user_objects_alloc_page_count + internal_objects_alloc_page_count - user_objects_dealloc_page_count - internal_objects_dealloc_page_count AS tempdb_current_page_count
FROM sys.dm_db_task_space_usage
UNION ALL
SELECT session_id,
NULL AS request_id,
user_objects_alloc_page_count + internal_objects_alloc_page_count AS tempdb_allocations_page_count,
user_objects_alloc_page_count + internal_objects_alloc_page_count - user_objects_dealloc_page_count - user_objects_deferred_dealloc_page_count - internal_objects_dealloc_page_count AS tempdb_current_page_count
FROM sys.dm_db_session_space_usage
)
SELECT session_id,
COALESCE(request_id, 0) AS request_id,
SUM(tempdb_allocations_page_count * 8) AS tempdb_allocations_kb,
SUM(IIF (tempdb_current_page_count >= 0, tempdb_current_page_count, 0) * 8) AS tempdb_current_kb
FROM tempdb_space_usage
GROUP BY session_id, COALESCE (request_id, 0)
ORDER BY session_id, request_id;