如何導出查詢儲存數據?
我在 SQL 2017 實例上執行了查詢儲存 (QS)。目前在 RTM,RTM CU13 目前正在測試中,將在下個月的更新檔視窗中應用於 prod。
雖然大多數查詢和報告會快速返回結果而幾乎沒有影響,但我嘗試在等待周圍查看的任何東西都是有問題的。CPU 使用率從 20% 上升到 80%,並在那裡停留了幾分鐘,直到我殺死它。這是 24/7 生產系統,所以如果我真的想查看 QS 等待,我將需要在其他地方進行。
該數據庫為 150GB,其中 1000MB 空間用於 QS。我有一個 10GB 空間的沙箱,所以如果我能把 QS 數據拿出來,我就可以在那裡玩。
我環顧四周,我沒有找到如何做到這一點。我發現的最好的是這個sql.sasquatch 2016 文章,其中有 Erin Stellato 的 2016 年回答
目前沒有導出和/或導入查詢儲存數據的選項,但是有一個 Connect 項目可以投票:https ://connect.microsoft.com/SQLServer/feedback/details/2620017/export-query-store -tables-separately-from-the-database-tables
注意:連結轉到重定向“Microsoft Connect 已停用”看起來實際連結應該是https://feedback.azure.com/forums/908035-sql-server/suggestions/32901670-export-query-store -tables-separately-from-the-data
查看 Microsoft,我發現您可能用來訪問數據的大多數東西都是視圖、儲存過程或報告。我沒有看到從數據庫中提取所有 QS 內容的方法。
直接查詢的範例,使用視圖 Kendra Little的範例我玩弄了
Select *
從視圖中執行並將結果導出到我的沙箱的想法。但由於我沒有找到任何人談論它,我不確定這是個好主意。有關的
此外 ,我希望能夠保留 CU13 之前的查詢儲存結果,以用作比較 CU13 之後的基準。
在第一個答案後編輯並編輯相同的 jadarnel27 對答案的 最近編輯添加了很好的資訊,但我不關心使用者界面,我希望能夠在不更改數據庫或影響性能的情況下查詢數據。作為次要目標,我希望能夠存檔 QS 數據,以便我可以查看以前的性能(即在升級之前,但在舊的 QS 數據會被清除之後)
首先,您可以通過更新統計資訊、使用計劃指南添加查詢提示或更改數據庫兼容性級別/CE,直接針對查詢儲存目錄視圖進行查詢,從而獲得可接受的性能。在此處查看 Forrest 和 Marian 的答案:
如果您使用的是 SP1 或更高版本,最簡單的方法是使用
DBCC CLONEDATABASE
- 其中包括統計資訊、查詢儲存數據和架構對象 - 但沒有來自表的實際數據。否則,對於導出,一種方法是
SELECT...INTO
從查詢儲存視圖到“沙盒”數據庫的簡單方法。 以上是相關意見。基本方法是這樣的:
SELECT * INTO Sandbox.dbo.query_store_runtime_stats FROM sys.query_store_runtime_stats; SELECT * INTO Sandbox.dbo.query_store_runtime_stats_interval FROM sys.query_store_runtime_stats_interval; SELECT * INTO Sandbox.dbo.query_store_plan FROM sys.query_store_plan; SELECT * INTO Sandbox.dbo.query_store_query FROM sys.query_store_query; SELECT * INTO Sandbox.dbo.query_store_query_text FROM sys.query_store_query_text; SELECT * INTO Sandbox.dbo.query_store_wait_stats FROM sys.query_store_wait_stats;
這種方法的好處在於:
你只會得到你需要的數據(1000 MB)
您可以添加索引來支持您的報告查詢,因為這些是實際的表
他們不會有不尋常的記憶體掃描行為導致對實際視圖的性能不佳(再次因為它們是實際的表)
- 注意:
SELECT...INTO
查詢不應像內置查詢儲存報告查詢那樣佔用 CPU,因為它們不會有導致重複訪問記憶體中 TVF 的有問題的連接您可以通過更改表名來保留不同版本的數據(對於不同的 CU 級別等),或者在表中添加一個列來指示用於該導入的數據和/或 SQL Server 版本
這種方法的“缺點”是您不能使用查詢儲存使用者界面。一種解決方法是使用分析器或擴展事件來擷取使用者界面正在為您需要的特定報告執行的查詢。您甚至可以在非生產環境中進行此擷取,因為查詢應該是相同的。
警告:這可能是一個非常糟糕的主意。 您通常無法寫入這些表是有原因的。特別感謝Forrest向我提到了這種可能性。
如果您真的希望能夠使用使用者界面,您實際上可以在通過 DAC 連接時載入帶有數據的基本 Query Store 表。這對我有用。
提醒:您必須使用 DAC 連接來執行此操作,否則您將收到與
sys.plan_persist_*
不存在的表相關的錯誤USE [master]; GO CREATE DATABASE [Sandbox]; GO USE [YourSourceDatabaseWithTheQueryStoreInfo]; GO BEGIN TRANSACTION; INSERT INTO Sandbox.sys.plan_persist_runtime_stats SELECT * FROM sys.plan_persist_runtime_stats; INSERT INTO Sandbox.sys.plan_persist_runtime_stats_interval SELECT * FROM sys.plan_persist_runtime_stats_interval; INSERT INTO Sandbox.sys.plan_persist_plan SELECT * FROM sys.plan_persist_plan; INSERT INTO Sandbox.sys.plan_persist_query SELECT * FROM sys.plan_persist_query; INSERT INTO Sandbox.sys.plan_persist_query_text SELECT * FROM sys.plan_persist_query_text; INSERT INTO Sandbox.sys.plan_persist_wait_stats SELECT * FROM sys.plan_persist_wait_stats; INSERT INTO Sandbox.sys.plan_persist_context_settings SELECT * FROM sys.plan_persist_context_settings COMMIT TRANSACTION; GO USE [master]; GO ALTER DATABASE [Sandbox] SET QUERY_STORE = ON (OPERATION_MODE = READ_ONLY);
注意:如果您使用的是 SQL Server 2016,則需要刪除有關等待統計資訊的行 - 直到 SQL Server 2017 才添加目錄視圖
之後,我可以使用 SSMS 中的查詢儲存 UI 來查看來自源數據庫的查詢資訊。整潔的!
在關閉Query Store的情況下將數據載入到 Sandbox 數據庫中,然後以只讀模式打開 Query Store 非常重要。 否則 QS 最終會處於錯誤狀態,並將其寫入 SQL Server 錯誤日誌:
錯誤:12434,嚴重性:20,狀態:56
。數據庫沙箱中的查詢儲存無效,可能是由於架構或目錄不一致。
我還注意到,如果源數據庫中有記憶體中的 OLTP (Hekaton) 表,這將不起作用。無論我做什麼,查詢儲存最終都處於“錯誤”狀態,並在錯誤日誌中顯示以下消息:
錯誤:5571,嚴重性:16,狀態:2。
內部 FILESTREAM 錯誤:無法訪問垃圾收集表。
您可以通過向沙盒數據庫添加記憶體優化文件組來解決這個問題,我還沒有嘗試過。