Abilita i costi sensibili alla cache per i piani di query di scansione dell'indice

Questa pagina documenta la consapevolezza della cache durante le scansioni dell'indice. Se abilitato, lo strumento di pianificazione delle query di AlloyDB per PostgreSQL regola il costo I/O stimato delle scansioni degli indici in base al numero di pagine di indice e tabella già disponibili nel buffer condiviso all'inizio dell'esecuzione. Il piano di query finale viene quindi selezionato in base ai costi del piano modificati. In questo modo, le prestazioni delle query migliorano e i costi del database si riducono.

Una volta attivata, la funzionalità di consapevolezza della cache funziona automaticamente e si adatta allo stato mutevole del raggiungimento del buffer condiviso. Inoltre, la consapevolezza della cache può funzionare insieme ad altre pratiche di ottimizzazione delle query, ad esempio impostando la stima dei costi dello strumento di pianificazione delle query di AlloyDB su random_page_cost.

Abilita la consapevolezza della cache

Per abilitare il riconoscimento della cache per l'istanza AlloyDB, imposta il flag alloydb.enable_cache_aware_costing (Anteprima) su on. Inoltre, puoi impostare il flag a livello di sessione per influire sui piani di query che si verificano nella stessa sessione. Per informazioni su come impostare il flag, vedi Configurare i flag di database di un'istanza.

Scenario di esempio

Il seguente esempio di codice mostra un piano di scansione dell'indice eseguito con una cache del buffer condivisa completamente riscaldata.

explain (analyze, verbose, buffers)
SELECT count(d) FROM t1 WHERE a = 10 AND b > 100 AND c > 100;
------------------ Aggregate  (cost=3908.93..3908.94 rows=1 width=8) (actual time=4.128..4.130 rows=1 loops=1)
   Output: count(d)
   Buffers: shared hit=926
   ->  Index Scan using idx1 on public.t1  (cost=0.43..3906.49 rows=975 width=2) (actual time=0.143..3.205 rows=919 loops=1)
         Output: a, b, c, d
         Index Cond: ((t1.a = 10) AND (t1.b > 100) AND (t1.c > 100))
         Buffers: shared hit=926
   Execution Time: 4.353 ms

Durante questa esecuzione, non sono state eseguite letture I/O. Senza la consapevolezza della cache, il query planner include il costo I/O per il piano di query di scansione dell'indice. Ciò può comportare che il piano di query di scansione dell'indice perda rispetto a un piano di query di scansione sequenziale.

Il seguente snippet di codice mostra il costo del piano di query aggiustato quando è abilitata la consapevolezza della cache.

explain (verbose)
SELECT count(d) FROM t1 WHERE a = 10 AND b > 100 AND c > 100;
------------------ Aggregate  (cost=29.93..29.94 rows=1 width=8)
   Output: count(d)
   ->  Index Scan using idx1 on public.t1  (cost=0.43..27.49 rows=975 width=2)
         Output: a, b, c, d
         Index Cond: ((t1.a = 10) AND (t1.b > 100) AND (t1.c > 100))

Il nuovo costo, 27.49, per lo stesso piano di query di scansione dell'indice è molto inferiore al vecchio costo, 3906.49.