介紹一個SQL Server 2016后新增的功能:查詢存儲。查詢存儲的工作原理類似于飛行數(shù)據(jù)記錄器或者黑匣子,不斷地收集與查詢和計劃相關的編譯和運行時信息,包括已執(zhí)行查詢的歷史記錄,查詢運行時執(zhí)行統(tǒng)計信息,針對執(zhí)行計劃的執(zhí)行計劃等。與查詢相關的數(shù)據(jù)將永久保存在內(nèi)部表中,并通過一組視圖向用戶顯示。通過這些信息,可以快速查找性能差異,識別由查詢計劃更改和故障排除引起的性能等等問題。
通過以下命令或者SSMS界面進行開啟
ALTER DATABASE [Databaseone] SET QUERY_STORE = ON;
查詢存儲開啟前
查詢存儲開啟后
查詢存儲開啟后
官方對內(nèi)部對應的一些表,詳細描述如下
查看 |
說明 |
sys.query_store_query_text |
提供對數(shù)據(jù)庫執(zhí)行的唯一查詢文本。 將忽略查詢文本之前和之后的注釋和空格。 不忽略文本內(nèi)部的注釋和空格。 批中每個語句都會生成單獨的查詢文本項。 |
sys.query_context_settings |
顯示執(zhí)行查詢所依據(jù)的影響計劃的設置的非重復組合。 由于 context_settings_id 是查詢鍵的一部分,因此采用影響計劃的不同設置執(zhí)行的相同查詢文本將在查詢存儲中生成單獨的查詢條目。 |
sys.query_store_query |
在查詢存儲中單獨進行跟蹤和強制執(zhí)行的查詢條目。 如果查詢文本在不同的上下文設置下執(zhí)行,或在不同的 Transact-SQL 模塊(例如,存儲過程和觸發(fā)器等)內(nèi)外執(zhí)行,則可以產(chǎn)生多個查詢條目。 |
sys.query_store_plan |
顯示具有編譯時間統(tǒng)計信息的查詢估計計劃。 存儲計劃相當于一個可以通過使用 SET SHOWPLAN_XML ON 獲取的計劃。 |
sys.query_store_runtime_stats_interval |
查詢存儲將時間劃分為自動生成的時間窗口(間隔),并根據(jù)每個執(zhí)行計劃的間隔存儲聚合的統(tǒng)計信息。 間隔大小由(位于 Management Studio 中)的配置選項“統(tǒng)計信息收集間隔”或由使用 ALTER DATABASE SET Options (Transact-SQL) 的 INTERVAL_LENGTH_MINUTES 進行控制。 |
sys.query_store_runtime_stats |
執(zhí)行計劃的聚合運行時統(tǒng)計信息。 所有捕獲的指標都以 4 種統(tǒng)計函數(shù)的形式表示:平均值、最小值、最大值、標準偏差。 |
當然,這種類似的節(jié)點信息收集的東西,其實并不適合查詢頻率過大的查詢,經(jīng)過非嚴謹測試,性能損耗大概在5%左右。
做過DB性能優(yōu)化的人應該都知道,以前我們要么通過持續(xù)性的日志記錄分析,要么通過實時的監(jiān)控去找到對應的性能瓶頸,包括CPU、內(nèi)存、IO等,查詢存儲其實就是在此基礎上更進一步,把我們關心的點都存儲起來,并且有更詳盡信息和標準分析報告,相當省事。
具體可以查看官方文檔學習學習。