我有一个表,其定义如下:
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的执行计划:
答案 0 :(得分:0)
PK是群集的,另一个不是群集的。两者都有可能是有利的。