Советник по настройке базы данных SQL Server предлагает существующий кластерный индекс
У меня есть таблица, определение которой выглядит так:
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:
1 ответ
ПК кластеризован, а другой не кластеризован. Там может быть преимущество наличия обоих.