【问题标题】:Problems with SQL Server table indexingSQL Server 表索引的问题
【发布时间】:2015-12-08 08:21:55
【问题描述】:

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

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

解决方案 1

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

解决方案 2

创建三个索引:

  1. DepartmentId 用于存储过程 1。
  2. DepartmentId + GroupId 用于存储过程 2。
  3. GroupId + SchoolId 用于存储过程 3。

非常感谢!

【问题讨论】:

标签: sql sql-server indexing


【解决方案1】:

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

可以做的是混合解决方案:

创建两个索引:

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

但要小心:不要过度索引! 太多的索引比没有更糟糕。

运行您的系统 - 观察它的性能。如果速度够快 - 开心就好,去度假吧!

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

【讨论】:

  • 感谢您的回答!我现在知道了。还有一个问题是我应该按顺序包含列吗?
  • @RickyYip:order by 是排序——这是一项相当昂贵的操作——所以是的,绝对值得一试,看看在order by 中的列上设置索引是否有助于提高性能。但正如我所说:不要过度索引!
猜你喜欢
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多