Sql server 独立执行的内部查询比整个查询花费的时间更长
我执行了一个查询,发现如果我独立执行内部查询,执行所需的时间会更长 我的问题是Sql server 独立执行的内部查询比整个查询花费的时间更长,sql-server,Sql Server,我执行了一个查询,发现如果我独立执行内部查询,执行所需的时间会更长 我的问题是 select distinct SUBSTRING(UserUri,CHARINDEX('@',UserUri)+1,LEN(UserUri)) as Company FROM [DWH].[dbo].[UsersDetails] where UserUri not like '%@mycompany.com%' and UserId in ( select distinct U
select distinct
SUBSTRING(UserUri,CHARINDEX('@',UserUri)+1,LEN(UserUri)) as Company
FROM
[DWH].[dbo].[UsersDetails]
where
UserUri not like '%@mycompany.com%'
and UserId in (
select distinct UserId from UsersInfo
)
and ISNUMERIC(SUBSTRING(UserUri,CHARINDEX('@',UserUri)+1,LEN(UserUri)))!= 1
整个查询运行时间为18-20秒。但当执行内部查询时,即从用户中独立选择不同的UserId,需要40-50秒
我的疑问是,如果内部查询需要40-50秒,那么外部查询应该只在40-50秒之后结束。这是因为创建执行计划时,不一定要执行整个内部查询,只需要检查UserId是否在UsersInfo中,通过索引进行seek很可能实现这一点——我的建议是比较两种情况下的查询执行计划,您甚至不应该在select中使用UserId。。。Sql不能像C或其他语言那样工作。它可以在内部选择中使用循环,也可以不使用循环。它只能在索引中找到一个值,而不是观察所有值来区分它们。当第一个匹配项被找到时,它几乎打破了循环。我猜查询引擎足够聪明,在签入时不会使用distinct。如果它在distinct中,那么它也将在中,并且distinct检查在大型表上可能需要很长时间,具体取决于索引@Andrew有很好的建议…检查查询计划。感谢您的回复,执行计划帮助我理解了事情。但是如果我不需要设置索引,还有其他方法可以临时创建这样的查询吗?那是因为当创建执行计划时,不一定要执行整个内部查询,只需要检查UserId是否在UsersInfo中,通过索引进行seek很可能实现这一点——我的建议是比较两种情况下的查询执行计划,您甚至不应该在select中使用UserId。。。Sql不能像C或其他语言那样工作。它可以在内部选择中使用循环,也可以不使用循环。它只能在索引中找到一个值,而不是观察所有值来区分它们。当第一个匹配项被找到时,它几乎打破了循环。我猜查询引擎足够聪明,在签入时不会使用distinct。如果它在distinct中,那么它也将在中,并且distinct检查在大型表上可能需要很长时间,具体取决于索引@Andrew有很好的建议…检查查询计划。感谢您的回复,执行计划帮助我理解了事情。但是,如果我不必放置索引,是否还有其他方法可以临时生成此类查询。