0

我有一个表,其定义如下所示:

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的执行计划:

执行计划

4

1 回答 1

0

一个PK是集群的,另一个是不集群的。两者兼而有之可能会有好处。

同一列上的非聚集索引和聚集索引

于 2017-11-13T19:15:33.643 回答