Share via


MSSQLSERVER_8645

適用於:SQL Server

詳細資料

屬性
產品名稱 SQL Server
事件識別碼 8645
事件來源 MSSQLSERVER
元件 SQLEngine
符號名稱 MEMTIMEDOUT_ERR
訊息文字 等候記憶體資源來執行資源集區 '%ls' (%ld) 中的查詢時發生逾時。 請重新執行查詢。

說明

如果 SQL Server 要求已等候查詢執行 (QE) 記憶體一段時間且記憶體無法使用,就會引發此錯誤。 查詢執行記憶體主要用於排序作業、雜湊作業、大量複製作業和索引建立和母體擴展。 執行其中一個作業的查詢會要求記憶體授與。 如果沒有可用的記憶體,查詢會設定為等候 RESOURCE_SEMAPHORE ,直到記憶體變成可用為止。 如果記憶體在等候超過 20 分鐘之後無法使用,SQL Server 就會終止查詢,並出現錯誤 8645「等候記憶體資源在資源集區 'default' 中執行查詢時發生逾時。 逾時值在 SQL Server 版本之間稍有不同。 您可以查看 sys.dm_exec_query_memory_grants ,以查看伺服器層級 timeout_sec 所設定的逾時值。

原因

在記憶體授與和長時間等候該記憶體可供使用時,可以看到此錯誤。 一般而言,當查詢完成時,它會釋放它所使用的執行記憶體。 因此,如果您看到此錯誤,表示逾時查詢已等候一些其他要求超過 20 分鐘才能完成其工作。 可能只有一個單一要求會耗用所有可用的 QE 記憶體,或可能會有許多要求,而且其記憶體授與已耗盡 QE 記憶體。 如果您的工作負載中有如此長時間執行的要求,您必須採取措施來改善其執行持續時間,並減少其使用的 QE 記憶體數量。

使用者動作

如果您未使用資源管理員來限制特定工作負載的記憶體集區,您可以驗證整體伺服器狀態和工作負載。 如果您使用資源管理員,請檢查資源集區或工作負載群組設定。

如需詳細說明和疑難排解步驟, 請參閱針對 SQL Server 中記憶體授與所造成的效能緩慢或記憶體不足問題進行疑難排解。

下列清單摘要說明上述文章中詳述的步驟。 這些步驟有助於減少或消除 QE 記憶體錯誤:

  1. 識別 SQL Server 中的哪些要求是大型記憶體授與或 QE 記憶體取用者。 如需詳細資訊,請參閱 如何識別查詢執行記憶體 的等候。

  2. 重寫查詢以最小化或避免排序和雜湊作業。

  3. 更新統計資料並定期更新統計資料,以確保 SQL Server 會正確估計記憶體授與。

  4. 為識別的查詢或查詢建立適當的索引。 索引可能會減少處理的大量資料列,因此變更 JOIN 演算法,並減少授與的大小或完全消除它們。

  5. 盡可能在查詢中使用 OPTION (min_grant_percent = XX,max_grant_percent = XX) 提示。

  6. 使用資源管理員將 QE 記憶體使用量的效果限制為特定的工作負載。

  7. SQL Server 2017 和 2019 會使用調適型查詢處理,讓記憶體授與意見反應機制在執行時間動態調整記憶體授與大小。 此功能可能會防止第一次發生記憶體授與問題。

  8. 增加 SQL Server 記憶體或調整現有的設定。

    1. 檢查下列 SQL Server 記憶體組態參數:

      • 最大伺服器記憶體 - 視需要增加
      • 最小伺服器記憶體
      • 每個查詢的最小記憶體
    2. 請注意不尋常的設定。 視需要更正它們。 考慮 SQL Server 的記憶體需求增加。 預設和建議的設定會列在 [伺服器記憶體組態 ] 選項中

  9. 增加 OS 層級的記憶體(實體或虛擬 RAM)。

  10. 確認其他應用程式或服務是否在此伺服器上耗用記憶體。 重新設定較不重要的應用程式或服務,以耗用較少的記憶體,或將它們移至不同的伺服器。 此動作可以移除外部記憶體壓力。

  11. 執行下列 DBCC 命令以釋放數個 SQL Server 記憶體快取 - 暫存量值。

  • DBCC FREESYSTEMCACHE
  • DBCC FREESESSIONCACHE
  • DBCC FREEPROCCACHE