使用外部表格快取改善查詢效能

專用 Exadata 基礎架構上的 Autonomous Database 上,您可以使用外部表格快取來快取資料庫內外部表格的資料。

外部表格快取會在您的資料庫中建立為綱要物件,其配置的實體空間與表格和索引儲存在資料檔中的方式類似。當您建立外部表格快取時,會在您的綱要中建立新表格,而為綱要設定的所有空間配額限制也會套用至外部表格快取。

相關主題

關於 Autonomous Database 中的外部表格快取

外部表格快取是 Autonomous Database 中儲存外部表格資料的儲存區。

外部資料不是由資料庫管理;不過,您可以使用外部表格來查詢資料庫外部的資料。外部表格的查詢不會和資料庫表格的查詢一樣快,因為每次存取資料時,都必須從儲存在物件存放區的外部檔案擷取這些資料。

外部表格快取功能可讓您從 Autonomous Database 內的外部表格快取經常存取的資料,而不需要修改可存取資料的應用程式,從而更快存取外部表格。

下列是使用外部表格快取的一些優點:
  • 提升效能:查詢速度快上數倍,適用於經常存取的外部資料 - 適合定期存取相同資料的儀表板、報表及分析工具。

  • 100% 透明:快取機制完全透明;應用程式無須變更查詢、儀表板或應用程式,即可受益於更快的速度。

  • 較低的雲端成本:在多雲端應用程式中,快取可降低從遠端儲存擷取重複外部資料的需求,進而降低與跨區域或雲端存取資料相關的資料傳出費用。

您可以為在下列檔案類型中建立的已分割與未分割表格建立外部表格快取:
  • Parquet

  • ORC

  • AVRO

  • Iceberg 桌子

請參閱查詢外部資料以瞭解詳細資訊。

必備條件

列出建立外部表格快取的先決條件。

  • 您必須具有 DBMS_EXT_TABLE_CACHE 套裝軟體的 EXECUTE 權限。請注意,您只能在自己的綱要和您所擁有的外部表格中建立外部表格快取。

  • 您必須為綱要配置適當的空間配額,以確保快取資料有足夠的儲存容量。

  • 您必須要有證明資料,才能存取儲存在物件存放區中的外部表格檔案。如果您啟用存取 Oracle Cloud Infrastructure 物件存放區的資源主體證明資料,就不需要建立證明資料。

限制

列出有關在 Autonomous Database 中使用外部表格快取的重要注意事項和限制。

  • 您只能在自己的綱要和您所擁有的外部表格中建立外部表格快取。

  • 外部表格快取只能包含來自單一外部表格的檔案。

  • 您無法授與外部表格快取的權限,而且只能從您擁有的外部表格快取存取資料。

  • 從物件存放區刪除檔案時,快取中的對應資料會標記為無效且無法存取。

建立外部資料表快取

執行 DBMS_EXT_TABLE_CACHE.CREATE_CACHE 以建立外部表格快取。

建立快取時,一開始是空的,並啟用植入。快取大小會在每次新增檔案時增加,視綱要定義的空間配額限制而定,直到達到指派的限制為止。請參閱設定外部表格快取的選擇性大小偏好設定以瞭解詳細資訊。

  1. 使用 DBMS_EXT_TABLE_CACHE.CREATE_CACHE 來建立綱要的外部表格快取。例如:
    BEGIN
        DBMS_EXT_TABLE_CACHE.CREATE_CACHE (      
          owner          => 'SALES',
          table_name     => 'STORE_SALES',
          partition_type => 'PATH');                                                                 
    END;                                                                 
    /
    

    這會建立 SALES 綱要中 STORE_SALES 表格的快取。STORE_SALES 是指向「物件存放區」中儲存之資料的外部表格。

    owner 參數會指定綱要名稱。此範例會為 SALES 使用者建立外部表格快取。

    partition_type 參數指定用於外部表格快取的分割方法。本範例使用 FILE$PATH 資料欄分割快取。FILE$PATH 是不顯示的資料欄,指定到物件名稱開頭為止的檔案路徑文字。

    請參閱外部表格描述資料資料欄CREATE_CACHE 程序,瞭解詳細資訊。

  2. 當您首次建立外部表格快取時,其描述資料會儲存在資料說明中,但不會配置任何空間給快取資料。您可以查詢 USER_EXTERNAL_TAB_CACHES 視觀表以確認建立快取。
    SELECT external_table_name, cached, disabled 
      FROM user_external_tab_caches;

    如需詳細資訊,請參閱 DBA_EXTERNAL_TAB_CACHES 和 USER_EXTERNAL_TAB_CACHES 檢視

    使用 DBMS_EXT_TABLE_CACHE.VALIDATE 程序驗證外部表格快取。如果在資料庫中找不到參照的外部表格,則會報告錯誤。

    舉例而言:
    BEGIN
      DBMS_EXT_TABLE_CACHE.VALIDATE (
        owner         => 'SALES', 
        table_name    => 'STORE_SALES',
        raise_errors  => TRUE);
    END;
    /

    請參閱 VALIDATE Procedure 以瞭解詳細資訊。

