选择中左连接与子查询的奇怪问题

时间:2010-09-15 10:17:39

标签: sql-server sql-server-2005 tsql query-performance

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

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

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

例如( N.b。这只是对更复杂查询的简化

SLOW

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

FAST

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

2 个答案:

答案 0 :(得分:1)

通常,子查询通常比左连接慢,因此必须有其他内容。

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

接下来检查您的执行计划,看看有什么区别。你是否绝对确定id列上有一个索引。 FK约束不会自动获取索引。

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

答案 1 :(得分:0)

这两个查询可能不相同。如果您的子查询:

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

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