主题
表:
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
。 - 存储过程 2 的
DepartmentId + GroupId
。 - 存储过程 3 的
GroupId + SchoolId
。
非常感谢!
最佳答案
您的解决方案 #1 将不适用于查询 #3 - 如果您在 (departmentId, groupId, SchoolId)
上有复合索引,则您的查询 #3 肯定会无法使用它(因为它不使用 departmentId
作为条件)。复合索引仅在使用所有n个最左边列时才有效。
您可以做的是混合使用您的解决方案:
创建两个索引:
DepartmentId、GroupId
上有一个索引,这对于查询 #1 和 #2 很有用- 查询 #3 的
GroupId、SchoolId
上的另一个索引
但要小心:不要过度索引!索引太多比没有更糟糕。
运行您的系统 - 观察其性能。如果速度足够快 - 开心点,去度假!
仅当不够快时,才使用性能分析来查找性能最差的查询,并添加索引来处理这些查询。不要只是在您拥有的每个查询上放置索引 - 保持这些索引漂亮且 Shiny 还会在插入、更新和删除数据时降低性能。
关于sql - SQL Server 表索引问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34151069/