將檔案填入外部表格快取

顯示將檔案填入外部表格快取的範例。

建立快取之後,您可以將檔案填入快取中。植入檔案會將指定外部表格檔案的內容載入快取中。您可以選擇從表格填入所有檔案、特定百分比的表格,或指定篩選條件來限制要填入的檔案。例如,您可以根據檔案的名稱或日期範圍來篩選檔案。

Oracle 會根據配置給綱要的空間配額,嘗試將檔案填入快取中。如果達到指定的配額限制,除非配置必要的空間,否則 Oracle 會停止填入檔案。

外部表格快取不會自動重新整理。若要在修改物件存放區上的檔案時更新快取,您必須重新填入檔案。

從物件存放區刪除檔案時,對應的快取資料會立即變成無效,而且無法擷取。

新增表格至外部表格快取

使用 DBMS_EXT_TABLE_CACHE.ADD_TABLE 將整個表格或特定百分比的外部表格填入快取中。

範例

BEGIN
  DBMS_EXT_TABLE_CACHE.ADD_TABLE (
    owner         => 'SALES', 
    table_name    => 'STORE_SALES');
END;
/

此範例會嘗試將 STORE_SALES 表格填入快取中,略過任何已填入的現有檔案。

BEGIN
  DBMS_EXT_TABLE_CACHE.ADD_TABLE (
    owner         => 'SALES', 
    table_name    => 'STORE_SALES',
    percent_files => 80);
END;
/

此範例會嘗試將 STORE_SALES 表格的 80% 填入快取中,略過已填入的任何現有檔案。

percent_files 參數是選擇性的;如果您未指定此參數,整個表格就會填入快取中。

如需詳細資訊,請參閱 ADD_TABLE 程序

新增檔案至外部表格快取

您可以使用下列程序將一或多個檔案新增至外部表格快取:
  • ADD_FILE:新增單一檔案至快取。

  • ADD_BY_LIKE:根據指定的路徑篩選新增一或多個指定的檔案。

  • ADD_LATEST_FILES:根據指定的時間間隔新增一或多個檔案。

範例

使用 DBMS_EXT_TABLE_CACHE.ADD_FILE 程序將單一檔案填入外部表格快取中。舉例而言:
BEGIN
  DBMS_EXT_TABLE_CACHE.ADD_FILE (
    owner        => 'SALES', 
    table_name   => 'STORE_SALES',
    file_url     => 'https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/salesdata.parquet'
);
END;
/

此範例會將 salesdata.parquet 檔案中的資料填入快取中。

此範例會在指定的檔案存在於快取中且自上次快取檔案後尚未修改時,略過將檔案填入快取中。

如需詳細資訊,請參閱 ADD_FILE 程序

使用 DBMS_EXT_TABLE_CACHE.ADD_BY_LIKE 程序,將一或多個檔案填入外部表格快取中。舉例而言:
BEGIN
  DBMS_EXT_TABLE_CACHE.ADD_BY_LIKE (
    owner        => 'SALES', 
    table_name   => 'STORE_SALES',
    path_filters => '["https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/salesdata.parquet",
                      "https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/salesdata1.parquet"]'
);
END;
/

此範例會將 salesdata.parquetsalesdata1.parquet 檔案的資料填入快取中,略過已填入的任何現有檔案。

