Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Utilizzo della cache di analisi ANTLR in Babelfish
A partire dalle versioni 5.7.0 e 6.2.0 di Babelfish, puoi utilizzare una cache persistente dei risultati di analisi ANTLR per le routine memorizzate (procedure e funzioni) per ridurre la latenza della prima esecuzione. T-SQL
Con la cache di analisi delle procedure:
-
T-SQL Le routine di grandi dimensioni (da centinaia a migliaia di righe) non comportano più un sovraccarico di T-SQL analisi completo alla prima esecuzione in ogni nuova sessione.
-
Il risultato analizzato viene serializzato una volta alla
CREATEALTERprocedure/function volta, archiviato nel catalogo e riutilizzato tra le sessioni, emulando il comportamento di memorizzazione nella cache a livello di sistema di SQL Server. -
La funzionalità è controllata dal GUC a livello di sessione, con sostituzioni facoltative per routine tramite.
babelfishpg_tsql.enable_antlr_parse_cachesys.enable_antlr_parse_cache() -
Per impostazione predefinita, la funzionalità è disattivata.
Prestazioni: per routine di grandi dimensioni, l'analisi ANTLR può richiedere fino a diversi secondi. Con la cache di analisi ANTLR, il tempo di analisi della prima esecuzione è ridotto a pochi millisecondi. Le esecuzioni successive nella stessa sessione vengono servite dalla cache in sessione (inferiore al millisecondo) e non sono influenzate.
Comprensione della cache di analisi ANTLR
Babelfish deve convalidare la T-SQL sintassi analizzando il corpo di una routine la prima volta che viene eseguita in una sessione. Questo risultato di analisi viene normalmente memorizzato nella cache solo per la durata di quella sessione, quindi ogni nuova connessione viene nuovamente analizzata da zero. La cache di analisi mantiene il risultato dell'analisi nel catalogo in modo che le nuove sessioni possano riutilizzarlo.
Come si comporta:
-
In
CREATE/ALTER: Quando la memorizzazione nella cache è abilitata, Babelfish analizza la routine e memorizza il risultato dell'analisi serializzata nella cache persistente. -
Prima esecuzione senza una voce persistente: se non esiste alcuna voce memorizzata nella cache (ad esempio, la routine è stata creata prima che la memorizzazione nella cache fosse abilitata), Babelfish esegue la normale analisi ANTLR e popola la cache persistente.
-
Prima esecuzione in una sessione successiva: Babelfish carica e deserializza il risultato dell'analisi memorizzato nella cache anziché rianalizzarlo: è qui che si verifica il risparmio di tempo.
-
Esecuzioni successive nella stessa sessione: servite dalla cache in sessione (comportamento invariato).
-
Se un risultato memorizzato nella cache manca o è stato creato da una versione diversa di Babelfish, Babelfish esegue la normale analisi ANTLR e ripopola la cache persistente quando la memorizzazione nella cache è abilitata.
-
Se Babelfish riscontra un errore durante la serializzazione o la deserializzazione di un risultato memorizzato nella cache, l'istruzione fallisce e restituisce un errore. Disabilita la memorizzazione nella cache per la routine interessata e riprova l'istruzione, oppure riprova in una nuova sessione con la GUC della cache disattivata. Se l'errore persiste, contatta l' AWS assistenza.
Osservazione del miglioramento del tempo di analisi
È possibile misurare l'effetto utilizzandoSET BABELFISH_STATISTICS PROFILE ON, che riporta il valore Babelfish T-SQL Batch Parsing Time per ogni batch. Innanzitutto, create una procedura di grandi dimensioni con la memorizzazione nella cache abilitata per popolare la cache persistente. Quindi confrontate la prima esecuzione della procedura in due nuove sessioni separate: una con la memorizzazione nella cache disabilitata, che ignora la voce persistente, e una con la memorizzazione nella cache abilitata, che la riutilizza. In alternativa, se la memorizzazione nella cache non era abilitata al momento della creazione della procedura, eseguila in due nuove sessioni separate con la memorizzazione nella cache abilitata: la prima esecuzione popola la cache persistente e la seconda la riutilizza.
Nell'esempio seguente, create innanzitutto la procedura con caching ON per popolare la cache persistente:
-- New session 0: caching ON (at CREATE PROCEDURE time) SELECT set_config('babelfishpg_tsql.enable_antlr_parse_cache', 'on', false); GO CREATE PROCEDURE dbo.updateInformation @region VARCHAR(50) AS BEGIN ... END; GO
Successivamente, in una nuova sessione con caching OFF (impostazione predefinita), esegui la procedura:
-- New session 1: caching OFF (default) SET BABELFISH_STATISTICS PROFILE ON; GO EXEC dbo.updateInformation @region = 'EMEA'; -- first call in this session GO
Il profilo delle statistiche riporta un tempo di analisi elevato:
Babelfish T-SQL Batch Parsing Time: 20359.465 ms
Infine, in un'altra nuova sessione con caching attivo, esegui la procedura:
-- New session 2: caching ON SELECT set_config('babelfishpg_tsql.enable_antlr_parse_cache', 'on', false); GO SET BABELFISH_STATISTICS PROFILE ON; GO EXEC dbo.updateInformation @region = 'EMEA'; -- first call in this session GO
Il profilo delle statistiche riporta un tempo di analisi significativamente inferiore:
Babelfish T-SQL Batch Parsing Time: 150.927 ms
La prima esecuzione in una nuova sessione passa da ~20 s di analisi a ~0,15 s una volta riutilizzato l'albero di analisi memorizzato nella cache. Le esecuzioni secondarie e successive all'interno della stessa sessione vengono eseguite dalla cache in sessione in entrambi i casi (inferiori al millisecondo) e non sono influenzate dal GUC.
Abilitazione della cache per una sessione
La funzionalità è controllata da un GUC a livello di sessione (impostazione predefinita OFF):
-- Enable parse caching for the current session SELECT set_config('babelfishpg_tsql.enable_antlr_parse_cache', 'on', false); GO -- Disable for the current session SELECT set_config('babelfishpg_tsql.enable_antlr_parse_cache', 'off', false); GO
Nota
-
Il GUC ha un ambito di sessione e viene ripristinato al valore predefinito (OFF) al termine della sessione.
-
Questo GUC non è attualmente configurabile a livello di cluster tramite.
sp_babelfish_configure
Controllo della cache per routine
È possibile sovrascrivere il GUC della sessione per una singola routine utilizzandosys.enable_antlr_parse_cache, che accetta l'id dell'oggetto della routine:
-- Force caching ON for a specific routine (even if the session GUC is OFF) SELECT sys.enable_antlr_parse_cache(sys.object_id('dbo.my_proc'), true); GO -- Force caching OFF for a specific routine — "kill switch" -- (clears any cached data and blocks caching even if the session GUC is ON) SELECT sys.enable_antlr_parse_cache(sys.object_id('dbo.my_proc'), false); GO -- Reset to default; the routine follows the session GUC SELECT sys.enable_antlr_parse_cache(sys.object_id('dbo.my_proc'), NULL); GO
Nota
-
È necessario essere il proprietario della routine o un membro del ruolo sysadmin per modificarne l'impostazione della cache.
-
L'impostazione per routine persiste tra le sessioni (è memorizzata nel catalogo) e viene mantenuta per tutta la durata
ALTER; viene rimossa quando la routine viene interrotta.
Controllo delle statistiche sulla cache
sys.antlr_parse_cache_stats()restituisce l'attività di parse-cache per la sessione corrente:
SELECT * FROM sys.antlr_parse_cache_stats(); GO
La tabella seguente descrive ogni colonna dell'output.
| Colonna | Description |
|---|---|
cache_hits |
Numero di esecuzioni di routine per le quali è stato riutilizzato un risultato di analisi memorizzato nella cache. |
cache_misses |
Numero di esecuzioni di routine per le quali è stata abilitata la memorizzazione nella cache ma non è stata trovata alcuna voce utilizzabile nella cache. |
cache_writes |
Numero di scritture riuscite nella cache persistente. |
cache_evictions |
Numero di voci memorizzate nella cache che sono state invalidate o rimosse (ad esempio, kill switch o interruttore GUC). |
cache_errors |
Numero di errori di serializzazione o deserializzazione. |
I contatori sono per sessione e vengono ripristinati in base a una nuova connessione.
Scenario di esempio
-- Enable caching for this session SELECT set_config('babelfishpg_tsql.enable_antlr_parse_cache', 'on', false); GO CREATE PROCEDURE dbo.report_proc @region VARCHAR(50) AS BEGIN -- large multi-statement T-SQL body ... SELECT @region; END; GO -- First execution in a brand-new session: served from the persistent cache (fast) EXEC dbo.report_proc @region = 'APAC'; GO -- Inspect cache activity for this session SELECT * FROM sys.antlr_parse_cache_stats(); GO -- Opt this routine out of caching regardless of the session setting SELECT sys.enable_antlr_parse_cache(sys.object_id('dbo.report_proc'), false); GO
Considerazioni sugli aggiornamenti
-
La cache di analisi ANTLR è associata a una versione specifica di Babelfish. Quando la versione di Babelfish cambia, i risultati dell'analisi memorizzati nella cache non vengono più riutilizzati. Le nuove esecuzioni analizzano nuovamente la routine e ripopolano automaticamente la cache quando la memorizzazione nella cache è abilitata.
-
Le routine esistenti create prima delle versioni 5.7.0 e 6.2.0 vengono memorizzate nella cache alla successiva
CREATEesecuzione/o in una sessione fredda una volta abilitata la memorizzazione nella cache.ALTER
Limitazioni importanti
-
Impostazione predefinita OFF: la funzionalità deve essere abilitata esplicitamente per sessione (o forzata per routine).
-
Tipo di connessione: la cache è attiva solo per le connessioni TDS (protocollo SQL Server), non per psql/libpq le connessioni.
-
Non memorizzato nella cache: i trigger, i trigger di eventi e le funzioni con valori di tabella in linea (ITVF) non vengono memorizzati nella cache in questa versione.
-
Cluster-wide config: la sessione GUC non è attualmente impostabile tramite.
sp_babelfish_configure