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_colname和gp_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 |
|
50%缓存命中率 包含2条点查句 | 807 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),导致这部分查询结果没有被缓存,因此以上测试结果整体性能提升不高。