我正在使用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记录。
我的问题是:当我从select中删除列tc.name,tc.id和tc.descr时,查询会在不到一秒的时间内返回结果。为什么呢?
答案 0 :(得分:0)
您需要发布执行计划才能真正了解其中的差异。
据我所知,SQL Server 不优化远离连接。毕竟,即使没有选择列表中的列,连接仍然可以用于过滤和乘以行数。
但是,可能会跳过一步。使用select
中的变量,引擎需要转到索引和获取包含数据的页面。没有变量,引擎不需要进行提取。这可能会巧妙地将优化器的平衡从一种类型的连接转移到另一种类型。
第二种可能性仅涉及计时。如果您运行一次查询,则可能会在计算机上填充页面缓存。第二次运行它时,查询变得更快,因为数据在内存中。除非您(1)清除每次调用之间的缓存或(2)确保缓存等效填充,否则不要运行时序。
答案 1 :(得分:0)
你有聚集索引吗?如果没有,您应该创建聚簇索引并运行查询整数,主要是在主键列上。
检查http://msdn.microsoft.com/en-us/library/aa933131(v=sql.80).aspx是否有聚集索引。
答案 2 :(得分:0)
我终于能够通过向表中添加额外的索引来调整查询。 SQL服务器没有显示/暗示缺少索引,但我通过在select中存在的字段上创建新的非聚集索引来解决这个问题。
感谢大家前来寻求帮助。
@Wade这个链接非常有助于理解SQL优化器