对小表的简单SQL查询执行时间太长

时间:2015-10-07 18:16:48

标签: sql sql-server query-performance sqlperformance

我的查询执行时间太长。它很简单,表格很小。简化的查询(但仍然很慢)是:

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,重建索引等,但在使用SSD的计算机上执行仍需要大约40秒。表DocumentsCompanies中的记录数仅为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

在我看来,第一个查询应该更快,但我显然是错的。有没有人知道这里发生了什么?在按表中的列排序时,似乎忽略了索引,该表是一个表的主数据,另一个表的详细信息。

2 个答案:

答案 0 :(得分:1)

我无法解释为什么您的子查询查询运行得更快,但我会尝试其他方法来查看是否可以删除子查询。

当我没有使用条件时,我通常会从最小到最大。所以我的查询看起来像

Select  t.Name TownName,
        c.Name,
        d.Id
From    Towns t
        Join Companies c ON t.Id = c.Town
        Join Documents d ON c.Id = d.Company
Order By c.Name

然后我确保公司有一个关于城镇的索引,并且该文件具有公司的索引和索引.18k记录可能需要一段时间才能显示在输出窗口中,但查询应该非常快< / p>

答案 1 :(得分:0)

使用连接语句时会发生什么?

SELECT D.ID, C.Name, T.Name AS TownName
FROM Documents D
inner join Companies C on C.
inner join Towns T on T.ID = C.Town
ORDER BY C.Name

另外,尝试使用和不使用命令