IN vs. JOIN with large rowsets 在处理大型行集时,IN和JOIN之间的选择非常重要。 当我们需要从一个表中选择满足特定条件的行时,通常会使用IN操作符。它允许我们指定一个值列表,并返回与列表中的任何值匹配的行。然而,当行集非常大时,使用IN操作符可能会导致性能问题。 相比之下,使用JOIN操作符可能更有效。JOIN操作符允许我们将两个或多个表连接在一起,并基于连接条件返回匹配的行。这种方法通常比使用IN操作符更适合处理大型行集,因为它可以利用索引和其他优化技术来提高查询

14 浏览
0 Comments

IN vs. JOIN with large rowsets 在处理大型行集时,IN和JOIN之间的选择非常重要。 当我们需要从一个表中选择满足特定条件的行时,通常会使用IN操作符。它允许我们指定一个值列表,并返回与列表中的任何值匹配的行。然而,当行集非常大时,使用IN操作符可能会导致性能问题。 相比之下,使用JOIN操作符可能更有效。JOIN操作符允许我们将两个或多个表连接在一起,并基于连接条件返回匹配的行。这种方法通常比使用IN操作符更适合处理大型行集,因为它可以利用索引和其他优化技术来提高查询

我想选择在另一个表中的主键所在的行。我不确定在SQL Server 2005中该使用JOIN还是IN操作符。在大数据集(即数百万行)中,这两个SQL查询之间是否存在显著的性能差异?

0
0 Comments

在SQL中,使用IN和JOIN连接两个表时,可能会导致不同的结果。如果表b不是键保留的(即b.d的值不是唯一的),那么这两个查询可能会产生不同的结果。

第一个查询的等价查询如下:

SELECT a.*

FROM a

JOIN (

SELECT DISTINCT d

FROM b

) bo

ON a.c = bo.d

如果b.d是唯一的,并且已标记为唯一索引或唯一约束,则这两个查询是相同的,并且很可能使用相同的执行计划,因为SQL Server足够聪明,可以考虑到这一点。

SQL Server可以使用以下方法之一运行此查询:

- 如果a.c上有索引,d是唯一的,并且b相对于a来说比较小,则条件传播到子查询,并使用普通的内连接(以b为主导)。

- 如果b.d上有索引,d不是唯一的,那么条件也会传播,并且使用LEFT SEMI JOIN。它也可以用于上述条件。

- 如果b.d和a.c上都有索引,并且它们很大,则使用MERGE SEMI JOIN。

- 如果任何表上都没有索引,则在b上构建哈希表,并使用HASH SEMI JOIN。

这些方法都不会每次重新计算整个子查询。

关于这个问题的更多细节,请参考以下链接:

- IN vs. JOIN vs. EXISTS: http://explainextended.com/2009/06/16/in-vs-join-vs-exists/

- Counting missing rows: SQL Server: http://explainextended.com/2009/04/20/counting-missing-rows-sql-server/

至于查询计划缓存,SQL Server是否智能地使用缓存的查询计划以节省时间,这个问题没有具体的说明。但是通过对相关查询进行分析,可以得出SQL Server可能会使用缓存的查询计划。

0
0 Comments

在处理拥有4900万行数据的表时,我建议使用左外连接(LEFT OUTER JOIN)。使用IN或EXISTS语句,查询需要5分钟才能完成,而使用左外连接仅需1秒钟即可完成。

SELECT a.*
FROM a LEFT OUTER JOIN b ON a.c = b.d
WHERE b.d is not null -- 假设b.d是一个带有索引的主键

实际上,在我的查询中,我同时对9个表进行了这样的操作。

问题的出现原因是,当处理大型数据集时,使用IN或EXISTS语句可能会导致查询速度变慢。这是因为IN或EXISTS语句需要逐个比较每个值,而左外连接只需要一次连接操作。

解决方法是使用左外连接来替代IN或EXISTS语句。左外连接可以更高效地处理大型数据集,提供更快的查询速度。在上面的示例中,我们使用LEFT OUTER JOIN将表a与表b连接,并通过WHERE子句来过滤出非空的b.d值。

通过使用左外连接,我们可以避免逐个比较每个值的开销,从而提高查询效率。如果需要处理多个表,可以按照相同的方式使用左外连接来连接这些表。

总之,当处理大型数据集时,使用左外连接而不是IN或EXISTS语句可以提高查询性能。通过避免逐个比较每个值的开销,我们可以更高效地处理数据,并获得更快的查询结果。

0
0 Comments

在处理大型行集时,使用ANSI-92 JOIN和EXISTS都是较好的选择。具体原因和解决方法如下:

原因:

- 使用JOIN时,可能会生成重复的结果,需要去重处理。这可能会影响性能。

- 使用子查询时,如果是相关子查询,优化器可能无法高效处理,导致性能下降。

解决方法:

- 使用ANSI-92 JOIN可以避免生成重复结果的问题。示例代码如下:

SELECT a.*
FROM a JOIN b ON a.c = b.d

- 使用EXISTS可以避免生成重复结果的问题,并且在性能上与JOIN相当甚至更好。示例代码如下:

SELECT a.*
FROM a
WHERE EXISTS (SELECT * FROM b WHERE a.c = b.d)

- 假设涉及到的列都有索引,一般不会出现问题。通过测试,性能和执行计划与使用JOIN相似。

在处理大型行集时,使用ANSI-92 JOIN和EXISTS都可以避免生成重复结果的问题。如果使用相关子查询时,可能会影响性能,应考虑使用JOIN或优化查询结构。

0