Megosztás a következőn keresztül:


tempdb-adatbázis

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseAzure SQL Felügyelt PéldánySQL-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 tempdbis 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 bizonyos GROUP BY, ORDER BYvagy UNION 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 vagy SNAPSHOT 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.

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 tempdbaktuá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éseihez

A 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 tempdbobjektumai , 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:

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 CHECKALLOCfuttatása.
  • DBCC CHECKCATALOGfuttatá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 tempdbCONNECT 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 tempdbkell 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.
  • 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 a tempdb 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 a tempdbhaszná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 tempdbaktuá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_DURABILITYDISABLEDvan 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 a tempdb 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álja tempdb-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ő annyi tempdb 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. A tempdbteljesí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 a PRIMARY 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éget tempdb fájlok megnyitásakor a lemez maximális átviteli sebességének engedélyezéséhez. Mivel tempdb ú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. A FILE_FLAG_WRITE_THROUGHkapcsolatos 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 tempdbideiglenes 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 tempdbeseté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 a tempdbis). 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. Minden tempdb 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)

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 tempdbbelü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:

    További információért lásd a memóriaoptimalizált tempdb-metaadatok (HkTempDB) memóriahibák kapcsán jelzésű részt.

  • 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 tempdbmemó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ései tempdb a SNAPSHOT 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 a COLUMNSTORE vagy COLUMNSTORE_ARCHIVE adattömörítési paraméterrel nem támogatott, ha engedélyezve van a memóriaoptimalizált TempDB-metaadatok használata.

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ésttempdb fájlokhoz. Minden tempdb 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 a tempdb 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;