BEGIN
  DBMS_EXT_TABLE_CACHE.ADD_BY_LIKE (
    owner        => 'SALES', 
    table_name   => 'STORE_SALES',
    path_filters => '["https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/sales#_data1.parquet",
                      "https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/sales#_data2.parquet"]',
    esc_char     => '#',
    force        => TRUE);
END;
/

此範例會將 sales_data1.parquetsales_data2.parquet 檔案填入快取中。

在此範例中,會將 '#' 字元定義為遁離字元。在 '#' 後面的 '_' 字元會被視為文字底線,而不是作為符合任何單一字元的萬用字元。

如需詳細資訊,請參閱 ADD_BY_LIKE 程序

使用 DBMS_EXT_TABLE_CACHE.ADD_LATEST_FILES 程序,根據上次修改日期將一或多個檔案植入外部表格快取。舉例而言:
BEGIN
  DBMS_EXT_TABLE_CACHE.ADD_LATEST_FILES (
    owner        => 'SALES', 
    table_name   => 'STORE_SALES',
    since        => INTERVAL '7' DAY,
    max_files    => 5,
    force        => TRUE);
END;
/

since 參數會指定時間間隔;只有過去 7 (7) 天內修改的檔案才可以填入快取中。

max_files 參數會限制可填入快取中的檔案數目。此範例僅植入五個 (5) 檔案。

force 參數會強制在快取中覆寫指定的檔案,即使未修改檔案也一樣。

如需詳細資訊,請參閱 ADD_LATEST_FILES 程序

查詢下列資料說明視觀表以列出在外部表格快取中快取的檔案:

從外部表格快取刪除檔案

顯示從外部表格快取刪除檔案的範例。

您可以從快取中移除所有檔案,或指定篩選條件,將一或多個檔案從快取中刪除。例如,您可以依檔案名稱或根據特定的時間間隔來篩選檔案。

清除外部表格快取

使用 DBMS_EXT_TABLE_CACHE.CLEAR 可刪除外部表格快取中的所有檔案。舉例而言:

BEGIN
  DBMS_EXT_TABLE_CACHE.CLEAR (
    owner         => 'SALES', 
    table_name    => 'STORE_SALES');
END;
/

此範例會刪除 STORE_SALES 快取中的所有檔案,並取消配置已移除檔案所使用的全部空間。

請參閱清除程序以瞭解詳細資訊。

從外部表格快取刪除檔案

您可以使用下列程序從外部表格快取刪除一或多個檔案:
  • DROP_FILE:從快取中刪除單一檔案。

  • DROP_BY_LIKE:根據指定的路徑篩選,從快取中刪除一或多個檔案。

  • RETIRE_FILES:根據指定的間隔從快取刪除一或多個檔案。

範例

使用 DBMS_EXT_TABLE_CACHE.DROP_FILE 從外部表格快取中刪除檔案。舉例而言:

BEGIN
  DBMS_EXT_TABLE_CACHE.DROP_FILE (
    owner        => 'SALES', 
    table_name   => 'STORE_SALES',
    file_url     => 'https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/salesdata.parquet'
);
END;
/

此範例會從快取中刪除 salesdata.parquet 檔案,並取消配置已移除檔案所使用的全部空間。

如需詳細資訊,請參閱 DROP_FILE 程序

使用 DBMS_EXT_TABLE_CACHE.DROP_BY_LIKE ,根據 path_filters 參數刪除一或多個檔案。舉例而言:

BEGIN
  DBMS_EXT_TABLE_CACHE.DROP_BY_LIKE (
    owner        => 'SALES', 
    table_name   => 'STORE_SALES',
    path_filters => '["https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/salesdata.parquet",
                      "https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/salesdata1.parquet"]'
);
END;
/

此範例會將 salesdata.parquetsalesdata1.parquet 檔案從快取中刪除,然後取消配置已移除檔案所使用的全部空間。

BEGIN
  DBMS_EXT_TABLE_CACHE.DROP_BY_LIKE (
    owner        => 'SALES', 
    table_name   => 'STORE_SALES',
    path_filters => '["https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/sales#_data1.parquet",
                      "https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/sales#_data1.parquet"]'
);
END;
/

此範例會將 sales#_data1sales#_data2 檔案從快取中刪除,然後取消配置已移除檔案所使用的全部空間。

