我有一个表,其定义如下所示:
CREATE TABLE Budget_Cost_Centers
(
CostCenterIDX INT NOT NULL,
Name VARCHAR(100) NOT NULL,
...
CONSTRAINT PK_Budget_Cost_Centers
PRIMARY KEY CLUSTERED (CostCenterIDX ASC)
);
(有些列被忽略了,因为它们不相关)
我现在在针对该表的查询上运行 Database Tuning Advisor,它建议:
CREATE NONCLUSTERED INDEX [_dta_index_Budget_Cost_Centers_5_1079674894__K1]
ON [dbo].[Budget_Cost_Centers] ([COSTCENTERIDX] ASC)
WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
这显然与现有的主键相同。知道为什么它会建议这个吗?试图确保我没有遗漏有关 SQL Server 工作原理的信息,而不是顾问提出的一些荒谬的建议,因为这只是自动调优分析的局限性。
更多信息:我将产生此建议的查询分解为基本要素:
select
d.PhaseIDX,
sum(d.YTDActual) YTDActual
from
Budget_Cost_Centers cc
join
Budget_Cost_Centers mc on cc.MasterCostCenteridx = mc.CostCenterIDX
join
Budget_Detail d on cc.CostCenterIDX= d.CostCenterIDX
group by
d.PhaseIDX
表自引用和查询作者将其连接到自身,以便将记录过滤到仅包含所述引用的记录。将查询更改为以下等效结果会导致顾问不再提出建议:
select
d.PhaseIDX,
sum(d.YTDActual) YTDActual
from
Budget_Cost_Centers cc
join
Budget_Detail d on cc.CostCenterIDX = d.CostCenterIDX
where
cc.MasterCostCenterIDX is not null
group by
d.PhaseIDX
这是原始sql的执行计划: