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),導致這部分查詢結果沒有被緩存,因此以上測試結果整體性能提升不高。