我一直对依赖子查询的某些查询存在奇怪的问题。他们运行得很快,直到我在子查询中使用UNION语句。然后他们无休止地跑,我在10分钟后给了。我现在描述的场景不是我开始使用的那个场景,但我认为它解决了很多可能的问题,但却产生了同样的问题。所以即使这是一个毫无意义的查询,请忍受我!使用UNION子查询进行查询需要很长时间
我有一个表:
tblUser - 100,000 rows
tblFavourites - 200,000 rows
如果我执行:
SELECT COUNT(*)
FROM tblFavourites
WHERE userID NOT IN (SELECT uid FROM tblUser);
...那么它运行在第二下。不过,如果我修改它,这样子查询有UNION,它将至少运行10分钟(之前我放弃了!)
SELECT COUNT(*)
FROM tblFavourites
WHERE userID NOT IN (SELECT uid FROM tblUser UNION SELECT uid FROM tblUser);
一个毫无意义的变化,但它应该产生相同的结果,我不明白为什么它需要更长的时间?
将子查询放入视图中并调用它,具有相同的效果。
任何想法,为什么会这样?我正在使用SQL Azure。
问题解决了。请参阅下面的答案。
因为查询会消除重复的结果,所以'UNION'将花费相当长的一段时间。它本质上是对结果集做一个DISTINCT。执行“UNION ALL”会得到更快的结果,但是如果存在重复项,它们将不会从结果集中消除。 –
感谢您的快速响应。我将它改成了UNION ALL,并且在5分钟后仍然运行。但是,我将数据库下载到本地SQL Server 2008,问题消失了。 UNION的查询几乎和没有查询一样快。然后,我在单独的SQL Azure数据库上运行查询,并遇到同样的问题。所以它看起来像一个SQL Azure问题。我会联系Azure支持。谢谢! –
每当联盟给我的问题,通常是因为它阻止自己。尝试做两个插入到表变量,然后在你的地方使用。 – cadrell0