我有一个从称为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
子句中还是在两者上创建索引?
答案 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
子句。最后一个键用于JOIN
。 Milestone
索引中的第一个键用于JOIN
,下一个键用于过滤。
您还可以在末尾的各个索引中添加MilestoneName
和Step
,因此索引覆盖查询。