我正在使用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秒才能运行。joins中使用的所有列都有索引。这些表有500k条记录。
我的问题是:当我从select中删除列tc.name、tc.id和tc.descr时,查询在不到一秒的时间内返回结果。为什么?
发布于 2013-04-12 02:50:15
我终于能够通过向表中添加额外的索引来调优查询。SQL server没有显示/暗示缺少索引,但是我通过在select中存在的字段上创建一个新的非聚集索引来解决这个问题。
感谢你们站出来寻求帮助。
@Wade链接对理解SQL优化器非常有帮助
发布于 2013-01-23 08:22:27
你需要发布执行计划,才能真正了解其中的区别。
据我所知,SQL Server不会优化外部连接。毕竟,即使select列表中没有列,连接仍然可以用于过滤和乘以行数。
但是,可能会跳过一个步骤。使用select中的变量,引擎需要访问索引并获取包含数据的页面。如果没有这些变量,引擎就不需要执行获取操作。这可能会巧妙地将优化器的平衡从一种连接类型倾斜到另一种类型。
第二种可能只是涉及到时间问题。如果只运行一次查询,那么机器上的页面缓存可能会被填满。第二次运行时,查询速度要快得多,因为数据在内存中。永远不要运行计时,除非您(1)清除每次调用之间的缓存,或者(2)确保缓存被同等填充。
发布于 2013-01-23 12:51:01
你有聚集索引吗?如果不是,则应创建聚集索引并运行查询integer且主要针对主键列。
检查聚集索引的http://msdn.microsoft.com/en-us/library/aa933131(v=sql.80).aspx。
https://stackoverflow.com/questions/14469921
复制相似问题