Freigeben über


MSSQLSERVER_8645

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Details

attribute Wert
Produktname SQL Server
Ereignis-ID 8645
Ereignisquelle MSSQLSERVER
Komponente SQLEngine
Symbolischer Name MEMTIMEDOUT_ERR
Meldungstext Timeout beim Warten auf die Arbeitsspeicherressourcen für die Abfrageausführung im Ressourcenpool '%ls' (%ld). Führen Sie die Abfrage erneut aus.

Erklärung

Dieser Fehler wird ausgelöst, wenn eine SQL Server-Anforderung auf eine QE-Speichererteilung (Query Execution) für einen längeren Zeitraum gewartet hat und arbeitsspeicher nicht verfügbar war. Der Speicher für die Abfrageausführung wird in erster Linie für Sortiervorgänge, Hashvorgänge, Massenkopievorgänge und Indexerstellung und -population verwendet. Eine Abfrage, die einen dieser Vorgänge ausführt, fordert eine Speichererteilung an. Wenn kein Arbeitsspeicher verfügbar ist, wird die Abfrage so eingestellt, dass sie auf eine RESOURCE_SEMAPHORE wartet, bis der Arbeitsspeicher verfügbar ist.

Wenn der Arbeitsspeicher nach dem Warten auf einen Timeoutzeitraum nicht verfügbar ist, der von den Abfragekosten dynamisch bestimmt wird, wie vom Abfrageoptimierer geschätzt, beendet SQL Server die Abfrage mit Fehler 8645 A timeout occurred while waiting for memory resources to execute the query in the resource pool 'default'. Der Timeoutwert variiert geringfügig zwischen den Versionen von SQL Server, weist jedoch einen maximalen Zeitüberschreitungswert von 24 Stunden auf. Der auf Serverebene timeout_sec festgelegte Timeoutwert wird in sys.dm_exec_query_memory_grants angezeigt.

Eine ausführliche Erläuterung mit den Schritten zur Problembehandlung finden Sie unter " Langsame Leistung" oder "Geringe Arbeitsspeicherprobleme", die durch Arbeitsspeichererteilungen in SQL Server verursacht werden.

Ursache

Dieser Fehler kann in Bezug auf Speichererteilungen und längere Wartezeiten auf verfügbaren Speicher angezeigt werden. Wenn eine Abfrage abgeschlossen ist, wird der von ihr verwendete Ausführungsspeicher freigegeben. Wenn dieser Fehler angezeigt wird, bedeutet dies, dass die Timeoutabfrage über den Timeoutzeitraum hinaus auf andere Anforderungen gewartet hat. Es kann nur eine einzige Anforderung geben, die den gesamten verfügbaren QE-Speicher verbraucht hat, oder es könnten viele Anforderungen und kombiniert werden, ihre Speichererteilungen haben den QE-Speicher erschöpft. Wenn Sie solche anforderungen mit langer Ausführung in Ihrer Workload haben, müssen Sie Maßnahmen ergreifen, um die Ausführungsdauer zu verbessern und die Menge des verwendeten QE-Speichers zu verringern.

Aktion des Benutzers

Wenn Sie den Ressourcengouverneur nicht verwenden, um den Speicherpool für bestimmte Workloads einzuschränken, können Sie den gesamten Serverstatus und die Arbeitsauslastung überprüfen. Wenn Sie die Ressourcenkontrolle verwenden, überprüfen Sie die Ressourcenpool- oder Workloadgruppeneinstellungen.

In der folgenden Liste sind die im oben genannten Artikel beschriebenen Schritte zusammengefasst. Mit diesen Schritten können Sie QE-Speicherfehler reduzieren oder beseitigen:

  1. Ermitteln Sie, welche Anforderungen in SQL Server die große Speichererteilung oder QE-Speicherverbraucher sind. Weitere Informationen finden Sie unter Identifizieren von Wartezeiten für den Abfrageausführungsspeicher.

  2. Schreiben Sie Abfragen neu, um Sortier- und Hashvorgänge zu minimieren oder zu vermeiden.

  3. Aktualisieren Sie Statistiken, und halten Sie sie regelmäßig auf dem neuesten Stand, um sicherzustellen, dass SQL Server die Speicherzuteilung korrekt schätzt.

  4. Erstellen Sie geeignete Indizes für die identifizierte Abfrage oder Abfragen. Indizes können die große Anzahl der verarbeiteten Zeilen reduzieren und so die JOIN-Algorithmen ändern und die Größe von Zuschüssen verringern oder vollständig beseitigen.

  5. Verwenden Sie den HINWEIS OPTION (min_grant_percent = XX, max_grant_percent = XX) in Ihren Abfragen, sofern möglich.

  6. Verwenden Sie den Ressourcengouverneur, um die Auswirkungen der QE-Speicherauslastung nur auf eine bestimmte Workload zu beschränken.

  7. SQL Server 2017 und 2019 verwenden adaptive Abfrageverarbeitung, sodass der Speicherzuteilungs-Feedbackmechanismus die Größe der Speichererteilung dynamisch zur Laufzeit anpassen kann. Dieses Feature kann Probleme mit der Speichererteilung an erster Stelle verhindern.

  8. Erhöhen Sie den SQL Server-Arbeitsspeicher, oder passen Sie vorhandene Einstellungen an.

    1. Überprüfen Sie die folgenden SQL Server-Speicherkonfigurationsparameter:

      • max. Serverspeicher – bei Bedarf vergrößern
      • Min. Serverarbeitsspeicher
      • Min. Arbeitsspeicher pro Abfrage
    2. Achten Sie auf ungewöhnliche Einstellungen. Berichtigen Sie sie bei Bedarf. Berücksichtigen Sie erhöhte Speicheranforderungen für SQL Server. Standardeinstellungen und empfohlene Einstellungen werden in den Serverspeicherkonfigurationsoptionen aufgeführt.

  9. Erhöhen Sie den Arbeitsspeicher auf Betriebssystemebene (physischer oder virtueller RAM).

  10. Überprüfen Sie, ob andere Anwendungen oder Dienste Arbeitsspeicher auf dem Server beanspruchen. Konfigurieren Sie weniger kritische Anwendungen oder Dienste neu, um weniger Arbeitsspeicher zu verbrauchen oder auf einen separaten Server zu verschieben. Diese Aktion kann den Druck des externen Arbeitsspeichers entfernen.

  11. Führen Sie die folgenden DBCC-Befehle aus, um mehrere SQL Server-Speichercaches freizugeben – ein temporäres Measure.

  • DBCC FREESYSTEMCACHE
  • DBCC FREESESSIONCACHE
  • DBCC FREEPROCCACHE