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

小表上的简单SQL查询执行时间太长,sql,sql-server,query-performance,sqlperformance,Sql,Sql Server,Query Performance,Sqlperformance,我有一个查询执行时间太长。它很简单,桌子也很小。简化的查询(但仍然很慢)是: 表之间的主键和外键设置正确。此外,列companys.Name被编入索引 我尝试过使用连接、重新启动SQL Server、重建索引等,但它仍然需要大约40秒才能在我的带SSD的计算机上执行。表文档和公司中的记录数仅为18K(目前为1:1),表城镇中的记录数仅为约20条 另一方面,以下查询返回完全相同的记录,但执行几乎不需要时间: SELECT D.ID, C.Name, (SELECT Name FROM Towns

我有一个查询执行时间太长。它很简单,桌子也很小。简化的查询(但仍然很慢)是:

表之间的主键和外键设置正确。此外,列
companys.Name
被编入索引

我尝试过使用连接、重新启动SQL Server、重建索引等,但它仍然需要大约40秒才能在我的带SSD的计算机上执行。表
文档
公司
中的记录数仅为18K(目前为1:1),表
城镇
中的记录数仅为约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

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

使用join语句时会发生什么

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

另外,尝试使用和不使用顺序

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

当我不使用where条件时,我通常从最小到最大。。所以我的问题看起来像

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记录可能需要一段时间才能显示在输出窗口中,但查询应该非常快

为什么仍然使用旧的ANSI-89样式的联接?您应该使用更新的连接语法,它已经存在了20多年了。如果你去城镇>公司>文件会发生什么。。使用joinsIf如果需要真正的帮助,则需要提供实际的ddl,包括索引定义以及表的行计数。一个实际的执行计划也会有帮助。你看过计划了吗?它应该告诉你资源的使用位置。正如我所提到的,我尝试过像这样的内部连接,但速度同样慢:选择D.ID,C.Name,如您所建议的,我还尝试使用
中的
文档
表中的
文档,但没有任何更改。没有
订单
这是即时的。查询速度同样慢。另外,在Town上添加索引并没有什么帮助,但在Documents表中的Company上添加索引是有效的!我(错误地)认为外键就足够了。尽管如此,我还是不明白为什么另一个查询运行良好,尽管它是不同的表。此外,从查询中删除Cities表将使查询变得即时。
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