SELECT DISTINCT内部WHERE IN子句的性能

时间:2013-12-20 19:51:21

标签: sql sql-server performance

我对以下代码有性能问题......

SELECT*FROM GCL_Loans WHERE Loan_ID IN
(
    SELECT Loan_ID FROM GCL_Loan_Items
)

GCL_Loans有一个包含基本信息的贷款清单 CCL_Loan_Items包含有关贷款中特定项目的信息。 GCL_Loan_Items

中可能存在重复的Loan_ID

有人可以解释为什么这个查询会比上面的查询更快或更慢吗?

SELECT*FROM GCL_Loans WHERE Loan_ID IN
(
    SELECT DISTINCT Loan_ID FROM GCL_Loan_Items
)

3 个答案:

答案 0 :(得分:1)

“DISTINCT”版本可能更快,因为IN子句将有一个较小的数据集来搜索以确定集合中是否有任何给定的GCL_Loans.Loan_ID。如果没有DISTINCT,数据集会更大。

有一个相当不错的论据可以让查询优化器自动识别IN测试是一个集合,而不是列表测试,并在自动索引期间执行DISTINCT ......但是已经看到过之前失败了。

请注意,子选择在这里也可能是失败的,因为某些数据库(mysql)将为主要选择中的每个元素执行子选择。

答案 1 :(得分:0)

两者的计划和绩效是平等的

答案 2 :(得分:-1)

因为通过选择DISTINCT,SUBQuery(IN)中的条件较少。 我的理解是SQL将首先运行子查询以生成要包含在IN中的项列表。