Sql server 可以为MS SQL Server中的查询分配内存吗?

Sql server 可以为MS SQL Server中的查询分配内存吗?,sql-server,sql-server-2008,sql-server-2005,sql-server-2008-r2,sql-server-2012,Sql Server,Sql Server 2008,Sql Server 2005,Sql Server 2008 R2,Sql Server 2012,我在一个存储过程中有一个查询,我想看看是否有一种方法可以指定这个查询所需的内存 我知道在服务器级别,我们可以将最小内存更改为使用查询,但我知道这适用于服务器上的所有查询,但我正在寻找特定查询级别的选项。SQL server中没有向用户提供为特定查询保留内存的方法或选项。在执行查询之前,保留由数据库引擎在内部完成。如果你正在考虑,我不太了解,但你可以试试 执行查询时,将对其进行编译,然后优化器执行查询。若查询是全新的,它可能需要一些内存来创建多个计划,然后从中选择最佳计划。这称为基于成本的优化。内

我在一个存储过程中有一个查询,我想看看是否有一种方法可以指定这个查询所需的内存


我知道在服务器级别,我们可以将最小内存更改为使用查询,但我知道这适用于服务器上的所有查询,但我正在寻找特定查询级别的选项。

SQL server中没有向用户提供为特定查询保留内存的方法或选项。在执行查询之前,保留由数据库引擎在内部完成。如果你正在考虑,我不太了解,但你可以试试

执行查询时,将对其进行编译,然后优化器执行查询。若查询是全新的,它可能需要一些内存来创建多个计划,然后从中选择最佳计划。这称为基于成本的优化。内存不足会延迟此过程。接下来是查询执行,假设您在查询中进行排序和散列联接,则可能需要内存—有时可能需要大量内存,具体取决于需要排序的行

当执行此类查询时,它计算两个内存参数
所需内存
附加内存
所需内存是运行排序操作所需的最小内存,附加内存是在执行完整查询时存储附加排序所需的内存。这称为查询内存授予。现在在你的情况下,我假设统计数据要么已经过时,要么内存压力很大,要么内存当前不可用。当您的查询运行时,它要求一些内存量,SQL Server不会授予所有内存,而是只授予最小内存,以便查询执行器可以启动,并根据要执行的排序为查询保留一些内存。但是,当您的查询运行时,由于统计数据不正确或内存压力,无法获得用于存储排序数据的额外内存,从而导致溢出

您可以尝试更新stats,并查看query是否准备了更好的计划,是否可以避免spliing或增加max server memory的值,以便为缓冲池提供更多的内存。您还可能需要更改查询中的连接顺序,或者可能需要重写查询


查询运行时如何分配内存的完整描述在

中,我认为这是不可能的,但如果您分享您希望这样做的原因,我们可能会为您提供选项。您正在使用的Sql Server的特定版本和版本可能也会有所帮助。过程排序组件在生产过程中溢出到Tempdb中,但在开发过程中没有,两者都是相同的执行计划,开发配置为8GB RAM&1 Core,产品配置为40GB&8core,因此问题在于产品溢出中的查询(哈希匹配和排序组件)如果Sql Server使用tempdb,而不是内存,那是因为它需要其他地方的内存,这是由于负载或生产数据与开发数据的大小。如果它需要更多内存,请将更多内存放入服务器,或者将查询调整为使用更少的内存(如果可能)。生产设备有50GB RAM,驱动器是SSD驱动器,看起来sql引擎无法分配适当的内存,或者我缺少一些与内存相关的设置,我找到了可以增加查询最小内存的地方,但这是服务器上所有查询的最小内存。您确定是这个查询在这样做吗?您确定使用Tempdb会导致很大的性能问题吗?您可以发布查询,我们可以看看是否可以做些什么来提高效率。