查詢存放區如何收集資料

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse Analytics

SQL Server 查詢存放區可當作飛行資料記錄器來使用,不斷地收集與查詢和計劃相關的編譯和執行階段資訊。 查詢相關的資料會保存於內部資料表,並透過一組檢視呈現給使用者。

檢視

下圖顯示查詢存放區檢視及其邏輯關聯性,以及顯示為藍色實體的編譯時間資訊︰

Query Store process views
檢視描述

檢視 描述
sys.query_store_query_text 顯示針對資料庫執行的唯一查詢文字。 查詢文字前後的註解和空格會被忽略。 不會忽略文字內的註解和空格。 批次中的每個陳述式都會產生個別的查詢文字項目。
sys.query_context_settings 顯示在其下執行查詢之影響計劃設定的唯一組合。 使用不同影響計劃設定來執行的相同查詢文字,會在查詢存放區中產生不同的查詢項目,因為 context_settings_id 是查詢索引鍵的一部分。
sys.query_store_query 在查詢存放區中個別追蹤和強制執行的查詢項目。 如果單一查詢文字會在不同的內容設定下執行,或在不同的 Transact-SQL 模組 (預存程序、觸發程序等) 內部與外部執行,則可以產生多個查詢項目。
sys.query_store_plan 顯示查詢的估計計畫以及編譯時間統計資料。 預存計劃相當於您使用 SET SHOWPLAN_XML ON 所得到的計劃。
sys.query_store_runtime_stats_interval 查詢存放區會將時間細分為自動產生的時間範圍 (間隔),並在每個執行計畫的該間隔中儲存彙總統計資料。 間隔的大小,是透過設定選項 [統計資料收集間隔] (在 Management Studio 中) 或使用 ALTER DATABASE SET 選項 (Transact-SQL)INTERVAL_LENGTH_MINUTES 來控制。
sys.query_store_runtime_stats 針對執行計畫彙總的執行階段統計資料。 所有擷取的計量均會以四個統計函式形式來表示:平均值、最小值、最大值及標準差。

如需查詢存放區檢視的詳細資訊,請參閱使用查詢存放區監視效能中的<相關檢視、函式與程序>一節。

查詢處理

查詢存放區會在下列關鍵點,與查詢處理管線互動︰

  1. 當查詢第一次進行編譯時,會將查詢文字和初始計劃傳送至查詢存放區。

  2. 當查詢重新編譯時,會在查詢存放區中更新計劃。 如果建立了新計劃,查詢存放區就會為查詢新增新計劃項目,並保留先前項目以及它們的執行統計資料。

  3. 當查詢執行之後,會立即將執行階段統計資料傳送至查詢存放區。 針對已在目前有效間隔內執行的每個計畫,查詢存放區會維持其彙總統計資料的準確性。

  4. 在編譯和檢查以進行重新編譯階段期間,SQL Server 會判斷查詢存放區中是否有計劃應該針對目前執行的查詢加以套用。 如果有強制執行的計劃且程序快取中計劃與所強制執行計劃不同,則查詢會重新編譯。 實際上這個方式就像將 PLAN HINT 套用到該查詢一樣。 此程序會明確地發生於使用者應用程式中。

下圖說明先前步驟所述的整合時機︰

Query Store process

備註

為了減少 I/O 額外負荷,會從記憶體內部擷取新資料。 寫入作業會排入佇列,並隨後排清至磁碟。 查詢和計劃資訊 (在下圖中顯示為計劃存放區) 會以最快速度排清。 執行階段統計資料 (顯示為執行階段統計資料) 會保留在記憶體中,時間長短依 SET QUERY_STORE 陳述式 DATA_FLUSH_INTERVAL_SECONDS 選項所定義的期限。 您可以使用 [Management Studio 查詢存放區] 對話方塊輸入 [資料排清間隔 (分鐘)] 的值,這會在內部轉換為秒。

Query Store process plan

如果在使用追蹤旗標 7745 時發生系統當機或關機,則查詢存放區可能會遺失已收集但尚未保存的執行時間資料,最多至 DATA_FLUSH_INTERVAL_SECONDS 所定義的時間範圍。 我們建議使用預設值 900 秒 (15 分鐘) 作為查詢擷取效能與資料可用性之間的平衡。

重要

系統不會嚴格強制執行 [大小上限 (MB)] 的限制。 只有當查詢存放區將資料寫入磁碟時,系統才會檢查儲存體大小。 此間隔是由 [資料排清間隔] 值所設定。 如果查詢存放區違反儲存體大小檢查之間的大小上限,即會轉換為唯讀模式。 如果啟用 [以大小為基準的清除模式],也會觸發強制執行大小上限的清除機制。

注意

如果有記憶體壓力,執行階段統計資料就能在使用 DATA_FLUSH_INTERVAL_SECONDS 所定義的時間之前排清至磁碟。

讀取查詢存放區期間,記憶體內部資料和磁碟上的資料會明顯地一致。

如果工作階段終止,或者用戶端應用程式重新啟動或當機,將不會記錄查詢統計資料。

Query Store process plan information

另請參閱

使用查詢存放區監視效能
查詢存放區的最佳做法
查詢存放區目錄檢視 (Transact-SQL)