Eventi
31 mar, 23 - 2 apr, 23
Il più grande evento di apprendimento di SQL, Infrastruttura e Power BI. 31 marzo - 2 aprile. Usare il codice FABINSIDER per salvare $400.
Registrati oggiQuesto browser non è più supportato.
Esegui l'aggiornamento a Microsoft Edge per sfruttare le funzionalità più recenti, gli aggiornamenti della sicurezza e il supporto tecnico.
Si applica a: SQL Server 2017 (14.x) e versioni
successive database SQL di Azure Istanza gestita di SQL di Azure
database SQL in Microsoft Fabric
L'ottimizzazione automatica è una funzionalità di database che offre informazioni su potenziali problemi di prestazioni delle query, suggerisce soluzioni e corregge automaticamente i problemi rilevati.
L'ottimizzazione automatica, introdotta in SQL Server 2017 (14.x), notifica l'utente ogni volta che viene rilevato un potenziale problema di prestazioni e consente all'utente di applicare azioni correttive, oppure permette al motore di database di risolvere automaticamente i problemi di prestazioni. L'ottimizzazione automatica di SQL Server identifica e risolve i problemi di prestazioni causati da regressioni nella scelta del piano di esecuzione delle query. L'ottimizzazione automatica in database SQL di Azure e database SQL in Microsoft Fabric crea anche gli indici necessari e elimina gli indici inutilizzati. Per ulteriori informazioni sui piani di esecuzione delle query, vedere Piani di esecuzione.
Il motore di database di SQL Server monitora le query eseguite sul database e migliora automaticamente le prestazioni del carico di lavoro. Il motore di database include un meccanismo di intelligence incorporato che consente di ottimizzare automaticamente le query e migliorarne le prestazioni, adattando in modo dinamico il database al carico di lavoro. Sono disponibili due funzioni di ottimizzazione automatica:
La correzione automatica del piano identifica i piani di esecuzione delle query problematici, come la sensibilità dei parametri o i problemi di sniffing dei parametri, e risolve i problemi di prestazioni legati al piano di esecuzione delle query forzando l'ultimo piano buono conosciuto prima che si verificasse la regressione. Si applica a: SQL Server (a partire da SQL Server 2017 (14.x)), database SQL di Azure e database SQL in Microsoft Fabric e Istanza gestita di SQL di Azure
Gestione automatica degli indici: consente di identificare gli indici da aggiungere al database e quelli che è consigliabile rimuovere. Si applica a: database SQL di Azure e database SQL in Microsoft Fabric
Nota
In questo articolo le funzionalità e i comportamenti di database SQL di Azure si applicano anche al database SQL in Microsoft Fabric.
Tre delle attività principali per l'amministrazione classica di un database sono il monitoraggio del carico di lavoro, l'identificazione delle query Transact-SQL critiche e l'identificazione degli indici che dovrebbero essere aggiunti per migliorare le prestazioni o degli indici che vengono usati raramente e che potrebbero essere rimossi per migliorare le prestazioni. Il motore di database di SQL Server offre informazioni dettagliate per le query e gli indici che occorre monitorare. Il monitoraggio costante dei database è tuttavia un'attività complessa e tediosa, in particolare quando sono coinvolti molti database. Gestire un numero enorme di database potrebbe essere impossibile da fare in modo efficiente. Invece di gestire manualmente il monitoraggio e l'ottimizzazione del database, è possibile prendere in considerazione la possibilità di delegare alcune delle azioni di monitoraggio e ottimizzazione al motore di database, tramite la funzionalità di ottimizzazione automatica.
L’ottimizzazione automatica è un processo di monitoraggio e analisi continua che apprende costantemente le caratteristiche del carico di lavoro e identifica potenziali problemi e miglioramenti.
Questo processo consente l'adattamento dinamico del database al carico di lavoro mediante l'individuazione degli indici e dei piani che potrebbero migliorare le prestazioni dei carichi di lavoro e degli indici con effetti sui carichi di lavori. In base ai risultati raccolti, l'ottimizzazione automatica applica le azioni di ottimizzazione che consentono di migliorare le prestazioni del carico di lavoro. Inoltre, l'ottimizzazione automatica monitora continuamente le prestazioni del database dopo l'implementazione di qualsiasi modifica, per garantire il miglioramento delle prestazioni del carico di lavoro. Qualsiasi azione che non introduce miglioramenti delle prestazioni viene annullata automaticamente. Il processo di verifica è una funzionalità chiave che assicura che qualsiasi modifica apportata dall'ottimizzazione automatica non diminuisca le prestazioni complessive del carico di lavoro.
La correzione automatica del piano è una funzione di messa a punto automatica che identifica la regressione della scelta del piano di esecuzione e risolve automaticamente il problema forzando l'ultimo piano buono conosciuto. Per ulteriori informazioni sui piani di esecuzione delle query e sul Query Optimizer, consultare la Guida sull'architettura di elaborazione delle query.
Importante
La correzione automatica del piano dipende dall'abilitazione di Query Store nel database per il monitoraggio del carico di lavoro.
Il motore di database di SQL Server può utilizzare diversi piani di esecuzione per eseguire le query Transact-SQL. I piani di query dipendono dalle statistiche, dagli indici e da altri fattori. Il piano ottimale da utilizzare per l'esecuzione di una query Transact-SQL può cambiare nel tempo in base alle variazioni di questi fattori. In alcuni casi, il nuovo piano potrebbe non essere migliore di quello precedente e potrebbe causare una regressione delle prestazioni, ad esempio un problema di sensibilità dei parametri o di sniffing dei parametri.
Ogni volta che si nota una regressione nella scelta del piano, è necessario trovare un piano precedente valido e forzarlo al posto di quello attuale. Questa operazione può essere eseguita usando la procedura sp_query_store_force_plan
. Il motore di database in SQL Server 2017 (14.x) fornisce informazioni sui piani regressi e sulle azioni correttive consigliate. Inoltre, il motore di database consente di automatizzare completamente questo processo e di lasciare che il motore di database risolva qualsiasi problema riscontrato in relazione alla modifica del piano.
Importante
La correzione automatica del piano dovrebbe essere utilizzata nell'ambito di un aggiornamento del livello di compatibilità del database, dopo l'acquisizione di una linea di base, per mitigare automaticamente i rischi di aggiornamento del carico di lavoro. Per altre informazioni su questo caso d’uso, vedere Mantenere la stabilità delle prestazioni durante l'aggiornamento a SQL Server.
Il motore di database può passare automaticamente all'ultimo piano valido conosciuto ogni volta che viene rilevata una regressione nella scelta del piano.
Il motore di database rileva automaticamente qualsiasi potenziale regressione nella scelta del piano, compreso il piano che dovrebbe essere utilizzato al posto di quello sbagliato. Il piano di esecuzione risultante, forzato dalla correzione automatica del piano, sarà uguale o simile all'ultimo piano valido conosciuto. Poiché il piano risultante può non essere identico all'ultimo piano noto, la performance del piano forzato può variare. In rari casi, la differenza di prestazioni può essere significativa e negativa; in questo caso, la correzione automatica del piano interromperà automaticamente il tentativo di forzare il piano sostitutivo.
Quando il motore di database applica l'ultimo piano valido conosciuto prima che si verificasse la regressione, monitora automaticamente le prestazioni del piano forzato. Se il piano forzato non è migliore di quello regredito, il nuovo piano non sarà forzato e il motore di database compilerà un nuovo piano. Se il motore di database verifica che il piano forzato è migliore di quello regredito, il piano forzato viene mantenuto. Verrà conservato fino a quando non verrà ricompilato (ad esempio, al successivo aggiornamento delle statistiche o alla modifica dello schema). Per ulteriori informazioni sull’uso forzato dei piani e sui tipi di piani che possono essere forzati, vedere Limitazioni per l’uso forzato dei piani.
Nota
Se l'istanza di SQL Server viene riavviata prima che venga verificata un'azione forzata del piano, tale piano verrà automaticamente rimosso. In caso contrario, l'uso forzato del piano viene salvato in modo permanente nei riavvii di SQL Server.
È possibile abilitare l'ottimizzazione automatica per ogni database e specificare che il miglior piano più recente deve essere forzato ogni volta in cui viene rilevata una regressione della modifica del piano. L'ottimizzazione automatica viene abilitata con il comando seguente:
ALTER DATABASE <yourDatabase>
SET AUTOMATIC_TUNING ( FORCE_LAST_GOOD_PLAN = ON );
Una volta attivata questa opzione, il motore di database forzerà automaticamente le indicazioni se il miglioramento della CPU stimato è superiore a 10 secondi o il numero di errori nel nuovo piano è maggiore del numero di errori nel piano consigliato e verifica che il piano forzato sia migliore rispetto a quello corrente.
Per abilitare l'ottimizzazione automatica nel database SQL di Azure e nell’Istanza gestita di SQL di Azure, vedere Abilitazione dell'ottimizzazione automatica nel database SQL di Azure tramite il portale di Azure.
Senza l'ottimizzazione automatica, gli utenti devono monitorare il sistema periodicamente e cercare le query che sono regredite. Se un piano è regredito, l'utente deve trovare un piano buono precedente e forzarlo al posto di quello attuale, usando la procedura sp_query_store_force_plan
. La procedura consigliata consiste nel forzare l'ultimo piano valido noto perché i piani meno recenti potrebbero non essere validi a causa di statistiche o modifiche all'indice. L'utente che forza l'ultimo piano valido noto deve monitorare le prestazioni della query eseguita tramite l’uso forzato del piano e verificare che il piano forzato funzioni come previsto. In base ai risultati del monitoraggio e dell'analisi, il piano deve essere forzato o l'utente deve trovare un altro modo per ottimizzare la query, ad esempio riscrivendola. I piani forzati manualmente non devono essere forzati per sempre, perché il motore di database dovrebbe essere in grado di applicare piani ottimali. L'utente o l'amministratore del database deve infine rimuovere il piano usando la procedura sp_query_store_unforce_plan
e lasciare che il motore di database trovi il piano ottimale.
Suggerimento
In alternativa, usare la visualizzazione del Query Store Query con piani forzati per individuare e rimuovere i piani forzati.
SQL Server fornisce tutte le viste e le procedure necessarie per monitorare le prestazioni e risolvere i problemi in Query Store.
In SQL Server 2016 (13.x), è possibile trovare regressioni nella scelta del piano utilizzando le viste di sistema di Query Store. A partire da SQL Server 2017 (14.x), il Database Engine rileva e mostra potenziali regressioni nella scelta del piano e le azioni consigliate da applicare nella DMV sys.dm_db_tuning_recommendations (Transact-SQL). La DMV mostra informazioni sul problema, l'importanza del problema e dettagli quali la query identificata, l'ID del piano regredito, l'ID del piano usato come linea di base per il confronto e l'istruzione Transact-SQL che può essere eseguita per risolvere il problema.
type | description | datetime | score | dettagli | ... |
---|---|---|---|---|---|
FORCE_LAST_GOOD_PLAN |
Tempo CPU modificato da 4 ms a 14 ms | 17/03/2017 | 83 | queryId recommendedPlanId regressedPlanId T-SQL |
|
FORCE_LAST_GOOD_PLAN |
Tempo CPU modificato da 37 ms a 84 ms | 16/03/2017 | 26 | queryId recommendedPlanId regressedPlanId T-SQL |
Alcune colonne di questa vista sono descritte nell'elenco seguente:
FORCE_LAST_GOOD_PLAN
.Usare la seguente query per ottenere uno script che risolve il problema e ulteriori informazioni sul guadagno stimato:
SELECT reason, score,
script = JSON_VALUE(details, '$.implementationDetails.script'),
planForceDetails.*,
estimated_gain = (regressedPlanExecutionCount + recommendedPlanExecutionCount)
* (regressedPlanCpuTimeAverage - recommendedPlanCpuTimeAverage)/1000000,
error_prone = IIF(regressedPlanErrorCount > recommendedPlanErrorCount, 'YES','NO')
FROM sys.dm_db_tuning_recommendations
CROSS APPLY OPENJSON (Details, '$.planForceDetails')
WITH ( [query_id] int '$.queryId',
regressedPlanId int '$.regressedPlanId',
recommendedPlanId int '$.recommendedPlanId',
regressedPlanErrorCount int,
recommendedPlanErrorCount int,
regressedPlanExecutionCount int,
regressedPlanCpuTimeAverage float,
recommendedPlanExecutionCount int,
recommendedPlanCpuTimeAverage float
) AS planForceDetails;
Il set di risultati è il seguente.
reason | score | script | query_id | plan_id corrente | plan_id consigliato | estimated_gain | error_prone |
---|---|---|---|---|---|---|---|
Tempo CPU modificato da 3 ms a 46 ms | 36 | EXEC sp_query_store_force_plan 12, 17; | 12 | 28 | 17 | 11.59 | 0 |
La colonna estimated_gain
rappresenta il numero stimato di secondi che verrebbero risparmiati se il piano consigliato venisse utilizzato per l'esecuzione della query al posto del piano corrente. Il piano consigliato deve essere forzato al posto del piano corrente se il guadagno è superiore a 10 secondi. Se sono presenti più errori , ad esempio timeout o esecuzioni interrotte, nel piano corrente rispetto al piano consigliato, la colonna error_prone
verrà impostata sul valore YES
. Un piano soggetto a errori è un altro motivo per cui il piano consigliato deve essere forzato anziché quello corrente.
Anche se il motore di database fornisce tutte le informazioni necessarie per identificare le regressioni di scelta del piano, il monitoraggio continuo e la risoluzione dei problemi di prestazioni potrebbero diventare un processo tedioso. L'ottimizzazione automatica semplifica notevolmente questo processo.
Nota
I dati nella DMV sys.dm_db_tuning_recommendations
non vengono salvati in modo permanente dopo il riavvio del motore di database. Usare la colonna sqlserver_start_time
in sys.dm_os_sys_info per trovare l'ora di avvio dell'ultimo motore di database.
Nel database SQL di Azure la gestione degli indici è semplice perché il database SQL di Azure raccoglie informazioni sul carico di lavoro e assicura che i dati vengano indicizzati sempre in modo ottimale. La progettazione appropriata degli indici è fondamentale per ottenere prestazioni ottimali del carico di lavoro e la gestione automatica degli indici risulta utile per ottimizzare gli indici. La gestione automatica degli indici consente di correggere i problemi di prestazioni nei database indicizzati in modo non corretto oppure di gestire e migliorare gli indici nello schema del database esistente. L'ottimizzazione automatica nel database SQL di Azure esegue le azioni seguenti:
Gli indici consentono di velocizzare alcune delle query che leggono dati dalle tabelle, ma possono rallentare le query che aggiornano i dati. È necessario valutare con attenzione quando creare un indice e quali colonne includervi. Alcuni indici potrebbero non essere più necessari dopo un certo periodo di tempo. Per questo motivo, è consigliabile individuare ed eliminare periodicamente questi indici che non portano alcun vantaggio. Se si ignorano gli indici inutilizzati, le prestazioni delle query di aggiornamento dei dati potrebbero risultare ridotte, senza alcun vantaggio per le query di lettura dei dati. Gli indici inutilizzati influiscono anche sulle prestazioni complessive del sistema perché risultano necessarie operazioni di registrazione superflue per aggiornamenti aggiuntivi.
Per individuare il set ottimale di indici che consentono di migliorare le prestazioni delle query di lettura dei dati dalle tabelle con un impatto minimo per gli aggiornamenti, possono essere necessarie operazioni di analisi continue e complesse.
Il database SQL di Azure usa i meccanismi di intelligence incorporati e regole avanzate per analizzare le query, identificare gli indici che sarebbero ottimali per i carichi di lavoro correnti e identifica gli indici che potrebbero essere rimossi. Il database SQL di Azure assicura di avere a disposizione il set minimo necessario di indici per l'ottimizzazione delle query di lettura dei dati, con un impatto minimo sulle altre query.
Oltre al rilevamento, il database SQL di Azure può applicare automaticamente le raccomandazioni individuate. Se si appura che le regole predefinite consentono di migliorare le prestazioni del database, è possibile delegare al database SQL di Azure la gestione automatica degli indici.
Quando database SQL di Azure applica una raccomandazione CREATE INDEX o DROP INDEX, monitora automaticamente le prestazioni delle query interessate dall'indice. Il nuovo indice sarà mantenuto solo se le prestazioni delle query interessate saranno migliorate. L'indice eliminato verrà ricreato automaticamente se alcune query vengono eseguite più lentamente a causa dell'assenza dell'indice.
Le azioni richieste per creare gli indici necessari nei database SQL di Azure potrebbero usare risorse e influire temporaneamente sulle prestazioni del carico di lavoro. Per ridurre al minimo l'impatto della creazione degli indici sulle prestazioni del carico di lavoro, il database SQL di Azure individua una finestra temporale appropriata per qualsiasi operazione di gestione degli indici. L'azione di ottimizzazione viene posticipata se il database ha bisogno di risorse per l'esecuzione del carico di lavoro e viene riavviata quando per il database è disponibile una quantità di risorse inutilizzate sufficiente per essere usata per l'attività di manutenzione. Una funzionalità importante nella gestione automatica degli indici e la verifica delle azioni. Quando il database SQL di Azure crea o elimina un indice, un processo di monitoraggio analizza le prestazioni del carico di lavoro per verificare che l'azione migliori effettivamente le prestazioni complessive. Se non introduce miglioramenti significativi, l'azione viene annullata immediatamente. In questo modo, il database SQL di Azure garantisce che le azioni di ottimizzazione automatica non influiscano negativamente sulle prestazioni del carico di lavoro. Gli indici creati tramite l'ottimizzazione automatica sono trasparenti per l'operazione di manutenzione sullo schema sottostante. Le modifiche dello schema, ad esempio l'eliminazione o ridenominazione delle colonne, non vengono impedite dalla presenza di indici creati automaticamente. Gli indici creati automaticamente dal database SQL di Azure vengono eliminati immediatamente in seguito all'eliminazione di tabelle o colonne correlate.
Senza la gestione automatica degli indici, un utente o un DBA dovrebbe interrogare manualmente la vista sys.dm_db_missing_index_details (Transact-SQL) o utilizzare il report Performance Dashboard in Management Studio per trovare gli indici che potrebbero migliorare le prestazioni, creare indici utilizzando i dettagli forniti in questa vista e monitorare manualmente le prestazioni della query. Per individuare gli indici che dovrebbero essere eliminati, gli utenti dovrebbero monitorare le statistiche di utilizzo operativo degli indici per individuare quelli usati raramente.
Il database SQL di Azure semplifica questo processo. Il database SQL di Azure consente di analizzare il carico di lavoro, identificare le query che potrebbero essere eseguite più rapidamente con un nuovo indice e identificare gli indici inutilizzati o duplicati. Per altre informazioni sull'identificazione degli indici che devono essere modificati, vedere Find index recommendations in Azure portal (Trovare raccomandazioni per gli indici nel portale di Azure).
Eventi
31 mar, 23 - 2 apr, 23
Il più grande evento di apprendimento di SQL, Infrastruttura e Power BI. 31 marzo - 2 aprile. Usare il codice FABINSIDER per salvare $400.
Registrati oggiTraining
Modulo
Configurare i database per ottimizzare le prestazioni - Training
Configurare i database per ottimizzare le prestazioni
Certificazione
Microsoft Certified: Azure Database Administrator Associate - Certifications
Amministrare un'infrastruttura di database SQL Server per database relazionali, ibridi, locali e cloud con le offerte di database relazionali Microsoft PaaS.
Documentazione
Monitorare le prestazioni tramite Query Store - SQL Server
Query Store offre informazioni dettagliate sulla scelta e sulle prestazioni del piano di query per SQL Server, Database SQL di Azure, Istanza gestita di SQL di Azure e Azure Synapse Analytics. Query Store acquisisce la cronologia di query, piani e statistiche di runtime.
sys.dm_db_tuning_recommendations (Transact-SQL) - SQL Server
Informazioni su come trovare potenziali problemi di prestazioni e correzioni consigliate in SQL Server e database SQL di Azure
Procedure consigliate per la gestione di Query Store - SQL Server
Informazioni sulle procedure consigliate per gestire Query Store di SQL Server, inclusi i dettagli specifici della versione, gestione dei criteri di acquisizione personalizzati e altre funzionalità delle prestazioni.