Tsql 在两个select语句上使用UNION或UNION ALL会使它们的速度慢得令人难以置信

Tsql 在两个select语句上使用UNION或UNION ALL会使它们的速度慢得令人难以置信,tsql,sql-server-2008,union,Tsql,Sql Server 2008,Union,我有两个查询,我们把它们称为查询A和查询B 对于我正在测试的场景,这两个查询都在一秒钟内运行,查询a返回1个结果,查询B返回0个结果 如果我合并或合并所有这两个查询,则需要一分钟才能返回预期的结果1 两个查询都从相同的表中选择相同的列。我可以通过使用一个高度有条件的where子句,在没有工会的情况下重写整件事,但我试图避免这样做 有什么想法吗?我不确定我可以通过共享得到多少确切的查询和模式,但我很乐意提供我所能提供的 这是在MSSQL 2008上,如果它对任何人的响应都很重要。我会尝试在Mana

我有两个查询,我们把它们称为查询A和查询B

对于我正在测试的场景,这两个查询都在一秒钟内运行,查询a返回1个结果,查询B返回0个结果

如果我合并或合并所有这两个查询,则需要一分钟才能返回预期的结果1

两个查询都从相同的表中选择相同的列。我可以通过使用一个高度有条件的where子句,在没有工会的情况下重写整件事,但我试图避免这样做

有什么想法吗?我不确定我可以通过共享得到多少确切的查询和模式,但我很乐意提供我所能提供的


这是在MSSQL 2008上,如果它对任何人的响应都很重要。

我会尝试在Management Studio中查看各个查询的执行计划,然后将其与包含联合的查询的执行计划进行比较


如果执行时间有如此大的差异,我会认为工会查询的执行计划有问题。找出不同之处将帮助您和我们找到根本问题所在的正确方向。

他们都在做表格扫描吗?听起来它可能超过了缓存容量,而您正在缓存到磁盘


即使它们来自同一个表,记录也可能会独立锁定。

优化器可以将联合中非常相似且位于同一个表上的单独子句合并到一个查询中。您可以通过查询计划中缺少UNION运算符看到这一点。我以前见过类似的事情,但很少

你可以做的是选择。。进入临时。。。对于第一个查询,后跟一个INSERT temp。。。第二次


现在,我从哪里读到的…

您可以从一个新的空模式开始,添加少量只包含非机密测试数据的表来复制结果吗?它不一定是来自您的应用程序的数据-只是随机数或样本数据库或StackOverflow的数据转储中的数据,或者任何您喜欢的数据。该数据库在2005年以前一直运行,直到最近,我碰巧有一个副本,其中的相同数据仍在2005年服务器上运行。包含union的完整查询按预期执行,没有额外开销。从2005年到2008年,是否有任何特定的变化会导致任何人都知道这一点?我能够在不同的2008服务器上进行复制。我在那里遇到了问题,不管是什么级别的。我没想到这会有帮助,但觉得值得一试。你能试试吗?不确定它是否有效,所以我不会把它作为答案发布。你能让查询B返回一条或多条记录并再次检查吗?@Jay-你能为我们提供一个脚本来重现这个问题吗?或者至少更改了表/列名的查询,以便我们可以看到您正在使用的构造类型。另外,与两个单独的计划相比,工会计划是什么样的?只是一个直接连接操作符,或者它是否添加了任何附加的假脱机(例如,对于单独运行时不存在的联合)?