【发布时间】:2016-10-27 07:49:05
【问题描述】:
我在 Windows Server 2012 中使用 SQL Server 2014 Enterprise。
我检查了Min 和Max Allocated Memory for SQL Server 的配置是否正确。
昨天,用户多次并行运行少量报告并收到大量警报(高 CPU 和高内存)。从下面的查询中,我发现了 CPU 利用率最高的查询:
...
...
FROM sys.dm_exec_query_stats AS qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) AS st
cross apply sys.dm_exec_query_plan (qs.plan_handle) AS qp
ORDER BY (total_worker_time/execution_count) desc, qs.last_execution_time DESC
我发现前 10 个查询完全一样,除了 WHERE 子句的一些变化。 execution_count = 1 用于所有查询。查询将记录插入到具有以下格式的#temp 表中:
Insert into #Temp(col1, col2,............)
Select
.
.
From
(
Select
.
.
Where (CONTAINS(val1, ' "xx1*" ') OR CONTAINS(val2, ' "yy1*" ') OR CONTAINS(val3, ' "zz1*" ')..........30-35 CONTAIN blocks)
-- here "xx*", "yy*" values are changing in each query (I guess this is due to parameter selection by end users)
) x
如果这些动态查询是罪魁祸首,那么解决方案是什么(因为用户不会停止运行查询)?
我可以要求将报告查询转换为 SP 吗? 如何避免我得到不同的执行计划?
我手动终止了使用率很高的查询,但这不是解决方案。
寻求帮助。
更新:
我不再看到任何内存问题。但是 CPU 仍然达到 100%。
我观察到用户经常访问上述特定查询(在报告中使用),并且当此查询运行时 CPU 利用率达到 100%。它经常发生。 WHERE 子句根据用户选择的报告参数在每次执行时发生变化(我不知道报告的具体设计方式或参数是如何传递的)。
此外,我检查了表格统计信息(每天都会更新),索引正确定义。基表处理超过 300 万行(在 CONTAIN 中使用的 val1、val2...属于该表)。
调整这个查询的方法是什么?
【问题讨论】:
-
How can I avoid the different execution plans that I am getting?..你能贴几个吗.. -
可能是您的内存被拉伸到了最大值,并且涉及(虚拟)内存交换。您的查询将无法从缓存命中中受益,这会大大减慢速度。
-
您在
val列上定义了正确的全文索引? -
@TT - 我对查询的目的不太了解。我怎样才能检查它?还有,我如何查看
memory is stretched to the max and there is (virtual) memory swapping involved? -
@p2k 只是好奇您是否有运气优化您的查询。您是否设法加快了速度?
标签: sql-server full-text-search sqlperformance