【问题标题】:Is it possible to allocate memory to a query in MS SQL Server?是否可以为 MS SQL Server 中的查询分配内存?
【发布时间】:2015-03-12 04:09:28
【问题描述】:

我在存储过程中有查询,我想看看有没有办法指定这个查询需要使用的内存。

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

【问题讨论】:

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

标签: sql-server sql-server-2008 sql-server-2005 sql-server-2008-r2 sql-server-2012


【解决方案1】:

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

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

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

您可以尝试更新统计信息,看看查询是否准备了更好的计划,并避免拼接或增加最大服务器内存的值,以便为缓冲池提供更多内存。您还可能需要更改查询中的连接顺序,或者可能需要重写查询。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    相关资源
    最近更新 更多