这解释起来有点复杂,但很容易重现。
对于大约 10%-30% 的查询(按计数),大量的查询存储数据不可用。我查看了 SQL 2016 和 SQL 2017,其中查询存储已经运行了数周以上,数据库上有活动。
下面的查询将返回两组数据,顶部集没有 值query_store_query.last_execution_time
,而底部集在字段中有数据。“没有”也缺少大多数运行时统计数据。
EXEC sp_query_store_flush_db; --Same results without this, but just to rule it out in the examples.
go
Select * from sys.query_store_query
where query_store_query.last_execution_time is null -- there are bunch of these, also missing other data, why?
Select * from sys.query_store_query
where query_store_query.last_execution_time is not null
Run Code Online (Sandbox Code Playgroud)
我最初使用导出的查询存储数据发现了这一点我的数据在 Excel 工作表中,我进行了排序和比较,但没有发现任何将“拥有”与“没有”分开的共同因素
为了排除数据导出问题,我使用上面的代码直接从系统数据视图中获取数据。结果与导出数据中的结果相似。
为了排除系统数据视图,我使用“跟踪查询”从根数据报告。(查询存储 > 跟踪查询 > 配置)
3.A. 对于“拥有”,查询计划等会显示出来,正如您所期望的
3.B. 对于“没有”,没有查询计划和指标
我发现的唯一范围限制因素是,在非常活跃的数据库上,“没有”仅限于最后几个小时。但是在慢速数据库上,“没有”可能有可以追溯到几周前的 initial_compile_start_time。(我怀疑“没有”正在被清除,然后在下次运行“以前从未见过,新”查询时重新创建)
“没有”可以有任何范围的编译计数、计划数量等。
我在 SQL 2017 实例上运行了查询存储 (QS)。目前在 RTM 中,RTM CU13 目前正在测试中,将在下个月的补丁窗口中应用于 prod。
虽然大多数查询和报告快速返回结果,几乎没有影响,但我尝试查看等待的任何事情都是有问题的。CPU 使用率从 20% 上升到 80%,并在那里停留几分钟,直到我杀死它。这是 24/7 生产系统,所以如果我真的想查看 QS 等待,我将需要在其他地方进行。
数据库为 150GB,其中 1000MB 空间用于 QS。我有一个有 10GB 空间的沙箱,所以如果我能把 QS 数据拿出来,我就可以在那里玩。
我环顾四周,我没有找到如何做到这一点。我发现的最好的是这篇sql.sasquatch 2016 post with an 2016 answer by Erin Stellato
目前没有导出和/或导入查询存储数据的选项,但有一个 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 -表与数据分开
看看 Microsoft,我发现您可能用来访问数据的大多数东西都是视图、存储过程或报告。我没有看到从数据库中提取所有 QS 内容的方法。
直接查询的示例,使用视图示例 Kendra Little我曾想过从Select *
视图中执行一个并将结果导出到我的沙箱的想法。但由于我没有找到任何人谈论它,我不确定这是个好主意。
有关的
此外, 我希望能够保留 CU13 之前的查询存储结果,以用作比较 CU13 之后的基线。
在第一个回答后编辑并编辑相同的 最近编辑 jadarnel27 对答案的编辑 …