SQL Server表索引的问题

时间:2015-12-08 08:21:56

标签: sql sql-server indexing

Subject表:

Id int
DepartmentId int
GroupId int
SchoolId int
Name varchar(255)

查询

查询#1

SELECT * 
FROM [Subject] t1, [Department] t2 
WHERE t1.DepartmentId = t2.DepartmentId

查询#2

SELECT * 
FROM [Subject] t1, [Group] t2, [Department] t3 
WHERE t1.GroupId = t2.GroupId 
  AND t1.SchoolId = t3.DepartmentId

查询#3

SELECT * 
FROM [Subject] t1, [Group] t2, [School] t3 
WHERE t1.GroupId = t2.GroupId 
  AND t1.SchoolId = t3.SchoolId

我应该为表“subject”创建3个索引,还是仅仅一个就足够了?

解决方案1 ​​

创建一个索引:departmentId + GroupId + SchoolId

解决方案2

创建三个索引:

  1. DepartmentId用于存储过程1。
  2. DepartmentId + GroupId用于存储过程2。
  3. GroupId + SchoolId用于存储过程3。
  4. 非常感谢你!

1 个答案:

答案 0 :(得分:2)

您的解决方案#1将用于查询#3 - 如果您在(departmentId, groupId, SchoolId)上有复合索引,那么您的查询#3肯定无法使用它(因为它不使用departmentId作为标准)。如果您使用所有n个最左侧的列,则复合索引有效。

可以做的事情是您的解决方案之间的混合:

创建两个索引:

  • DepartmentId, GroupId上的一个索引,对于查询#1和#2
  • 非常有用
  • 查询#3
  • GroupId, SchoolId上的另一个索引

但要谨慎:不要过度索引!太多指数比没有指数差。

运行您的系统 - 观察它的性能。如果它足够快 - 快乐,去度假!

只有足够快时,才能使用性能分析来查找性能最差的查询,并添加索引来处理这些查询。不要只为每个查询添加索引 - 在插入,更新和删除数据时,保持这些索引不错,闪亮会降低性能。