执行计划中未使用新的 SQL Server 索引

问题描述

我最近为我的公司承担了一些 Jr DBA 职能。我们运行的是 sql Server 2012。

我昨天创建了一个索引,但查询优化器似乎不想使用它。我可以使用查询提示强制索引,但是我想确保系统中的其他用户也能从这个索引中受益

select count(*) 
from prospect p
join phone ph with (index([ix_phone_ProspectId])) 
     on ph.prospect_id = p.prospect_id 

上述查询运行大约 3 秒。

下面的查询运行了大约一分钟,然后我停止了它

select count(*) 
from prospect p
join phone ph on ph.prospect_id = p.prospect_id 

关于如何帮助查询优化器查找此索引并开始使用它的任何建议? (注意,自部署索引以来,统计数据已更新)

解决方法

您可以创建一个视图,将索引提示放在那里,并将用户指向该视图。

CREATE TABLE X(i int PRIMARY KEY);
CREATE INDEX xx ON X(i)
GO

CREATE VIEW dbo.vwX WITH SCHEMABINDING AS
select xxx = count(*) 
from dbo.X p with (index(xx)) 

您也可以丢失当前的新索引并创建索引视图,然后将用户指向该视图。

ALTER VIEW dbo.vwX WITH SCHEMABINDING AS
select xxx = count_big(*) 
from dbo.X p

CREATE UNIQUE CLUSTERED INDEX vwXX ON dbo.vwX(xxx);

请注意,除非是内存表,否则不能将索引提示与索引视图一起使用。