如果在可用性组中的主节点上强制执行计划,它是否应用于在辅助节点上运行的查询?
我正在寻找涵盖计划强制两种可能性的答案:
我已阅读以下内容,这些内容表明 QS 强制计划不会结转,但在文档中找不到任何权威信息,或任何有关计划指南的信息。
强制的决定性证据是辅助节点的执行计划中存在Use Plan或PlanGuideName和PlanGuideDB属性。
sql-server execution-plan availability-groups query-store plan-guides
我们最近遇到了临界点问题,我们的一些报告查询过去需要在几秒钟内完成执行,现在需要超过 2 分钟,因为查询优化器只是忽略了搜索列上的非聚集索引。下面是一个示例查询:
select top 100 *
from [dbo].[t_Call]
where ID > 0
and throwtime between '3/20/2014 7:00:00 AM' and '3/24/2014 6:59:59 AM'
order by id
Run Code Online (Sandbox Code Playgroud)
该ID列是聚集索引并且Throwtime具有非聚集索引。在这种情况下,我们注意到 ordering bythrowtime而不是ID更改查询计划和非聚集索引被使用。我们还计划存档一些旧数据(它目前有 2000 万行!!)。但是在应用程序中进行这些更改需要一些时间,我需要找到一种方法来使报告运行得相当快,而无需在应用程序级别进行更改(哦,这就是生活!)。
进入计划指南。我使用非聚集索引查询提示创建了以下计划指南,但出于某种原因,仍未使用非聚集索引。我错过了什么吗?
EXEC sp_create_plan_guide
@name = N'[prod2reports_callthrowtime]',
@stmt = N'select top 100 *
from [dbo] . [t_Call]
where ID > @0 and @1 < = ThrowTime and ThrowTime < = @2 order by ID',
@type = N'SQL',
@module_or_batch = N'select …Run Code Online (Sandbox Code Playgroud) performance sql-server execution-plan plan-guides query-performance
我有一个需要计划指南的查询,但我很难设置它。
从过程缓存中查询以下...
(@state nvarchar(14),
@jobName nvarchar(18),
@jobGroup nvarchar(28),
@oldState nvarchar(6))
UPDATE JOB_TRIGGERS
SET TRIGGER_STATE = @state
WHERE JOB_NAME = @jobName
AND JOB_GROUP = @jobGroup
AND TRIGGER_STATE = @oldState
Run Code Online (Sandbox Code Playgroud)
SQL Server 选择执行聚集索引扫描与非聚集索引查找。我在这个更新语句和表上的某个 select 语句中遇到了零星的死锁问题。我理解为什么 SQL 选择对表进行聚集索引扫描....Rows < 100 和 PageCount < 25。
该表有大量活动,由于它是第 3 方产品,我无法修改查询并提供索引提示。使用非聚集索引的查询成本更高,但我相信它会基于测试提高并发性....
我需要告诉它使用下面的非聚集索引
WITH (INDEX (ix_jobname_jobgroup_triggerstate))
Run Code Online (Sandbox Code Playgroud)
帮助设置这个将不胜感激..
我使用以下查询创建了一个计划指南:
EXEC sp_create_plan_guide
@name = N'Entity_Property fix',
@stmt = N'SELECT ID, ENTITY_NAME, ENTITY_ID, PROPERTY_KEY, CREATED, UPDATED, json_value FROM jirascheme.entity_property WHERE ENTITY_NAME=@P0 AND ENTITY_ID=@P1 AND PROPERTY_KEY=@P2',
@type = N'SQL',
@params = N'@P0 nvarchar(255), @P1 numeric(18, 0), @P2 nvarchar(255)',
@hints = N'OPTION (OPTIMIZE FOR UNKNOWN)';
Run Code Online (Sandbox Code Playgroud)
它似乎工作正常,但我注意到对象资源管理器中的计划上有一个小警告图标。
它看起来像这样:
执行查询时我没有收到任何警告,并且在将鼠标悬停在它上面或检查计划指南的属性时找不到有关它的任何信息。
这仅适用于测试环境,但为什么会出现,我应该担心吗?
长话短说,我有一个名为 vwRelatives 的视图,它使用 CTE 递归来构建家谱。它旨在一次查询一个人。
这在大约四分之一秒内运行:
SELECT * FROM vwRelatives WHERE person_id = 5
Run Code Online (Sandbox Code Playgroud)
这(从应用程序执行查询的方式)大约需要 4.5 秒:
exec sp_executesql N'SELECT * FROM vwRelatives WHERE person_id = @P1',N'@P1 int',5
Run Code Online (Sandbox Code Playgroud)
(请注意,我已经稍微简化了查询。真实的东西有一个显式的列列表和一个ORDER BY,但WHERE语义是相同的。我在任何一个版本中都得到了相同的症状。)
最有可能的是,SQL Serverperson_id = 5在为第一个查询创建执行计划时能够将其考虑在内,但对其进行参数化会导致运行整个视图,然后按 person_id进行过滤。
所以我想我会创建一个计划指南。现在我有两个问题。
这些是我正在采取的步骤,但似乎没有任何效果。
首先,运行“好”查询以将其放入计划缓存...
SELECT * FROM vwRelatives WHERE person_id = 5
Run Code Online (Sandbox Code Playgroud)
...然后执行标准步骤将其变成计划指南...
--Get the 'good' plan
SET @xml_showplan = (
SELECT query_plan
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_text_query_plan(qs.plan_handle, DEFAULT, …Run Code Online (Sandbox Code Playgroud) 我试图在一个简单的临时 SQL 查询上强制参数化。如本文中所述https://www.simple-talk.com/sql/performance/fixing-cache-bloat-problems-with-guide-plans-强制参数化/
但即使试图用最简单的查询来做到这一点,我也无法让它工作
CREATE TABLE fruit
(
id BIGINT PRIMARY KEY(id)
,title VARCHAR(150)
)
INSERT INTO fruit VALUES ( 1, 'Apple') , ( 2, 'Banana'), ( 3, 'Orange'), ( 4, 'Pear')
DECLARE @params nvarchar(max);
DECLARE @stmt nvarchar(max);
EXEC sp_get_query_template N'SELECT title FROM fruit WHERE id = 4',@stmt OUTPUT, @params OUTPUT;
--SELECT @params
EXEC sp_create_plan_guide
N'fruitGuide',
@stmt,
N'TEMPLATE',
NULL,
@params,
N'OPTION(PARAMETERIZATION FORCED)';
GO
SELECT title FROM fruit WHERE id = 1
Run Code Online (Sandbox Code Playgroud)
计划 XML:
显示编译并且不使用计划指南,我在这里遗漏了什么吗?我哪里出错了?
<?xml version="1.0" encoding="utf-16"?>
<ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" …Run Code Online (Sandbox Code Playgroud)