2

我正在使用 SQL Server 2012。

我正在尝试优化这样的查询:

SELECT TOP 20 ta.id, 
              ta.name, 
              ta.amt, 
              tb.id, 
              tb.name, 
              tc.name, 
              tc.id, 
              tc.descr 
FROM   a ta 
       INNER JOIN b tb 
               ON ta.id = tb.id 
       INNER JOIN c tc 
               ON tb.id = tc.id 
ORDER  BY ta.mytime DESC 

查询运行大约需要 5 - 6 秒。连接中使用的所有列都有索引。这些表有 500k 条记录。

我的问题是:当我从选择中删除列 tc.name、tc.id 和 tc.descr 时,查询会在不到一秒的时间内返回结果。为什么?

4

3 回答 3

0

您需要发布执行计划才能真正了解其中的区别。

据我所知,SQL Server 不会优化连接。毕竟,即使选择列表中没有列,连接仍然可以用于过滤和相乘行数。

但是,可能会跳过一个步骤。使用 中的变量select,引擎需要同时访问索引获取包含数据的页面。如果没有变量,引擎就不需要进行提取。这可能会巧妙地将优化器的平衡从一种连接类型转变为另一种连接类型。

第二种可能性只涉及时间安排。如果您运行一次查询,则可能会在机器上填充页面缓存。第二次运行它时,查询速度要快得多,因为数据在内存中。除非您 (1) 在每次调用之间清除缓存或 (2) 确保缓存已被等效填充,否则永远不要运行计时。

于 2013-01-23T00:22:27.260 回答
0

你有聚集索引吗?如果没有,您应该创建聚集索引并运行查询整数,并且主要在主键列上运行。

检查聚集索引的http://msdn.microsoft.com/en-us/library/aa933131(v=sql.80).aspx

于 2013-01-23T04:51:01.280 回答
0

我终于能够通过向表中添加额外的索引来调整查询。SQL 服务器没有显示/暗示丢失的索引,但我通过在选择中存在的字段上创建一个新的非聚集索引来解决这个问题。

感谢大家前来提供帮助。

@Wade 该链接对于理解 SQL 优化器非常有帮助

于 2013-04-11T18:50:14.970 回答