Condividi tramite


Ottimizzazione delle prestazioni con la memorizzazione nella cache dei set di risultati

Quando la memorizzazione nella cache dei set di risultati è abilitata, il pool SQL dedicato memorizza automaticamente nella cache i risultati della query nel database utente per l'uso ripetitivo. In questo modo, le esecuzioni di query successive possono ottenere risultati direttamente dalla cache persistente, in modo che non sia necessaria la ricompilazione. La memorizzazione nella cache dei set di risultati migliora le prestazioni delle query e riduce l'utilizzo delle risorse di calcolo. Inoltre, le query che usano il set di risultati memorizzati nella cache non usano slot di concorrenza e pertanto non vengono conteggiate rispetto ai limiti di concorrenza esistenti. Per la sicurezza, gli utenti possono accedere ai risultati memorizzati nella cache solo se hanno le stesse autorizzazioni di accesso ai dati degli utenti che creano i risultati memorizzati nella cache. La memorizzazione nella cache dei set di risultati è DISATTIVATa per impostazione predefinita a livello di database e sessione.

Annotazioni

La memorizzazione nella cache dei set di risultati non deve essere usata insieme a DECRYPTBYKEY. Se questa funzione di crittografia deve essere usata, assicurarsi di avere disabilitato la memorizzazione nella cache dei set di risultati (a livello di sessione o a livello di database) al momento dell'esecuzione.

Comandi chiave

Attivare/disattivare la memorizzazione nella cache dei set di risultati per un database utente

Attivare/disattivare la memorizzazione nella cache dei set di risultati per una sessione

Controllare le dimensioni del set di risultati memorizzato nella cache

Pulire la cache

Elementi non memorizzati nella cache

Quando la memorizzazione nella cache del set di risultati è attivata per un database, i risultati vengono memorizzati nella cache per tutte le query fino a quando la cache non è piena, ad eccezione di queste query:

  • Query con funzioni predefinite o espressioni di runtime non deterministiche anche quando non sono presenti modifiche ai dati o alle query delle tabelle di base. Ad esempio, DateTime.Now(), GetDate().
  • Query che usano funzioni definite dall'utente
  • Query che usano tabelle con sicurezza a livello di riga
  • Query che restituiscono dati con dimensioni di riga superiori a 64 KB
  • Query che restituiscono dati di grandi dimensioni (>10 GB)

Annotazioni

  • Alcune funzioni non deterministiche e espressioni di runtime possono essere deterministiche per le query ripetitive sugli stessi dati. Ad esempio, ROW_NUMBER().
  • Usare ORDER BY nella query se l'ordine o la sequenza di righe nel set di risultati della query è importante per la logica dell'applicazione.
  • Se i dati nelle colonne ORDER BY non sono univoci, non esiste un ordine di riga garantito per le righe con gli stessi valori nelle colonne ORDER BY, indipendentemente dal fatto che la memorizzazione nella cache del set di risultati sia abilitata o disabilitata.

Importante

Le operazioni per creare la cache dei set di risultati e recuperare i dati dalla cache vengono eseguite nel nodo di controllo di un'istanza del pool SQL dedicata. Quando la memorizzazione nella cache dei set di risultati è attivata, l'esecuzione di query che restituiscono set di risultati di grandi dimensioni (ad esempio >, 1 GB) può causare una limitazione elevata sul nodo di controllo e rallentare la risposta di query complessiva nell'istanza. Queste query vengono in genere usate durante l'esplorazione dei dati o le operazioni ETL (estrazione, trasformazione e caricamento). Per evitare il sovraccarico del nodo di controllo e la comparsa di problemi di prestazioni, gli utenti devono DISATTIVARE la memorizzazione nella cache del set di risultati nel database prima di eseguire query di questo tipo.

Eseguire questa query per misurare il tempo impiegato dalle operazioni di memorizzazione nella cache del set di risultati per una query.

SELECT step_index, operation_type, location_type, status, total_elapsed_time, command
FROM sys.dm_pdw_request_steps
WHERE request_id  = <'request_id'>;

Di seguito è riportato un esempio di output per una query eseguita con la memorizzazione nella cache del set di risultati disabilitata.

Screenshot che mostra i risultati della query, inclusi il tipo di posizione e il comando.

Di seguito è riportato un esempio di output per una query eseguita con la memorizzazione nella cache del set di risultati abilitata.

Screenshot che mostra i risultati della query con il comando

Quando vengono usati i risultati memorizzati nella cache

Il set di risultati memorizzato nella cache viene riutilizzato per una query se vengono soddisfatti tutti i requisiti seguenti:

  • L'utente che esegue la query ha accesso a tutte le tabelle a cui viene fatto riferimento nella query.
  • Esiste una corrispondenza esatta tra la nuova query e la query precedente che ha generato la cache del set di risultati.
  • Non sono presenti modifiche ai dati o agli schemi nelle tabelle da cui è stato generato il set di risultati memorizzato nella cache.

Eseguire questo comando per verificare se una query è stata eseguita con un riscontro nella cache dei risultati. La colonna result_cache_hit restituisce 1 per riscontri nella cache, 0 per mancata cache e valori negativi per motivi per cui la memorizzazione nella cache del set di risultati non è stata usata. Controlla sys.dm_pdw_exec_requests per i dettagli.

SELECT request_id, command, result_cache_hit FROM sys.dm_pdw_exec_requests
WHERE request_id = <'Your_Query_Request_ID'>

Gestire i risultati memorizzati nella cache

La dimensione massima della cache del set di risultati è di 1 TB per ogni database. I risultati memorizzati nella cache vengono invalidati automaticamente quando i dati della query sottostante cambiano.

La rimozione della cache viene gestita automaticamente dal pool SQL dedicato seguendo questa pianificazione:

  • Ogni 48 ore se il set di risultati non è stato usato o è stato invalidato.
  • Quando la cache del set di risultati si avvicina alla dimensione massima.

Gli utenti possono svuotare manualmente l'intera cache del set di risultati usando una di queste opzioni:

  • Disattivare la funzionalità cache dei set di risultati per il database
  • Eseguire DBCC DROPRESULTSETCACHE mentre si è connessi al database

La sospensione di un database non consente di svuotare il set di risultati memorizzato nella cache.

Passaggi successivi

Per altri suggerimenti sullo sviluppo, vedere Panoramica dello sviluppo.