索引預先擷取總覽

AlloyDB for PostgreSQL 會使用索引預先擷取功能,加快透過 B-tree 索引讀取一系列資料列的查詢。在執行 PostgreSQL 17 以上版本的 AlloyDB 和 AlloyDB Omni 執行個體上,預設會啟用索引預先擷取功能。您不需要設定任何旗標、重建索引,或變更應用程式或 SQL 查詢,就能享有這項功能。

索引預先擷取的運作方式

當查詢透過索引掃描一系列值時 (例如在索引資料欄上使用 BETWEEN 述詞或 ORDER BY ... LIMIT 子句),掃描作業會讀取索引頁面,以及索引項目指向的資料表頁面。這些資料表頁面通常分散在儲存空間中。在標準 PostgreSQL 中,掃描作業會逐一讀取這些頁面,因此如果頁面尚未載入記憶體,查詢作業就會花費大部分時間等待儲存空間 I/O。

有了索引預先擷取功能,AlloyDB 會預先查看索引和資料表上執行的掃描作業,並平行讀取掃描作業即將需要的頁面。AlloyDB 會將預先擷取的頁面暫存在執行個體的本機 SSD 快取中,因此當掃描作業要求頁面時,系統會從快速的本機儲存空間 (而非遠端儲存空間) 提供頁面。預先擷取的頁面會暫存在 PostgreSQL 共用緩衝區外,因此預先擷取不會減少其他工作階段可用的緩衝區快取。

索引預先擷取功能包含下列防護措施,可避免對無法受益的查詢增加負擔:

  • 預先擷取作業會在 LIMIT 子句的邊界停止,因此掃描作業不會讀取查詢傳回的資料列以外的頁面。
  • 如果只對涵蓋索引執行索引掃描,AlloyDB 只會預先擷取索引頁面,不會讀取資料表頁面。
  • 傳回單一資料列的查詢 (例如主鍵查詢) 不會觸發預先擷取。

工作負載的優點

如果工作集大於執行個體的記憶體,且查詢透過 B-tree 索引讀取多個資料列,索引預先擷取功能最能發揮作用。以下是可受惠的查詢範例:

  • 對已建立索引的時間戳記、日期或數值資料欄進行範圍查詢,例如某個時間範圍內的報表。
  • 查詢會傳回一個鍵的多個資料列,例如客戶的訂單記錄。
  • 內部為索引掃描,會傳回多個資料列。
  • 從資料列導向資料表讀取大範圍資料的分析查詢。

如果查詢的資料已在共用緩衝區中,且為單列查詢,則無論是否預先擷取,效能都相同。

執行計畫中的預先擷取

如要查看索引預先擷取對查詢的影響,請使用 EXPLAIN (ANALYZE, BUFFERS) 執行查詢。預先擷取載入本機 SSD 快取的頁面,會在計畫的索引掃描節點上顯示為 ultra fast cache hit 計數。如要進一步瞭解如何解讀這些計數器,請參閱「取得及分析執行計畫」。

後續步驟