gpt4 book ai didi

sql - IN 语句中的 SELECT 子查询挂起 SQL Server

转载 作者:行者123 更新时间:2023-12-02 07:34:53 26 4
gpt4 key购买 nike

对 SQL Server 的这种行为感到好奇。

这个查询产生结果的速度非常快,正如我所期望的那样:

SELECT *
FROM dbo.v_View1 View1 FULL OUTER JOIN
dbo.v_View2 View2 ON View1.Portfolio = View2.Portfolio AND
View1.AsOfDate = View2.AsOfDate
where (View1.AsOfDate IN (NULL, '20130717'))

但是,我不想在那里有一个静态日期,所以我用一个子查询替换了它。不幸的是,我等待这个查询执行的最长时间是在我取消它之前的 5 分钟,所以我不知道它是否真的能让我得到我想要的数据:

SELECT *
FROM dbo.v_View1 View1 FULL OUTER JOIN
dbo.v_View2 View2 ON View1.Portfolio = View2.Portfolio AND
View1.AsOfDate = View2.AsOfDate
where (View1.AsOfDate IN (NULL, (SELECT MAX(AsOfDate) FROM dbo.v_View1)))

我诉诸于声明一个变量,用上面的子查询设置它,并在 IN 语句中使用它,它按预期工作并且运行速度与原始查询一样快。

我知道我做错了什么或遗漏了什么(可能两者都有)- 是什么?我希望在 IN 语句中包含子查询,或者至少能够将其作为不带变量的 View 运行。谢谢!

最佳答案

我怀疑查询优化器正在做一些非常奇怪的事情,因为天真的实现涉及对 v_View1 的两次扫描,也许优化器没有意识到子查询 SELECT MAX(AsOfDate) ... 每一行都相同。我怀疑它可能没有意识到子查询与每一行都不相关,因此为结果集的每一行运行它。给定全外连接,大量数据意味着大量不必要的表扫描。

简单的解决方案是:

DECLARE @MaxAsOfDate datetime;
SET @MaxAsOfDate = (SELECT MAX(AsOfDate) FROM dbo.v_View1)

SELECT *
FROM dbo.v_View1 View1 FULL OUTER JOIN
dbo.v_View2 View2 ON View1.Portfolio = View2.Portfolio AND
View1.AsOfDate = View2.AsOfDate
where (View1.AsOfDate IN (NULL, @MaxAsOfDate))

这将强制子查询运行一次,将结果存储在变量中,然后将其用于后续查询。

关于sql - IN 语句中的 SELECT 子查询挂起 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17752642/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com