jer*_*ech 8 performance query-store sql-server-2017 query-performance
我从查询存储开始,它有问题:-( 没有生成 Top Resource Consuming Queries 的报告。它只是一直说“等待”几个小时和几个小时。后台查询(请参见下面的示例)不是能够完成并消耗大量 CPU。无论我如何更改配置选项,它一直在等待和等待(甚至最后一小时报告)。这是查询存储的现实吗?听起来是一个很棒的工具,但完全是实际无法使用?
我的查询存储大小约为 1.7 GB。我正在以 1 小时的间隔和自动捕获模式收集 7 天的数据 - 所以对我来说这似乎是合理的设置。
这是一个从未完成的后台查询示例:
SELECT TOP (@results_row_count)
p.query_id query_id,
q.object_id object_id,
ISNULL(OBJECT_NAME(q.object_id),'') object_name,
qt.query_sql_text query_sql_text,
ROUND(CONVERT(float, SUM(rs.avg_duration*rs.count_executions))*0.001,2) total_duration,
SUM(rs.count_executions) count_executions,
COUNT(distinct p.plan_id) num_plans
FROM sys.query_store_runtime_stats rs
JOIN sys.query_store_plan p ON p.plan_id = rs.plan_id
JOIN sys.query_store_query q ON q.query_id = p.query_id
JOIN sys.query_store_query_text qt ON q.query_text_id = qt.query_text_id
WHERE NOT (rs.first_execution_time > @interval_end_time OR rs.last_execution_time < @interval_start_time)
GROUP BY p.query_id, qt.query_sql_text, q.object_id
HAVING COUNT(distinct p.plan_id) >= 1
ORDER BY total_duration DESC
Run Code Online (Sandbox Code Playgroud)
任何想法如何使其可操作?
社论: 我已就此向 Microsoft 开立了一个案例。我们没有解决它,但找到了一个解决方法。如果我将Query Store Capture Mode更改为All(不使用自动模式),那么一切都会顺利,并且会及时生成报告。
社论#2 这是一个完全不同的问题。问题不在于捕获模式,而在于运行数据库的传统基数估算器。请为此 Azure 反馈投票:https : //feedback.azure.com/forums/908035-sql-server/suggestions/37971781-slow-or-non-operational-query-store-under-legacy-c
我有同样的问题,经过调查,发现缓慢的查询存储查询的根本问题是重复访问内存中的 TVF。从这些 TVF 返回多少行并不重要,重要的是它们被访问的次数。解决办法(直到微软修复了底层的东西)将是你能做的一切,让你的计划远离多次阅读它们。这个相关问题和我的博客文章中有更多信息。
最终,我能够通过生产中的计划指南修复此问题,并使用我发现的提示使优化器远离重复的 TVF 执行。由于需要精确的查询文本,并且查询很少完成,因此我构建了一个脚本,该脚本将在报告运行时通过从 exec_requests 中提取文本来创建计划指南。请按照以下步骤创建计划指南。
--USE YourDB
DECLARE @badqry NVARCHAR(MAX)
SELECT TOP (1) @badqry = SUBSTRING(st.text, (r.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE r.statement_end_offset
END - r.statement_start_offset)/2) + 1)
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) st
WHERE st.text LIKE '(@results_row_count int,@interval_start_time%'
IF @badqry IS NULL
RAISERROR('Missed the plan',16,1)
EXEC sp_create_plan_guide
@name = N'Fixing QueryStore Top Duration',
@stmt = @badqry,
@type = N'SQL',
@module_or_batch = NULL,
@params = N'@results_row_count int,@interval_start_time datetimeoffset(7),@interval_end_time datetimeoffset(7)',
@hints = N'OPTION (HASH JOIN, LOOP JOIN)'
Run Code Online (Sandbox Code Playgroud)
您应该能够对大多数预设的热门资源查询运行上述脚本,但如果这样做,请确保更改计划指南名称。另外,肯定有比 更好的提示HASH JOIN, LOOP JOIN,但到目前为止它对我来说已经足够好了。
| 归档时间: |
|
| 查看次数: |
1787 次 |
| 最近记录: |