我在 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
查询不应像内置查询存储报告查询那样占用 CPU,因为它们不会有导致重复访问内存中 TVF 的有问题的连接这种方法的“缺点”是您不能使用查询存储用户界面。一种解决方法是使用分析器或扩展事件来捕获用户界面正在为您需要的特定报告执行的查询。您甚至可以在非生产环境中进行此捕获,因为查询应该是相同的。
警告:这可能是一个非常糟糕的主意。 您通常无法写入这些表是有原因的。特别感谢Forrest向我提到了这种可能性。
如果您真的希望能够使用用户界面,您实际上可以在通过 DAC 连接时加载带有数据的基本 Query Store 表。这对我有用。
提醒:您必须使用 DAC 连接来执行此操作,否则您将收到与
sys.plan_persist_*
不存在的表相关的错误注意:如果您使用的是 SQL Server 2016,则需要删除有关等待统计信息的行 - 直到 SQL Server 2017 才添加目录视图
之后,我可以使用 SSMS 中的查询存储 UI 来查看来自源数据库的查询信息。整洁的!
在关闭Query Store的情况下将数据加载到 Sandbox 数据库中,然后以只读模式打开 Query Store 非常重要。 否则 QS 最终会处于错误状态,并将其写入 SQL Server 错误日志:
我还注意到,如果源数据库中有内存中的 OLTP (Hekaton) 表,这将不起作用。无论我做什么,查询存储最终都处于“错误”状态,并在错误日志中显示以下消息:
您可以通过向沙盒数据库添加内存优化文件组来解决这个问题,我还没有尝试过。
作为对Josh Darnell 出色答案的补充,我通读了导出到表中的数据视图的所有描述。以下代码添加了 Microsoft 文档中描述的主键、聚集索引和外键。它应该有助于查询数据。
请注意,query_store_runtime_stats和query_store_wait_stats都没有 microsoft 文档中描述的主键。由于这是导出的数据,因此我在大多数当前时间间隔内对多个统计数据进行了聚集索引的评估。
间隔是数据库的配置设置interval_length_minutes在查询存储页面的属性 GUI 中列为“统计信息收集间隔”。
使用
EXEC sp_query_store_flush_db;
beforeSELECT * INTO
不会将当前运行时统计间隔中的多行编译为单个条目,从而防止在重型 OLTP数据库中 query_store_runtime_stats 和 query_store_wait_stats 上的主键和聚集索引。在这种情况下,在添加主键、聚集索引和外键(上)之前,使用下面的代码删除最新的运行时间间隔。在我的情况下,我有 30 分钟的间隔,所以如果我想要所有数据到早上 6 点,我会在早上 6 点之后提取几分钟,然后使用下面的内容删除 6AM+。
我想知道是否有办法使用克隆数据库选项和一些经典的 jiggery pokery 将数据保留在 QS GUI 中进行分析。
不确定这是否有效,只是思考的食物