【发布时间】:2015-10-07 18:16:48
【问题描述】:
我有一个查询需要很长时间才能执行。它很简单,桌子很小。简化的查询(但仍然很慢)是:
SELECT D.ID, C.Name, T.Name AS TownName
FROM Documents D, Companies C, Towns T
WHERE C.ID = D.Company AND T.ID = C.Town
ORDER BY C.Name
表之间的主键和外键设置正确。此外,列 Companies.Name 已编入索引。
我尝试使用 JOIN、重新启动 SQL Server、重建索引等,但它仍然需要大约 40 秒才能在我的带有 SSD 的计算机上执行。表Documents和Companies的记录数只有18K(目前是1:1),表Towns只有大约20条记录。
另一方面,以下查询返回完全相同的记录,但执行起来几乎没有时间:
SELECT D.ID, C.Name, (SELECT Name FROM Towns WHERE ID = C.Town) AS TownName
FROM Documents D, Companies C
WHERE C.ID = D.Company
ORDER BY C.Name
在我看来,第一次查询应该更快,但我显然错了。有人知道这里发生了什么吗?在表中按列排序时,索引似乎被忽略了,该表是一个主表,另一个表的详细信息。
【问题讨论】:
-
你为什么还在使用旧的 ANSI-89 样式连接?您应该使用较新的连接语法,它已经存在 20 多年了。 sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/…
-
如果你去 Town > Company > Documents.. 使用连接会发生什么
-
如果您需要真正的帮助,您需要提供实际的 ddl,包括索引定义以及表的行数。一个实际的执行计划也会有所帮助。
-
你看过计划了吗?它应该告诉你资源被用在了哪里。
标签: sql sql-server query-performance sqlperformance