AnalyticDB PostgreSQL 7.0版支援Query Cache(查詢快取)。該版本的Query Cache在AnalyticDB PostgreSQL 6.0版的基礎上進行了部分重構,能夠支援更大規模的單次查詢的緩衝和整個執行個體的緩衝集大小。
類似於AnalyticDB PostgreSQL 6.0版中的查詢快取,該特性可以緩衝查詢結果,且在出現重複查詢時可以迅速地返回查詢結果。因此該特性適用於讀多寫少的情境,特別是重複查詢較多的情境。在此類情境中使用該特性可以有效地提升查詢效能。
版本限制
核心版本為v7.0.6.9及以上的AnalyticDB PostgreSQL 7.0版執行個體。
使用限制
以下情境不支援Query Cache。
直接存取分區子表。
libpq前端協議版本小於3.0。
單次查詢中涉及的表超過128張。
Extended Query中使用了遊標。
交易隔離等級設定為READ-UNCOMMITTED或SERIALIZABLE。
未指定表參數
querycache_enabled=on。GUC參數
gp_select_invisible參數值設定為on。如果在事務塊內執行查詢之前有過修改操作,查詢結果無法緩衝在Query Cache中。
暫存資料表、視圖、物化視圖、系統資料表、非日誌表、外表、volatile/immutable函數不支援Query Cache。
結果集過大時不支援使用Query Cache。查詢能被緩衝的最大結果集大小預設為1 MB,如需修改此約束,請聯絡支援人員處理(調整後需要重啟執行個體)。
當以上情況均未出現時,AnalyticDB PostgreSQL 7.0版將自動緩衝查詢結果。若未來出現同樣的查詢時,則直接使用本次緩衝結果。
開啟Query Cache功能
由於Query Cache只有在查詢時間局部性比較高的情況下才能發揮作用,因此Query Cache功能預設關閉。如需開啟Query Cache功能,請聯絡支援人員處理。
表級開啟或關閉Query Cache
實際業務情境中,部分表可能查詢頻率較低、資料修改頻率高,此類情境不適合使用Query Cache。因此,AnalyticDB PostgreSQL 7.0版提供表級配置項querycache_enabled,支援在建表時顯式控制是否啟用該表的Query Cache功能。
只有開啟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修改操作時,對應的表的查詢結果緩衝將失效。
由於AnalyticDB for PostgreSQL使用MVCC機制,而Query Cache只緩衝最新的查詢結果,因此可能會出現緩衝未及時更新,從而導致查詢結果到期的情況。典型的情境是同一張表讀寫事務並發。
CREATE TABLE test1 (c1 int, c2 int) WITH (querycache_enabled=on);
1: BEGIN;
1: SELECT * FROM test1;
2: BEGIN;
2: INSERT INTO test1 values (3, 4);
2: COMMIT;
1: COMMIT;
-- 這行執行結果仍是空,而查不出(3,4), 因為引用了上次的緩衝
1: SELECT * FROM test1;針對此情況,Query Cache提供了參數adbpg_querycache_item_valid_duration。該參數控制查詢結果緩衝的有效生命週期(預設值為10分鐘)。如果某查詢結果緩衝時間超過了該生命週期,當同樣查詢進來時,不再引用該查詢結果,而是重新執行該查詢。您可以根據實際情況,關閉該表的Query Cache(querycache_enabled=off),或是設定adbpg_querycache_item_valid_duration值。
通常情況下,adbpg_querycache_item_valid_duration參數使用預設值即可。如需修改,請聯絡支援人員處理。
效能評估
AnalyticDB PostgreSQL 7.0版中的Query Cache在TP負載效能方面未表現出顯著提升,也不會對效能造成負面影響。AP負載方面,分別使用10 GB的TPC-H和TPC-DS負載進行了評估,其結果如下。
情境 | 關閉Query Cache | 開啟Query Cache |
10 GB TPC-H | 360.35s | 13.42s |
10 GB TPC-DS | 1176.63s | 6.71s |
從結果來看,無論TPC-H還是TPC-DS,查詢效能都有顯著提升。對於TPC-H,查詢命中緩衝時,Q1(耗時10毫秒)有超過1000倍的效能提升。理論上,如果查詢命中Query Cache,執行時間基本在1秒之內。而實際在使用Query Cache時, TPC-H和TPC-DS總耗時在10秒左右,是因為部分查詢結果超過了單次查詢能夠緩衝在Query Cache中的最大值1 MB,因此這些查詢的查詢結果沒有被緩衝。