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

Per migliorare le prestazioni delle query e ridurre i costi di I/O del database, puoi attivare il calcolo dei costi di scansione dell'indice sensibile alla cache in AlloyDB per PostgreSQL. Quando attivi la determinazione dei costi di scansione dell'indice sensibile alla cache, il planner delle query di AlloyDB modifica il costo di I/O stimato delle scansioni dell'indice in base al numero di pagine di indice e tabella disponibili nel buffer condiviso all'inizio dell'esecuzione e seleziona il piano di query finale in base ai costi modificati.

Dopo aver attivato la funzionalità di awareness della cache, questa funziona automaticamente e si adatta quando cambiano le percentuali di hit del buffer condiviso. La consapevolezza della cache può funzionare anche con altre pratiche di ottimizzazione delle query, come l'impostazione della stima dei costi di Query Planner di AlloyDB in random_page_cost.

Abilita l'awareness della cache

Per abilitare l'awareness 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, consulta Configura 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 condiviso 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 di I/O. Senza l'awareness della cache, Query Planner include il costo di I/O per il piano di query di scansione dell'indice. Ciò può comportare la perdita del piano di query di scansione dell'indice rispetto a un piano di query di scansione sequenziale.

Il seguente snippet di codice mostra il costo del piano di query modificato quando è abilitata la sensibilità alla 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 costo precedente, 3906.49.