我在存储过程中查询,我试图看到有没有办法指定此查询使用所需的内存。
我知道在服务器级别我们可以更改最小内存以使用查询,但我是服务器上的所有查询,但我正在寻找特定查询级别的选项。
答案 0 :(得分:1)
SQL Server中没有为用户提供方法或选项来为特定查询保留内存。在执行查询之前,预留由数据库引擎在内部完成。如果您正在考虑Resource governor我不太了解它,但您可以尝试
执行查询时,将对其进行编译,然后优化程序执行查询。如果查询是全新的,则可能需要一些内存量来创建多个计划,然后从中选择最佳计划。这称为基于成本的优化。缺乏记忆可能会延迟这一过程。接下来是查询执行,并假设您在查询中进行排序和散列连接,它将需要内存,有时可能需要大量内存,具体取决于它必须排序的行。
当执行此类查询时,它会计算两个内存参数required memory
和additional memory
所需内存是运行排序操作所需的最小内存,而额外内存是在执行完整查询时存储其他排序所需的内存。这称为查询内存授予。现在在你的情况下,我假设统计数据已过时或存在内存压力或内存当前不是免费的。当你的查询运行它要求一些内存时,SQL Server不会授予所有内存,但只会授予最小内存,以便查询执行程序可以启动,并根据它将要进行的排序为查询保留一些内存。但是当您的查询由于统计数据偏差或由于内存压力而运行时,无法获得用于存储已排序数据的额外内存,这会导致溢出。
您可以尝试更新统计信息,查看查询是否准备好更好的计划,并避免spliing或增加max server memory的值,以便为缓冲池提供更多内存。您还可能需要在查询中更改连接顺序,或者可能会重写查询。
查询运行时如何分配内存的完整描述位于this article