3

我有一个导致性能问题的 T-SQL 查询。它很笨重,但似乎导致问题的部分是一个简单的 LEFT JOIN。

这可以通过删除左连接并在选择中使用子查询来解决,但这对我来说似乎并不令人满意,因为我看不出为什么一个工作得很快,另一个工作得不好。

涉及的数据不多,并且所有连接列上都有键/索引。我唯一想知道的另一件事是关于数据库的统计信息以及它们是否会影响性能。

例如(Nb 这只是一个更复杂的查询的简化

慢的

SELECT A.1,A.2,B.3 FROM A LEFT JOIN B ON A.ID = B.ID ...

快速地

SELECT A.1, A.2, (SELECT B.3 FROM B WHERE B.ID = A.ID) FROM A

4

2 回答 2

1

一般来说,子查询通常比左连接慢,所以肯定有其他事情发生。

首先显示整个查询,因为问题可能是您使用 ... 表示的部分。

接下来检查您的执行计划,看看有什么不同。您是否绝对确定 id 列上有索引。FK 约束不会自动创建索引。

两个查询是否返回相同的记录?一个可能更快,因为它不等同于另一个。

于 2010-09-15T13:42:23.850 回答
0

这两个查询可能不等价。如果您的子查询:

(SELECT B.3 FROM B WHERE B.ID = A.ID)

返回不止一行,你的左连接只会返回两行,但是你的子查询会因为“子查询返回不止一行”而爆炸。如果 B.ID 是唯一的,优化器是否知道它?你有唯一的约束或索引吗?

于 2010-09-15T13:26:20.003 回答