Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server存储过程减少授予的内存量_Sql_Sql Server - Fatal编程技术网

SQL Server存储过程减少授予的内存量

SQL Server存储过程减少授予的内存量,sql,sql-server,Sql,Sql Server,执行计划下载链接: 我正在使用SQLServer2008R2 我有一个非常复杂的存储过程,在执行时会请求太多内存。以下是执行计划的屏幕截图: 底层查询可能需要进行大量调整,大量估计行表明了这一点,但这不是重点。不管查询的复杂性如何,它在执行时不应该请求3 GB的内存 如何防止这种行为?我尝试了以下方法: DBCC FREEPROCCACHE以清除计划缓存。这一事无成 在SP和SQL级别上设置重新编译选项。同样,这没有任何作用 使用MAXDOP选项,从0到8。同样的问题 该查询平均返回约1k

执行计划下载链接:

我正在使用SQLServer2008R2

我有一个非常复杂的存储过程,在执行时会请求太多内存。以下是执行计划的屏幕截图:

底层查询可能需要进行大量调整,大量估计行表明了这一点,但这不是重点。不管查询的复杂性如何,它在执行时不应该请求3 GB的内存

如何防止这种行为?我尝试了以下方法:

  • DBCC FREEPROCCACHE以清除计划缓存。这一事无成
  • 在SP和SQL级别上设置重新编译选项。同样,这没有任何作用
  • 使用MAXDOP选项,从0到8。同样的问题
该查询平均返回约1k行,并且它确实查看了一个包含300多万行的表,其中大约有4个表被联接。在大多数情况下,执行查询会在不到3秒钟的时间内返回结果

编辑:

还有一件事,在这种情况下使用查询提示是不可行的,因为对于我们的情况,参数变化很大

编辑2:

根据要求上传执行计划

编辑3:


我尝试过重建/重组碎片索引。很明显,只有很少的,但没有什么太严重的。无论如何,这并没有减少授予的内存量,也没有减少估计的行数(如果这有某种关联)。

您说优化查询不是重点,但实际上它只是重点。执行查询时,SQL Server将在生成执行计划后保留执行查询所需的内存。中间结果估计容纳的行越多,估计需要的内存就越多


因此,重写您的查询和/或创建新索引以获得一个合适的查询计划。快速浏览一下查询计划,可以看到一些没有连接谓词的嵌套循环和一些可能只使用了几条记录的表扫描。

您能发布SQL语句吗?并上传计划XML?@MartinSmith不幸的是,由于NDA,我不允许发布SQL语句。计划XML,我可以在编辑数据库名称/模式等后上载。我会尽快上载。您是否尝试重建/重新组织索引和更新统计信息?您是否有显示实际返回行的计划。现在它显示估计的行数超过8900万。@JodyT不,我还没有尝试重建/重新组织索引。我将在我们的测试数据库上尝试这个。实际返回的行数为100。尽管如此,我还是很难理解为什么这样的事情会导致每次存储过程被运行时需要大量的内存。你可以考虑把它分解掉,这样一个部分的结果被具体化为一个临时表,然后它对其余的有精确的行估计。没有连接谓词的交叉连接是关于什么的?源中是否没有连接谓词?