本页介绍了索引扫描期间的缓存感知。启用后,AlloyDB for PostgreSQL 查询规划器会根据执行开始时共享缓冲区中已有的索引和表页数,调整索引扫描的估计 I/O 成本。然后,根据调整后的方案费用选择最终查询方案。这有助于提高查询性能并降低数据库费用。
启用后,缓存感知功能会自动运行,并根据命中共享缓冲区的状态变化进行调整。此外,缓存感知功能还可以与其他查询调优实践相结合,例如将 AlloyDB 查询规划器的费用估算设置为 random_page_cost
。
启用缓存感知
如需为 AlloyDB 实例启用缓存感知功能,请将 alloydb.enable_cache_aware_costing
(预览版)标志设置为 on
。此外,您还可以在会话级设置标志,以影响同一会话下发生的查询计划。如需了解如何设置该标志,请参阅配置实例的数据库标志。
示例场景
以下代码示例展示了在完全预热的共享缓冲区缓存中执行的索引扫描计划。
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
在此执行期间,没有 I/O 读取。在不了解缓存的情况下,查询规划器会为索引扫描查询计划添加 I/O 费用。这可能会导致索引扫描查询计划输给顺序扫描查询计划。
以下代码段显示了启用缓存感知功能后的调整后查询计划费用。
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))
对于相同的索引扫描查询计划,新费用 27.49
远低于旧费用 3906.49
。