sql - SQL Server 表索引问题

标签 sql sql-server indexing

主题表:

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. 存储过程 1 的 DepartmentId
  2. 存储过程 2 的DepartmentId + GroupId
  3. 存储过程 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/

相关文章:

c# - .xmla 使用 C# 部署到 SQL

c# - 有没有办法创建或更新 MongoDB 索引?

sql-server - 当 OR @param = 1 添加到 WHERE 子句时,查询使用索引扫描而不是查找

c# - 如何在 Sitecore 中配置 Lucene 以仅索引主数据库上项目的最新版本?

sql - 插入异常的特异性

sql - 收到 "DataReader.GetFieldType returned null."错误。

sql - 在 SQL Server 中将 s、t 与 ş、ţ 进行比较

sql-server - SQL部署自动化

c# - 在文本框中显示 SQL 表的查询

sql - 如何动态屏蔽通过 Azure 保存为 json 的数据?