SQL Server-在没有FK的2个表上创建索引

时间:2018-12-05 02:11:45

标签: sql sql-server indexing

我有一个从称为Milestone的表中选择的存储过程。看起来像这样:

SELECT PK_Milestone, MilestoneName, Step
FROM dbo.Milestone as M
INNER JOIN dbo.Process as P ON M.FK_Milestone_Process = P.PK_Process
WHERE P.ProcessID = @Input_ProcessID
  AND M.IsActive = 1
  AND P.IsActive = 1

我读到,为了加快数据检索的速度,我必须创建一个索引,因此尝试创建一个索引。

CREATE INDEX IX_Milestone 
    ON Milestone (FK_Milestone_Process, IsActive)

但是,我不确定我的索引是否正确。我应该在我的INNER JOIN的列中,WHERE子句中还是在两者上创建索引?

2 个答案:

答案 0 :(得分:2)

我将假设您的过滤条件p.ProcessID是非常有选择性的(即,它从表dbo.Process中选择了很少的行)。

如果是这种情况,那么我将创建以下两个索引:

create index ix1 on dbo.Process (processID, isActive);

create index ix2 on dbo.Milestone (FK_Milestone_Process, isActive);

答案 1 :(得分:2)

对于此查询:

SELECT PK_Milestone, MilestoneName, Step
FROM dbo.Milestone M INNER JOIN
     dbo.Process P
     ON M.FK_Milestone_Process = P.PK_Process
WHERE P.ProcessID = @Input_ProcessID AND
      M.IsActive = 1 AND
      P.IsActive = 1;

最好的索引可能是:Process(ProcessId, IsActive, PK_Process)Milestone(FK_Milestone_Process, IsActive)

Process索引中的前两个键覆盖WHERE子句。最后一个键用于JOINMilestone索引中的第一个键用于JOIN,下一个键用于过滤。

您还可以在末尾的各个索引中添加MilestoneNameStep,因此索引覆盖查询。