MSSQLSERVER_8645
Si applica a:SQL Server,
Database SQL di Azure e
Istanza gestita di SQL di Azure.
Dettagli
Attributo | Valore |
---|---|
Nome prodotto | SQL Server |
ID evento | 8645 |
Origine evento | MSSQLSERVER |
Componente | SQLEngine |
Nome simbolico | MEMTIMEDOUT_ERR |
Testo del messaggio | Timeout durante l'attesa di risorse di memoria per l'esecuzione della query nel pool di risorse '%ls' (%ld). Eseguire nuovamente la query. |
Spiegazione
Questo errore viene generato se una richiesta di SQL Server ha aspettato una concessione di memoria di esecuzione della query (QE) per un periodo di tempo prolungato e la memoria non era disponibile. La memoria di esecuzione delle query viene usata principalmente per operazioni di ordinamento, operazioni hash, operazioni di copia bulk e creazione e popolamento degli indici. Una query che esegue una di queste operazioni richiede una concessione di memoria. Se non è disponibile memoria, la query viene impostata per attendere un RESOURCE_SEMAPHORE fino a quando la memoria non diventa disponibile.
Se la memoria non è disponibile dopo l'attesa di un periodo di timeout in modo dinamico determinato dal costo della query stimato da Query Optimizer, SQL Server termina la query con errore 8645 A timeout occurred while waiting for memory resources to execute the query in the resource pool 'default'.
Il valore di timeout varia leggermente tra le versioni di SQL Server, ma ha un valore di timeout di attesa massimo di 24 ore. È possibile visualizzare il valore di timeout impostato a livello di server esaminando timeout_sec
in sys.dm_exec_query_memory_grants.
Per una spiegazione dettagliata dei passaggi per la risoluzione dei problemi, vedere Rallentamento delle prestazioni o problemi di memoria insufficiente causati dalle concessioni di memoria in SQL Server.
Causa
Questo errore può essere visualizzato in relazione alle concessioni di memoria e alle attese prolungate per la disponibilità della memoria. In genere, quando una query viene completata, rilascia la memoria di esecuzione usata. Pertanto, se viene visualizzato questo errore, significa che la query di timeout ha aspettato il completamento di altre richieste oltre il periodo di timeout. Potrebbe essere presente una sola richiesta che ha utilizzato tutta la memoria QE disponibile o che potrebbero esserci molte richieste e combinate, le concessioni di memoria hanno esaurito la memoria QE. Se nel carico di lavoro sono presenti richieste a esecuzione prolungata, è necessario adottare misure per migliorare la durata dell'esecuzione e ridurre la quantità di memoria QE usata.
Azione utente
Se non si usa Resource Governor per limitare il pool di memoria per determinati carichi di lavoro, è possibile verificare lo stato complessivo del server e il carico di lavoro. Se si usa Resource Governor, controllare le impostazioni del pool di risorse o del gruppo di carico di lavoro.
L'elenco seguente riepiloga i passaggi descritti in dettaglio nell'articolo precedente. Questi passaggi consentono di ridurre o eliminare gli errori di memoria QE:
Identificare le richieste in SQL Server come consumer di memoria di grandi dimensioni o consumer di memoria QE. Per altre informazioni, vedere Come identificare le attese per la memoria di esecuzione delle query.
Riscrivere le query per ridurre al minimo o evitare operazioni di ordinamento e hash.
Aggiornare le statistiche e mantenerle aggiornate regolarmente per assicurarsi che SQL Server stima correttamente la concessione di memoria.
Creare indici appropriati per la query o le query identificate. Gli indici possono ridurre il numero elevato di righe elaborate, modificando così gli algoritmi JOIN e riducendo le dimensioni delle concessioni o eliminandole completamente.
Usare l'hint OPTION (min_grant_percent = XX, max_grant_percent = XX) nelle query, dove possibile.
Usare Resource Governor per limitare l'effetto dell'utilizzo della memoria QE solo a un determinato carico di lavoro.
SQL Server 2017 e 2019 usano l'elaborazione di query adattive, consentendo al meccanismo di feedback delle concessioni di memoria di regolare le dimensioni delle concessioni di memoria in modo dinamico in fase di esecuzione. Questa funzionalità può impedire problemi di concessione di memoria al primo posto.
Aumentare la memoria di SQL Server o modificare le impostazioni esistenti.
Verificare i seguenti parametri di configurazione della memoria di SQL Server:
- max server memory - aumentare se necessario
- min server memory
- min memory per query
Valutare eventuali impostazioni non comuni e, se necessario, correggerle. Tenere conto di requisiti di memoria maggiori per SQL Server. Le impostazioni predefinite e consigliate sono elencate nelle opzioni di configurazione della memoria del server.
Aumentare la memoria a livello di sistema operativo (RAM fisica o virtuale).
Verificare se altre applicazioni o servizi utilizzano la memoria nel server specificato. Riconfigurare applicazioni o servizi meno critici per utilizzare meno memoria o spostarli in un server separato. Questa azione può rimuovere la pressione di memoria esterna.
Eseguire i comandi DBCC seguenti per liberare diverse cache di memoria di SQL Server: una misura temporanea.
- DBCC FREESYSTEMCACHE
- DBCC FREESESSIONCACHE
- DBCC FREEPROCCACHE