执行计划下载链接:https://www.dropbox.com/s/3spvo46541bf6p1/Execution%20plan.xml?dl=0
我正在使用SQL Server 2008 R2
我有一个非常复杂的存储过程,在执行时请求太多内存。这是执行计划的屏幕截图:
http://s15.postimg.org/58ycuhyob/image.png
基础查询可能需要大量调整,如大量估计行所示,但除了这一点之外。无论查询的复杂程度如何,执行时都不应该请求 3 GB的内存。
如何防止此行为?我已尝试过以下操作:
查询平均返回大约1k行,它确实查看了一个包含超过300万行的表,其中约有4个表被连接。在大多数情况下,执行查询会在不到3秒的时间内返回结果。
编辑:
还有一件事,使用查询提示对于这种情况并不可行,因为我们的情况参数差异很大。
EDIT2:
根据请求上传执行计划
Edit3:
我尝试过重建/重组碎片指数。显然,很少但没有太严重。无论如何,这并没有减少授予的内存量,也没有减少估计的行数(如果这在某种程度上是相关的)。
答案 0 :(得分:0)
你说优化查询是除了这一点,但实际上它实际上只是重点。执行查询时,SQL Server将在生成执行计划后保留执行查询所需的内存。估计中间结果的行数越多,估计需要的内存越多。
因此,重写您的查询和/或创建新索引以获得一个不错的查询计划。快速浏览一下查询计划会显示一些没有连接谓词的嵌套循环和一些表扫描,其中可能只使用了几条记录。