AnalyticDB PostgreSQL版V6.3.7.0版本引入了Query Cache特性,该特性可以缓存查询结果,对于重复的查询可以非常迅速地返回查询结果,因此对于读多写少,尤其是重复查询多的场景,可以有效提升数据库的查询性能。

注意事项

AnalyticDB PostgreSQL版内核小版本需要为V6.3.7.0及以上版本。查询和升级内核小版本,请参见查看内核小版本版本升级

目前AnalyticDB PostgreSQL版在使用Query Cache功能时存在以下限制:

  • 事务隔离级别必须为读已提交(READ-COMMITTED)才支持Query Cache。
  • GUC参数rds_uppercase_colnamegp_select_invisible必须设置为off才支持Query Cache。
  • 查询中涉及的表必须都开启Query Cache,才能查询缓存的数据。
  • libpq前端协议版本小于3.0不支持Query Cache。
  • 如果事务块内的查询之前有过修改操作,查询结果无法存储在Query Cache中。
  • 临时表、视图、物化视图、系统表、Unlogged Table、外表、Volatile/Immutable Function不支持Query Cache。
  • 直接访问分区子表时不支持Query Cache。
  • 开启多Master特性时,所有查询都不支持Query Cache。
  • 结果集大小超过7.5 KB不支持Query Cache。
  • 单个查询涉及的表超过32个不支持Query Cache。
  • 拓展查询(Extend Query)中使用了游标(Cursor)时不支持Query Cache。

全局开启Query Cache

由于Query Cache只有在查询时间局部性比较高的情况下才能发挥作用,因此Query Cache功能默认关闭,如需全局开启Query Cache功能,请提交工单联系技术支持进行开启。

注意 全局开启Query Cache需要重启实例后才能生效,建议您在业务低谷期执行重启操作。

会话级别开启或关闭Query Cache

您可以使用rds_session_use_query_cache参数在会话级别开启或关闭Query Cache功能。

会话级别开启Query Cache功能:

SET rds_session_use_query_cache = on;

会话级别关闭Query Cache功能:

SET rds_session_use_query_cache = off;

表级开启或关闭Query Cache

您可以使用querycache_enabled参数在表级别开启或关闭Query Cache功能。

对于新建表,可以使用如下语句开启Query Cache:

CREATE TABLE table_name (c1 int, c2 int) WITH (querycache_enabled=on);

对于建表时未开启Query Cache的表,可以使用如下语句开启Query Cache:

ALTER TABLE table_name SET (querycache_enabled=on);

对于不再需要使用Query Cache的表,可以使用如下语句关闭Query Cache:

ALTER TABLE table_name SET (querycache_enabled=off);

调整Query Cache失效时间

为了保证Query Cache查询结果的正确性,当系统中有DDL、DML操作时,Query Cache中表的缓存结果会失效,以免查询到过期的结果。但是由于AnalyticDB PostgreSQL版使用了MVCC机制,而Query Cache只会存储最新的查询结果,导致某些情况(例如读写事务并发场景)会返回一个过期的结果。

Query Cache的缓存结果有效生命周期默认为10分钟。如果缓存结果的时长超过了有效生命周期,那么执行相同的查询时,系统会重新执行该查询而不是返回缓存结果。

为了避免返回过期结果,您可以提交工单联系技术支持修改Query Cache有效生命周期。

性能评估

以下内容将针对OLTP和OLAP两种负载场景对Query Cache的效果进行评估。

说明 本文的TPC-H和TPC-DS的实现基于TPC-H和TPC-DS的基准测试,并不能与已发布的TPC-H和TPC-DS基准测试结果相比较,本文中的测试并不符合TPC-H和TPC-DS基准测试的所有要求。

OLTP

以下内容将使用带索引的点查进行评估,测试结果如下:

场景 不使用Query Cache 使用Query Cache
0%缓存命中率

包含1条点查句

1718 TPS
  • 测试过程中无Cache替换:1399 TPS
  • 测试过程中有Cache替换:915 TPS
50%缓存命中率

包含2条点查句

807 TPS
  • 测试过程中无Cache替换:1367 TPS
  • 测试过程中有Cache替换:877 TPS
100%缓存命中率

包含1条点查句

1718 TPS 11219 TPS

在OLTP负载场景,一条正常的查询时延在10ms左右。在查询100%缓存命中的情况下,性能约有6.5倍提升。即使Query Cache无任何缓存命中,相比较不使用Query Cache性能差距也较小。而且Query Cache引入的开销绝对时间相对固定,在产生Cache替换时,大部分情况下开销不超过20ms。

OLAP

以下内容将分别使用10 GB数据量的TPC-H和TPC-DS进行评估,测试结果如下:

场景 不使用Query Cache 使用Query Cache
10 GB TPC-H 1255秒 522秒
10 GB TPC-DS 2813秒 1956秒

在OLAP负载场景,TPC-H和TPC-DS查询性能均有较为明显的提升,其中TPC-H查询命中缓存时,Q1查询约有1000多倍的提升。由于TPC-H和TPC-DS部分查询结果过大,超过缓存查询的最大值(7.5 KB),导致这部分查询结果没有被缓存,因此以上测试结果整体性能提升不高。