Statisztikák memória-optimalizált táblákhoz

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

A lekérdezésoptimalizáló oszlopok statisztikái alapján olyan lekérdezésterveket hoz létre, amelyek javítják a lekérdezés teljesítményét. A statisztikákat az adatbázis tábláiból gyűjtjük össze, és az adatbázis metaadataiban tároljuk.

A statisztikák automatikusan jönnek létre, de manuálisan is létrehozhatók. Például az index létrehozásakor a rendszer automatikusan létrehozza a statisztikákat az indexkulcs oszlopaihoz. A statisztikák létrehozásáról további információt a Statisztika című témakörben talál.

A táblázatadatok általában idővel változnak a sorok beszúrása, frissítése és törlése során. Ez azt jelenti, hogy a statisztikákat rendszeresen frissíteni kell. Alapértelmezés szerint a táblák statisztikái automatikusan frissülnek, amikor a lekérdezésoptimalizáló megállapítja, hogy elavultak lehetnek.

A memóriaoptimalizált táblák statisztikáinak szempontjai:

  • Az SQL Server 2016-tól kezdve, és az Azure SQL Database-ban, a memóriaoptimalizált táblák esetében támogatott a statisztikák automatikus frissítése, amikor az adatbázis kompatibilitási szintje legalább 130. Lásd: ALTER DATABASE kompatibilitási szintje (Transact-SQL). Ha egy adatbázis olyan táblákat használ, amelyeket korábban alacsonyabb kompatibilitási szinttel hoztak létre, a statisztikákat manuálisan kell frissíteni, hogy a statisztikák automatikusan frissüljenek.

  • Natívan lefordított tárolt eljárások esetén az eljárás lekérdezéseinek végrehajtási tervei optimalizálva vannak az eljárás fordításakor, ami létrehozáskor történik. A statisztikák frissítésekor nem lesznek automatikusan újrakompilálva. Ezért a tábláknak az eljárások létrehozása előtt reprezentatív adatkészletet kell tartalmazniuk.

  • A natívan lefordított tárolt eljárások manuálisan újrafordíthatók a sp_recompile (Transact-SQL) használatával, és automatikusan újrafordulnak, ha az adatbázis offline állapotba kerül és visszatér az online állapotba, vagy ha az adatbázis átállásra kerül, vagy a kiszolgáló újraindul.

A meglévő táblák statisztikáinak automatikus frissítésének engedélyezése

Ha a táblák legalább 130 kompatibilitási szintű adatbázisban jönnek létre, a táblák összes statisztikája automatikusan frissül, és nincs szükség további műveletekre.

Ha egy adatbázis memóriaoptimalizált táblái az SQL Server egy korábbi verziójában vagy 130-nál alacsonyabb kompatibilitási szinten lettek létrehozva, a statisztikákat manuálisan kell frissíteni, hogy az automatikus frissítés továbbhaladhasson.

Ha engedélyezni szeretné a régebbi kompatibilitási szinten létrehozott memóriaoptimalizált táblák statisztikáinak automatikus frissítését, kövesse az alábbi lépéseket:

  1. Frissítse az adatbázis kompatibilitási szintjét: ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL=130

  2. A memóriaoptimalizált táblák statisztikáinak manuális frissítése. Az alábbiakban egy példaszkript látható, amely ugyanezt hajtja végre.

  3. Manuálisan újrafordíthatja a natívan lefordított tárolt eljárásokat, hogy kihasználhassa a frissített statisztikák előnyeit.

Egyszeri szkript statisztikákhoz: Az alacsonyabb kompatibilitási szinten létrehozott memóriaoptimalizált táblák esetében a következő Transact-SQL szkriptet futtathatja egyszer az összes memóriaoptimalizált tábla statisztikáinak frissítéséhez, majd ettől kezdve engedélyezheti a statisztikák automatikus frissítését (feltéve, hogy AUTO_UPDATE_STATISTICS engedélyezve van az adatbázishoz):

-- Assuming AUTO_UPDATE_STATISTICS is already ON for your database:
-- ALTER DATABASE CURRENT SET AUTO_UPDATE_STATISTICS ON;

ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 130;
GO
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT
      @sql += N'UPDATE STATISTICS '
         + quotename(schema_name(t.schema_id))
         + N'.'
         + quotename(t.name)
         + ';' + CHAR(13) + CHAR(10)
   FROM sys.tables AS t
   WHERE t.is_memory_optimized = 1 AND 
		t.object_id IN (SELECT object_id FROM sys.stats WHERE no_recompute=1)
;
EXECUTE sp_executesql @sql;
GO
-- Each row appended to @sql looks roughly like:
-- UPDATE STATISTICS [dbo].[MyMemoryOptimizedTable];

Ellenőrizze, hogy az automatikus frissítés engedélyezve van-e: Az alábbi szkript ellenőrzi, hogy engedélyezve van-e az automatikus frissítés a memóriaoptimalizált táblák statisztikáihoz. Az előző szkript futtatása után az összes statisztikai objektum számára az oszlop 1 értéke auto-update enabled lesz.

SELECT 
	quotename(schema_name(o.schema_id)) + N'.' + quotename(o.name) AS [table],
	s.name AS [statistics object],
	1-s.no_recompute AS [auto-update enabled]
FROM sys.stats s JOIN sys.tables o ON s.object_id=o.object_id
WHERE o.is_memory_optimized=1

Útmutató táblák és eljárások üzembe helyezéséhez

Annak érdekében, hogy a lekérdezésoptimalizáló naprakész statisztikákkal rendelkezzen a lekérdezéstervek létrehozásakor, a következő négy lépés segítségével helyezzen üzembe memóriaoptimalizált táblákat és natívan lefordított tárolt eljárásokat, amelyek ezekhez a táblákhoz férnek hozzá:

  1. Győződjön meg arról, hogy az adatbázis kompatibilitási szintje legalább 130. Lásd: ALTER DATABASE kompatibilitási szintje (Transact-SQL).

  2. Táblák és indexek létrehozása. Az indexeket beágyazottan kell megadni a CREATE TABLE utasításokban.

  3. Adatok betöltése a táblákba.

  4. A táblákhoz hozzáférő tárolt eljárások létrehozása.

Az adatok betöltése után natívan lefordított tárolt eljárások létrehozása biztosítja, hogy az optimalizáló statisztikai adatokkal rendelkezik a memóriaoptimalizált táblákhoz. Ez biztosítja a hatékony lekérdezési terveket az eljárás összeállításakor.

Lásd még:

Memory-Optimized táblák