利用外部表高速缓存提高查询性能

Autonomous Database on Dedicated Exadata Infrastructure 上,您可以使用外部表高速缓存来缓存数据库内外部表的数据。

外部表高速缓存创建为数据库中的方案对象,该对象所分配的物理空间与表和索引在数据文件中存储的方式类似。创建外部表高速缓存时,将在您的方案中创建新表,并且为您的方案设置的任何空间限额限制也应用于外部表高速缓存。

关于 Autonomous Database 中的外部表高速缓存

外部表高速缓存是 Autonomous Database 中的一个存储区域,用于存储外部表中的数据。

外部数据不是由数据库管理的;但是,您可以使用外部表在数据库外部查询数据。对外部表的查询速度不如对数据库表的查询快,因为每次访问数据时,都需要从对象存储上存储的外部文件中提取该查询。

通过外部表高速缓存功能,您可以从 Autonomous Database 中的外部表缓存经常访问的数据,而无需对访问数据的应用进行修改,从而加快对外部表的访问速度。

下面是使用外部表高速缓存的一些好处:
  • 提高性能:对于经常访问的外部数据,查询速度提高了几倍,非常适合定期访问相同数据的仪表盘、报告和分析工具。

  • 100% 透明:缓存机制是完全透明的;无需对其查询、仪表盘或应用程序进行任何更改,应用程序可以受益于更高的速度。

  • 降低云成本:在多云应用中,缓存可减少从远程存储重复检索外部数据的需求,从而降低跨区域或云访问数据所产生的数据出站费用。

可以为在以下文件类型上创建的分区表和非分区表创建外部表高速缓存:
  • Parquet

  • ORC

  • AVRO

  • Iceberg 餐桌

有关详细信息,请参阅查询外部数据

Prerequisites

列出创建外部表高速缓存的先决条件。

  • 您必须对 DBMS_EXT_TABLE_CACHE 软件包具有 EXECUTE 特权。请注意,您只能在自己的方案中为您拥有的外部表创建外部表高速缓存。

  • 您必须为方案分配适当的空间限额,以确保高速缓存数据具有足够的存储容量。

  • 您必须具有身份证明才能访问存储在对象存储中的外部表文件。如果您为访问 Oracle Cloud Infrastructure 对象存储启用资源主用户身份证明,则无需创建身份证明。

限制

列出有关在 Autonomous Database 中使用外部表高速缓存的重要说明和限制。

  • 您只能在自己的方案中为您拥有的外部表创建外部表高速缓存。

  • 外部表高速缓存只能包含来自单个外部表的文件。

  • 您无法授予对外部表高速缓存的权限,并且只能访问您拥有的外部表高速缓存中的数据。

  • 从对象存储中删除文件时,高速缓存中的相应数据将被标记为无效,并且无法访问。

创建外部表的高速缓存

运行 DBMS_EXT_TABLE_CACHE.CREATE_CACHE 以创建外部表高速缓存。

创建高速缓存时,它最初为空并启用填充。每次添加文件时,高速缓存大小都会增加,具体取决于为方案定义的空间限额限制,直至达到分配的限制。有关更多信息,请参见 Set Optional Sizing Preferences for External Table 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 是不可见的列,用于指定文件路径文本,直到对象名称的开头。

    有关更多信息,请参见 External Table Metadata ColumnsCREATE_CACHE Procedure

  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 过程

将文件填充到外部表高速缓存中

显示用于将文件填充到外部表高速缓存的示例。

创建高速缓存后,可以将文件填充到高速缓存中。填充文件会将指定的外部表文件的内容加载到高速缓存中。您可以选择填充表中的所有文件,填充表的特定百分比,或者指定过滤条件以限制要填充的文件。例如,您可以根据文件的名称或日期范围筛选文件。

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;
/

此示例尝试将 80% 的 STORE_SALES 表填充到高速缓存中,跳过任何已填充的现有文件。

percent_files 参数是可选的;如果不指定此参数,则整个表将填充到高速缓存中。

有关更多信息,请参见ADD_TABLE Procedure

将文件添加到外部表高速缓存

可以使用以下过程将一个或多个文件添加到外部表高速缓存:
  • 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 Procedure

使用 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 Procedure

使用 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) 天内修改的文件才有资格填充到高速缓存中。

max_files 参数限制可填充到高速缓存中的文件数。此示例仅填充五 (5) 个文件。

即使未修改文件,force 参数也会强制覆盖高速缓存中的指定文件。

有关更多信息,请参见ADD_LATEST_FILES Procedure

查询以下数据字典视图以列出在外部表高速缓存中缓存的文件:

从外部表高速缓存中删除文件

显示用于从外部表高速缓存中删除文件的示例。

您可以从高速缓存中删除所有文件,也可以指定过滤条件以从高速缓存中删除一个或多个文件。例如,您可以按文件的名称或基于特定时间间隔过滤文件。

清除外部表高速缓存

使用 DBMS_EXT_TABLE_CACHE.CLEAR 可从外部表高速缓存中删除所有文件。例如:

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

此示例将删除 STORE_SALES 高速缓存中的所有文件,并取消分配已删除文件使用的所有空间。

有关更多信息,请参见 CLEAR Procedure

从外部表高速缓存中删除文件

可以使用以下过程从外部表高速缓存中删除一个或多个文件:
  • 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 Procedure

使用 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 Procedure

使用 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 Procedure

上面的示例在保留高速缓存时从高速缓存中删除一个或多个文件。如有必要,可以再次将文件加载到高速缓存中。有关更多信息,请参见 Populate Files into External Table Cache

禁用并启用外部表高速缓存

显示用于禁用和启用外部表高速缓存的示例。

运行 DBMS_EXT_TABLE_CACHE.DISABLE 可从数据库禁用外部表高速缓存。禁用高速缓存不会从高速缓存中删除数据;相反,高速缓存将被标记为 DISABLED ,优化程序无法使用高速缓存进行查询重写。

范例

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

此示例禁用 STORE_SALES 高速缓存。

有关更多信息,请参见 DISABLE Procedure

禁用外部表高速缓存后,使用 DBMS_EXT_TABLE_CACHE.ENABLE 启用高速缓存。

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

此示例启用 STORE_SALES 高速缓存。

有关更多信息,请参见 ENABLE Procedure

删除外部表高速缓存

显示了删除外部表高速缓存的示例。

运行 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;                                                                 
/

此示例将 STORE_SALES 高速缓存从 SALES 方案中删除。

删除高速缓存会从数据字典中删除其元数据并删除其所有高速缓存的数据。

有关更多信息,请参见DROP_CACHE Procedure

查询 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 ProcedureCREATE_CACHE Procedure

使用 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 Function

外部表元数据列

外部表元数据可帮助您确定执行查询时数据的来源。

使用 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

有关不可见列的详情,请参阅:不可见列