查詢優化器會使用有關數據行的統計數據來建立可改善查詢效能的查詢計劃。 統計數據會從資料庫中的數據表收集,並儲存在資料庫元數據中。
統計數據會自動建立,但也可以手動建立。 例如,建立索引時,會自動為索引鍵數據行建立統計數據。 如需建立統計數據的詳細資訊,請參閱 統計數據。
數據表數據通常會隨著時間而變更,因為數據列會插入、更新和刪除。 這表示需要定期更新統計數據。 根據預設,當優化器判斷數據表可能已過期時,磁碟數據表上的統計數據會自動更新。
記憶體優化數據表的統計數據預設不會更新。 相反地,您需要手動更新它們。 針對個別數據行、索引或數據表使用 UPDATE STATISTICS (Transact-SQL )。 使用 sp_updatestats (Transact-SQL) 更新資料庫中所有用戶和內部數據表的統計數據。
使用 CREATE STATISTICS (Transact-SQL) 或 UPDATE STATISTICS (Transact-SQL)時,您必須指定 NORECOMPUTE 來停用記憶體優化數據表的自動統計數據更新。 針對磁碟數據表, sp_updatestats(Transact-SQL) 只有在上次sp_updatestats( Transact-SQL)之後已修改數據表時,才會更新統計數據。 針對記憶體優化數據表, sp_updatestats (Transact-SQL) 一律會產生更新的統計數據。
sp_updatestats (Transact-SQL) 是記憶體優化數據表的好選項:否則,您必須知道哪些數據表有重大變更,以便您可以個別更新統計數據。
您可以藉由取樣資料或執行完整掃描來產生統計數據。 取樣的統計數據只會使用數據表數據的範例來估計數據分佈。 Fullscan 統計數據會掃描整個數據表,以判斷數據分佈。 Fullscan 統計數據通常更精確,但需要較長的時間才能計算。 取樣的統計數據可以更快收集。
磁碟數據表預設會使用取樣統計數據。 記憶體優化的數據表僅支援全掃描統計資料。 使用 CREATE STATISTICS (Transact-SQL) 或 UPDATE STATISTICS (Transact-SQL)時,您必須指定 FULLSCAN 記憶體優化數據表的選項。
記憶體優化資料表的數據統計額外考量:
記憶體優化數據表上的索引是在建立表時同時創建的。 當表格為空時,會建立索引鍵列的統計數據。 因此,將數據載入數據表之後,必須更新這些統計數據。
針對原生編譯的預存程式,在編譯程式時,會優化程序中查詢的執行計劃。 只有當程式建立時和伺服器重新啟動時,才會發生此情況,而不是在統計數據更新時發生。 因此,數據表必須包含一組代表性的數據和統計數據,必須在建立程式之前 up-to日期。 (如果資料庫離線並重新上線,或伺服器重新啟動,則會重新編譯原生編譯預存程式。
部署 Memory-Optimized 數據表時的統計數據指導方針
若要確保查詢優化器在建立查詢計劃時具有 up-to日期統計數據,請使用下列五個步驟來部署記憶體優化數據表:
建立數據表和索引。 索引會在語句中
CREATE TABLE內嵌指定。將數據載入數據表。
更新數據表上的統計數據。
建立可存取數據表的預存程式。
執行工作負載,其中包含原生編譯和解譯的 Transact-SQL 預存程式,以及即席批次。
載入數據並更新統計數據之後,建立原生編譯的預存程式,可確保優化器具有記憶體優化數據表可用的統計數據。 這可確保編譯程式時有效率的查詢計劃。
維護 Memory-Optimized 數據表統計數據的指導方針
若要使統計數據 up-to保持最新狀態,請定期更新記憶體優化資料表上的統計數據。
如果數據經常變更,您應該經常更新統計數據。 例如,在批次更新之後更新數據表統計數據。 更新統計數據之後,卸除並重新建立原生編譯的預存程式,讓它們受益於更新的統計數據。
.
請勿在尖峰工作負載期間更新統計數據。
若要更新統計資料:
若要更新單一記憶體優化數據表的統計數據(myschema。 Mytable),執行下列腳本:
UPDATE STATISTICS myschema.Mytable WITH FULLSCAN, NORECOMPUTE
若要更新目前資料庫中所有記憶體優化數據表的統計數據,請執行下列腳本:
DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql += N'
UPDATE STATISTICS ' + quotename(schema_name(schema_id)) + N'.' + quotename(name) + N' WITH FULLSCAN, NORECOMPUTE'
FROM sys.tables WHERE is_memory_optimized=1
EXEC sp_executesql @sql
若要更新資料庫中所有資料表的統計資料,請執行 sp_updatestats (Transact-SQL) 。
以下範例報告記憶體優化資料表的統計數據,並指出這些統計數據最近一次更新的時間。 此資訊可協助您決定是否需要更新統計數據。
select t.object_id, t.name, sp.last_updated as 'stats_last_updated'
from sys.tables t join sys.stats s on t.object_id=s.object_id cross apply sys.dm_db_stats_properties(t.object_id, s.stats_id) sp
where t.is_memory_optimized=1