在此範例中,會將 '#' 字元定義為遁離字元。在 '#' 後面的 '_' 字元會被視為文字底線,而不是作為符合任何單一字元的萬用字元。

如需詳細資訊,請參閱 DROP_BY_LIKE 程序

使用 DBMS_EXT_TABLE_CACHE.RETIRE_FILES 可根據指定的間隔刪除一或多個檔案。舉例而言:

BEGIN
 DBMS_EXT_TABLE_CACHE.RETIRE_FILES (
    owner        => 'SALES', 
    table_name   => 'STORE_SALES',
    before       => INTERVAL '30' DAY);
END;
/

此範例會刪除快取中超過三十 (30) 天的檔案,並取消配置已移除檔案所使用的所有空間。

如需詳細資訊,請參閱 RETIRE_FILES 程序

上述範例會從快取中移除一或多個檔案,同時保留快取。您可以視需要再次將檔案載入快取中。請參閱將檔案填入外部表格快取以瞭解詳細資訊。

停用及啟用外部表格快取

顯示停用和啟用外部表格快取的範例。

執行 DBMS_EXT_TABLE_CACHE.DISABLE 以停用資料庫的外部表格快取。停用快取並不會將資料從快取中刪除;而是會將快取標記為 DISABLED ,最佳化處理程式也無法將快取用於查詢重寫。

範例

BEGIN
    DBMS_EXT_TABLE_CACHE.DISABLE (      
      owner          => 'SALES',
      table_name     => 'STORE_SALES');                                                                 
END;                                                                 
/

此範例會停用 STORE_SALES 快取。

請參閱 DISABLE 程序瞭解詳細資訊。

停用外部表格快取之後,請使用 DBMS_EXT_TABLE_CACHE.ENABLE 來啟用快取。

範例:
BEGIN
  DBMS_EXT_TABLE_CACHE.ENABLE (
    owner        => 'SALES', 
    table_name   => 'STORE_SALES'
 );
END;
/

此範例會啟用 STORE_SALES 快取。

請參閱啟用程序以瞭解詳細資訊。

刪除外部表格快取

顯示一個範例,以刪除外部表格快取。

執行 DBMS_EXT_TABLE_CACHE.DROP_CACHE 以刪除外部表格快取。DBMS_EXT_TABLE_CACHE.DROP_CACHE 程序會從資料庫中移除指定的外部表格快取,並釋出與快取關聯的儲存體空間。

範例:

BEGIN
    DBMS_EXT_TABLE_CACHE.DROP_CACHE (      
      owner          => 'SALES',
      table_name     => 'STORE_SALES');                                                             
END;                                                                 
/

此範例會刪除 SALES 綱要中的 STORE_SALES 快取。

刪除快取會從資料說明中移除其描述資料,並刪除其所有快取的資料。

如需詳細資訊,請參閱 DROP_CACHE 程序

查詢 USER_EXTERNAL_TAB_CACHES 檢視以確認快取已刪除。舉例而言:
SELECT external_table_name, cached
  FROM user_external_tab_caches;

如需詳細資訊,請參閱 DBA_EXTERNAL_TAB_CACHES 和 USER_EXTERNAL_TAB_CACHES 檢視

檢視外部表格快取資訊

Autonomous Database 提供檢視,可讓您監督外部表格快取。

檢視 描述

DBA_EXTERNAL_TAB_CACHES 與 USER_EXTERNAL_TAB_CACHES 檢視

提供資料庫中所有外部表格快取或使用者之外部表格快取的相關資訊。

ALL_EXTERNAL_TAB_CACHE_LOCATIONS

提供目前使用者可存取且屬於快取之外部表格的雲端儲存中檔案相關資訊。

USER_EXTERNAL_TAB_CACHE_LOCATIONS

提供目前使用者擁有且屬於快取之外部表格的雲端儲存中檔案相關資訊。此檢視不會顯示 OWNER 資料欄。

設定外部表格快取的選擇性大小偏好設定

您可以使用 DBMS_EXT_TABLE_CACHE.SET_USER_PROPERTY 程序來設定外部表格快取的偏好設定和空間配額限制。

