大查询优化

时间:2014-02-17 14:55:17

标签: sql sql-server performance

我尝试运行查询,但它返回的错误是没有足够的资源来处理它。

查询是:

SELECT ID,
       ISNULL(LINK,'0'),
       FLOOR(ISNULL(AMOUNTPAID,'0')),
       CONVERT(VARCHAR(8), DATEPAID, 5),
       PAYSOURCE 
  FROM finance 
 WHERE DATEADD(month,24,DATEPAID) > GETDATE() 
       AND ID IN (A LIST OF IDs)

第一个选择是大约140万个结果,ID列表大约有100.000个ID。

是否有其他方法可以构建此查询?

2 个答案:

答案 0 :(得分:0)

我假设您使用的是100,000个IN值的长列表并看到此错误

  

查询处理器耗尽了内部资源而无法使用   制定查询计划。这是一个罕见的事件,只有预期   非常复杂的查询或引用非常大的查询   表或分区的数量。请简化查询。如果你   相信您错误地收到了此消息,请联系客户   支持服务以获取更多信息。

根据this Connect item的建议,将Ids列表放入临时表或索引表值参数中。

答案 1 :(得分:0)

select ID,ISNULL(LINK,'0'),FLOOR(ISNULL(AMOUNTPAID,'0')),CONVERT(VARCHAR(8), DATEPAID, 5) ,PAYSOURCE 
from dbo.finance f inner join listofid l on f.id=l.id
where DATEADD(month,24,DATEPAID) > GETDATE() 

你还需要在DATEPAID.hope上创建非聚集索引.id是pk。 顺便说一下,id列表来自table / variable?

我认为查询会很快。你的意思是说还有另一个查询,你将id列表放在变量中。