SQL Server数据库调优顾问建议现有的聚簇索引

时间:2017-11-13 18:30:57

标签: sql-server database-tuning-advisor

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

CREATE TABLE Budget_Cost_Centers
(
    CostCenterIDX INT NOT NULL,
    Name VARCHAR(100) NOT NULL,
    ...
    CONSTRAINT PK_Budget_Cost_Centers 
        PRIMARY KEY CLUSTERED (CostCenterIDX ASC)
);

(因为它们不相关而忽略了一些列)

我现在针对此表运行数据库调优顾问,并建议:

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

Execution Plan

1 个答案:

答案 0 :(得分:0)

PK是群集的,另一个不是群集的。两者都有可能是有利的。

Non-clustered index and clustered index on the same column