我有一个需要计划指南的查询,但我很难设置它。
从过程缓存中查询以下...
(@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
SQL Server 选择执行聚簇索引扫描与非聚簇索引查找。这个更新语句和表上的某个选择语句偶尔会出现死锁问题。我明白为什么 SQL 在表上选择聚集索引扫描....Rows < 100 和 PageCount < 25。
该表有大量活动,并且由于它是第 3 方产品,我无法修改查询并提供索引提示。使用非聚集索引的查询成本更高,但我相信它会根据测试提高并发性......
我需要告诉它使用下面的非聚集索引
WITH (INDEX (ix_jobname_jobgroup_triggerstate))
帮助设置这个将不胜感激..
理想情况下,我们希望使用计划指南来添加一个
TABLE HINT
,因此引导查询变为:不幸的是,这是不可能的,因为
UPDATE
没有FROM
子句:您可以通过捕获等效的 XML 显示计划来解决此问题:
请注意,这种形式的查询有一个
FROM
子句来支持索引提示。查询必须完全按照上面的方式编写,没有目标表的常用别名。然后,您可以将此 XML(不带开头
<?xml version="1.0" encoding="utf-16"?>
)元素用作 中的@hints
参数sp_create_plan_guide
。例子
给定表和索引:
计划指南(使用从上面的索引提示表单中捕获的 XML)是:
提交查询:
给出想要的方案:
计划属性显示使用了计划指南:
您不能只使用上面的确切计划指南 - 它只是一个示例,它适用于我创建的用于重现您的问题的玩具模式。尽管如此,概述的一般过程应该适合您。