消息8623:查询处理器耗尽内部资源,无法生成查询计划

时间:2013-12-05 10:13:09

标签: sql sql-server intersect

我有一个非常长的查询,使用不同的交叉,当查询增长太长时我执行它会抛出异常

 SELECT DISTINCT RTypeId FROM dbo.User_Res WHERE UserId = '1749' 
 INTERSECT SELECT DISTINCT RTypeId FROM dbo.User_Res WHERE UserId = '424' 
 INTERSECT SELECT DISTINCT RTypeId FROM dbo.User_Res WHERE UserId = '1906' 
 INTERSECT SELECT DISTINCT RTypeId FROM dbo.User_Res WHERE UserId = '725' 
 INTERSECT SELECT DISTINCT RTypeId FROM dbo.User_Res WHERE UserId = '1596'

你可以帮助我替代这个查询吗?

错误消息:

  

查询处理器耗尽了内部资源,无法生成查询计划。这是一种罕见的事件,仅适用于引用大量表或分区的极其复杂的查询或查询。请简化查询。

1 个答案:

答案 0 :(得分:1)

基本上你想要的是获得所有用户共同的RTypeIds吗?

您可以通过以下方式构建相同的查询:

with userrt (rid, uid)
as (select distinct rtypeid, userid from User_Res where UserId in (1749, 424, 1906 ...)
select rid, count(uid) as cuid
from userrt
group by rid

现在只有那些在限制条款中具有cuid == userid's数量的结果行才是您感兴趣的(因为它们已经存在于所有用户中,因此对所有用户都是通用的)。