使用者預設會停用外部表格快取。若要啟用和建立外部表格快取,請使用 DBMS_EXT_TABLE_CACHE.CREATE_CACHE 程序。快取會在您的預設綱要中建立,並繼承為綱要定義的任何空間配額限制。不過,您也可以使用 DBMS_EXT_TABLE_CACHE.SET_USER_PROPERTY 程序定義外部表格快取的空間配額。您可以使用 DBMS_EXT_TABLE_CACHE.SET_USER_PROPERTY 程序的 PROPERTY_NAMEPROPERTY_VALUE 參數來設定空間配額限制。

PROPERTY_NAME 參數接受 MAX_CACHE_SIZEMAX_CACHE_PERCENT 值。MAX_CACHE_SIZE 特性會指定外部快取大小總計 (位元組)。MAX_CACHE_PERCENT 特性會將外部快取大小總計指定為指定之使用者配額的百分比。

設定快取大小特性之前,請注意下列優先順序:
  • 定義 MAX_CACHE_SIZEMAX_CACHE_PERCENT 和空間配額時,MAX_CACHE_PERCENT 的優先順序高於 MAX_CACHE_SIZE

  • 僅定義 MAX_CACHE_SIZE,且未定義 MAX_CACHE_PERCENT 或空間配額時,會優先採用 MAX_CACHE_SIZE

  • 若只定義空間配額,但未定義 MAX_CACHE_SIZEMAX_CACHE_PERCENT,則快取大小配額預設為綱要配額總計的 10%。

  • 未定義 MAX_CACHE_SIZEMAX_CACHE_PERCENT 或空間配額時,快取空間配額預設為 UNLIMITED

範例

BEGIN
    DBMS_EXT_TABLE_CACHE.SET_USER_PROPERTY (
    property_name  => 'MAX_CACHE_PERCENT',          
    property_value => 50,                   
    owner          => 'SALES');                                                                
END;                                                                 
/

此範例會將 SALES 綱要的快取偏好設定設為 MAX_CACHE_PERCENT

property_value 為 50%,指定 SALES 綱要的快取空間配額上限為 SALES 定義的總空間配額 50%。

BEGIN
    DBMS_EXT_TABLE_CACHE.SET_USER_PROPERTY (
    owner          => 'SALES',   
    property_name  => 'MAX_CACHE_SIZE',          
    property_value => 5368709120);                                                                
END;                                                                 
/

此範例會將 SALES 綱要的快取偏好設定設為 MAX_CACHE_SIZE

property_value5368709120,指定 SALES 綱要的快取大小上限為 5GB。

如需詳細資訊,請參閱 SET_USER_PROPERTY 程序CREATE_CACHE 程序

使用 DBMS_EXT_TABLE_CACHE.GET_USER_PROPERTY 擷取快取大小特性。

範例:

SET SERVEROUTPUT ON
    DECLARE
    max_cache_sz NUMBER,
    BEGIN
    max_cache_sz := DBMS_EXT_TABLE_CACHE.GET_USER_PROPERTY (
        property_name       => 'MAX_CACHE_SIZE',         
        owner               => 'SALES');                                                                
END;                                                                 
/

如需詳細資訊,請參閱 GET_USER_PROPERTY 函數

外部表格描述資料資料欄

外部表格中繼資料可協助您決定執行查詢時來自何處的資料。

您使用 DBMS_CLOUD.CREATE_EXTERNAL_TABLEDBMS_CLOUD.CREATE_EXTERNAL_PART_TABLEDBMS_CLOUD.CREATE_HYBRID_PART_TABLE 建立的外部表格包含兩個不顯示的資料欄 file$pathfile$name。這些資料欄可協助識別記錄的來源檔案。

  • file$path:指定直到物件名稱開頭為止的檔案路徑文字。

  • file$name:指定物件名稱,包括最後 "/" 後面的所有文字。

舉例而言:

SELECT genre_id, name, file$name, file$path FROM ext_genre
     WHERE rownum <= 2;

genre_id      name        file$name     file$path
--------      ---------   -----------   ----------------------
1             Action      genre.csv     https://objectstorage.us-ashburn-1.oraclecloud.com/n/namespace-string/b/moviestream_gold/o/genre
2             Adventure   genre.csv     https://objectstorage.us-ashburn-1.oraclecloud.com/n/namespace-string/b/moviestream_gold/o/genre

請參閱不顯示的資料欄,瞭解不顯示資料欄的詳細資訊。