利用外部表高速缓存提高查询性能
外部表高速缓存创建为数据库中的方案对象,该对象所分配的物理空间与表和索引在数据文件中存储的方式类似。创建外部表高速缓存时,将在您的方案中创建新表,并且为您的方案设置的任何空间限额限制也应用于外部表高速缓存。
相关主题
关于 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 。
将文件填充到外部表高速缓存中
显示用于将文件填充到外部表高速缓存的示例。
创建高速缓存后,可以将文件填充到高速缓存中。填充文件会将指定的外部表文件的内容加载到高速缓存中。您可以选择填充表中的所有文件,填充表的特定百分比,或者指定过滤条件以限制要填充的文件。例如,您可以根据文件的名称或日期范围筛选文件。
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.parquet
和 salesdata1.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.parquet
和 sales_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.parquet
和 salesdata1.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#_data1
和 sales#_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 提供了用于监视外部表高速缓存的视图。
视图 | 说明 |
---|---|
提供有关数据库中的所有外部表高速缓存或有关用户外部表高速缓存的信息。 |
|
提供有关云存储中可供当前用户访问并属于缓存的外部表的文件的信息。 |
|
提供有关云存储中由当前用户拥有并属于缓存的外部表的文件的信息。此视图不显示 |
设置外部表高速缓存的可选大小调整首选项
可以使用 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_NAME
和 PROPERTY_VALUE
参数设置空间配额限制。
PROPERTY_NAME
参数接受 MAX_CACHE_SIZE
和 MAX_CACHE_PERCENT
值。MAX_CACHE_SIZE
属性指定外部高速缓存总大小(字节)。MAX_CACHE_PERCENT
属性将外部高速缓存总大小指定为指定用户配额的百分比。
-
如果定义了
MAX_CACHE_SIZE
、MAX_CACHE_PERCENT
和空间配额,则MAX_CACHE_PERCENT
优先于MAX_CACHE_SIZE
。 -
如果仅定义了
MAX_CACHE_SIZE
且未定义MAX_CACHE_PERCENT
或空间限额,则MAX_CACHE_SIZE
优先。 -
如果仅定义了空间限额,并且未定义
MAX_CACHE_SIZE
和MAX_CACHE_PERCENT
,则高速缓存大小限额默认为方案限额总数的 10%。 -
如果未定义
MAX_CACHE_SIZE
、MAX_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_value
是 5368709120
,它指定 SALES
方案的最大高速缓存大小为 5GB。
有关更多信息,请参见 SET_USER_PROPERTY Procedure 和 CREATE_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_TABLE
、DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE
或 DBMS_CLOUD.CREATE_HYBRID_PART_TABLE
创建的外部表包括两个不可见列 file$path
和 file$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
有关不可见列的详情,请参阅:不可见列
For information about Oracle's commitment to accessibility, visit the Oracle Accessibility Program website at http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc.
获得 Oracle 支持
Oracle 客户访问和使用 Oracle 支持服务将遵循其适用服务的 Oracle 订单中规定的条款和条件。