内容大纲
内容简介:本文主要介绍Oracle数据库的外部表调优,包括外部表的概念、类型、配置、监控和优化方法。风哥教程参考Oracle官方文档外部表调优相关内容,为生产环境提供完整的外部表调优解决方案。
Part01-基础概念与理论知识
1.1 外部表概念
Oracle外部表是一种特殊的表,它的数据存储在数据库外部的文件中,而不是存储在数据库的数据文件中。外部表允许Oracle数据库直接访问外部文件中的数据,而不需要将数据加载到数据库中。
1.2 外部表类型
- ORACLE_LOADER:使用Oracle加载器访问外部文件
- ORACLE_DATAPUMP:使用数据泵访问外部文件
- ORACLE_HDFS:访问HDFS中的数据
- ORACLE_HIVE:访问Hive中的数据
1.3 外部表调优方法
- 选择合适的外部表类型:根据数据特点选择合适的外部表类型
- 优化外部表定义:优化外部表的访问参数
- 监控外部表使用情况:定期监控外部表的使用情况
- 分析外部表性能:分析外部表的性能指标,识别瓶颈
- 优化外部表配置:根据分析结果优化外部表配置
Part02-生产环境规划与建议
2.1 外部表调优规划
制定合理的外部表调优规划:
- 评估数据库的外部表需求
- 分析外部数据的特点和格式
- 制定外部表策略
- 建立外部表调优的流程和规范
- 定期执行外部表调优
- 跟踪外部表调优的效果
2.2 外部表调优建议
外部表调优建议:
- 根据数据特点选择合适的外部表类型
- 优化外部表定义,提高访问效率
- 定期监控外部表使用情况,及时发现问题
- 结合其他性能工具,全面分析外部表性能
- 根据数据量和访问模式调整外部表配置
2.3 外部表调优结果管理
外部表调优结果管理建议:
- 保存外部表调优的历史数据
- 建立外部表调优的审核机制
- 跟踪外部表使用的变化趋势
- 分析外部表性能的瓶颈
- 与开发团队分享外部表调优结果,提高应用程序性能
Part03-生产环境项目实施方案
3.1 外部表配置与管理
SQL> CREATE DIRECTORY external_dir AS ‘/backup/external’;
# 2. 授予目录权限
SQL> GRANT READ, WRITE ON DIRECTORY external_dir TO fgedu;
# 3. 创建外部表
SQL> CREATE TABLE fgedu.external_orders (
2 order_id NUMBER,
3 customer_id NUMBER,
4 order_date DATE,
5 amount NUMBER
6 ) ORGANIZATION EXTERNAL (
7 TYPE ORACLE_LOADER
8 DEFAULT DIRECTORY external_dir
9 ACCESS PARAMETERS (
10 RECORDS DELIMITED BY NEWLINE
11 FIELDS TERMINATED BY ‘,’
12 MISSING FIELD VALUES ARE NULL
13 (order_id, customer_id, order_date DATE ‘YYYY-MM-DD’, amount)
14 )
15 LOCATION (‘orders.csv’)
16 );
# 4. 查看外部表信息
SQL> SELECT * FROM user_external_tables WHERE table_name = ‘EXTERNAL_ORDERS’;
# 5. 删除外部表
SQL> DROP TABLE fgedu.external_orders;
3.2 外部表监控
SQL> SELECT * FROM user_external_tables WHERE table_name = ‘EXTERNAL_ORDERS’;
# 2. 查看外部表访问参数
SQL> SELECT * FROM user_external_locations WHERE table_name = ‘EXTERNAL_ORDERS’;
# 3. 分析外部表性能
SQL> EXPLAIN PLAN FOR SELECT * FROM fgedu.external_orders;
# 4. 监控外部表使用情况
SQL> SELECT * FROM v$session WHERE program LIKE ‘%external%’;
# 5. 查看外部表错误日志
SQL> SELECT * FROM user_external_table_errors WHERE table_name = ‘EXTERNAL_ORDERS’;
3.3 外部表调优
# 查看外部表配置和使用情况
# 2. 优化外部表定义
# 根据分析结果优化外部表定义
# 3. 调整外部表配置
# 根据分析结果调整外部表配置
# 4. 验证调优效果
# 查看调优后的外部表使用情况
3.4 外部表调优结果管理
# 将外部表使用情况保存到表中,用于后续分析
# 2. 建立外部表调优的审核机制
# 定期审核外部表使用情况,确保外部表资源的合理使用
# 3. 跟踪外部表使用的变化趋势
# 分析外部表使用的变化趋势,预测外部表需求
# 4. 分析外部表性能的瓶颈
# 识别外部表性能的瓶颈,采取相应的措施
# 5. 与开发团队分享外部表调优结果
# 提供外部表调优结果给开发团队,帮助优化应用程序
Part04-生产案例与实战讲解
4.1 外部表配置与管理实战
$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 – Production on Fri Apr 5 05:00:00 2026
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.3.0.0.0
# 2. 创建目录对象
SQL> CREATE DIRECTORY external_dir AS ‘/backup/external’;
Directory created.
# 3. 授予目录权限
SQL> GRANT READ, WRITE ON DIRECTORY external_dir TO fgedu;
Grant succeeded.
# 4. 创建外部数据文件
$ echo “1,1,2026-01-15,1000” > /backup/external/orders.csv
$ echo “2,2,2026-02-15,2000” >> /backup/external/orders.csv
$ echo “3,3,2026-03-15,3000” >> /backup/external/orders.csv
$ echo “4,4,2026-04-15,4000” >> /backup/external/orders.csv
# 5. 创建外部表
SQL> CREATE TABLE fgedu.external_orders (
2 order_id NUMBER,
3 customer_id NUMBER,
4 order_date DATE,
5 amount NUMBER
6 ) ORGANIZATION EXTERNAL (
7 TYPE ORACLE_LOADER
8 DEFAULT DIRECTORY external_dir
9 ACCESS PARAMETERS (
10 RECORDS DELIMITED BY NEWLINE
11 FIELDS TERMINATED BY ‘,’
12 MISSING FIELD VALUES ARE NULL
13 (order_id, customer_id, order_date DATE ‘YYYY-MM-DD’, amount)
14 )
15 LOCATION (‘orders.csv’)
16 );
Table created.
# 6. 查看外部表数据
SQL> SELECT * FROM fgedu.external_orders;
ORDER_ID CUSTOMER_ID ORDER_DATE AMOUNT
———- ———– ———- ———-
1 1 2026-01-15 1000
2 2 2026-02-15 2000
3 3 2026-03-15 3000
4 4 2026-04-15 4000
4.2 外部表监控与分析实战
SQL> SELECT table_name, external_type, default_directory_name FROM user_external_tables WHERE table_name = ‘EXTERNAL_ORDERS’;
TABLE_NAME EXTERNAL_TYPE DEFAULT_DIRECTORY_NAME
—————————— ————- ——————————
EXTERNAL_ORDERS ORACLE_LOADER EXTERNAL_DIR
# 2. 查看外部表访问参数
SQL> SELECT table_name, location FROM user_external_locations WHERE table_name = ‘EXTERNAL_ORDERS’;
TABLE_NAME LOCATION
—————————— ——————————————————————————–
EXTERNAL_ORDERS orders.csv
# 3. 分析外部表性能
SQL> EXPLAIN PLAN FOR SELECT * FROM fgedu.external_orders WHERE amount > 2000;
Explained.
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
PLAN_TABLE_OUTPUT
————————————————————————–
Plan hash value: 3912729313
————————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
————————————————————————–
| 0 | SELECT STATEMENT | | 2 | 36 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EXTERNAL_ORDERS | 2 | 36 | 3 (0)| 00:00:01 |
————————————————————————–
Note
—– – dynamic statistics used: dynamic sampling (level=2)
# 4. 监控外部表使用情况
SQL> SELECT * FROM v$session WHERE program LIKE ‘%external%’;
no rows selected
# 5. 查看外部表错误日志
SQL> SELECT * FROM user_external_table_errors WHERE table_name = ‘EXTERNAL_ORDERS’;
no rows selected
4.3 外部表调优实战
# 查看外部表配置和使用情况
# 2. 优化外部表定义
# 创建带并行度的外部表
SQL> CREATE TABLE fgedu.external_orders_parallel (
2 order_id NUMBER,
3 customer_id NUMBER,
4 order_date DATE,
5 amount NUMBER
6 ) ORGANIZATION EXTERNAL (
7 TYPE ORACLE_LOADER
8 DEFAULT DIRECTORY external_dir
9 ACCESS PARAMETERS (
10 RECORDS DELIMITED BY NEWLINE
11 FIELDS TERMINATED BY ‘,’
12 MISSING FIELD VALUES ARE NULL
13 (order_id, customer_id, order_date DATE ‘YYYY-MM-DD’, amount)
14 )
15 LOCATION (‘orders.csv’)
16 ) PARALLEL 4;
# 3. 测试并行查询性能
SQL> SET TIMING ON
SQL> SELECT * FROM fgedu.external_orders WHERE amount > 2000;
ORDER_ID CUSTOMER_ID ORDER_DATE AMOUNT
———- ———– ———- ———-
3 3 2026-03-15 3000
4 4 2026-04-15 4000
Elapsed: 00:00:00.01
SQL> SELECT * FROM fgedu.external_orders_parallel WHERE amount > 2000;
ORDER_ID CUSTOMER_ID ORDER_DATE AMOUNT
———- ———– ———- ———-
3 3 2026-03-15 3000
4 4 2026-04-15 4000
Elapsed: 00:00:00.00
# 4. 优化外部表访问参数
# 创建带预处理器的外部表
SQL> CREATE TABLE fgedu.external_orders_gz (
2 order_id NUMBER,
3 customer_id NUMBER,
4 order_date DATE,
5 amount NUMBER
6 ) ORGANIZATION EXTERNAL (
7 TYPE ORACLE_LOADER
8 DEFAULT DIRECTORY external_dir
9 ACCESS PARAMETERS (
10 RECORDS DELIMITED BY NEWLINE
11 FIELDS TERMINATED BY ‘,’
12 MISSING FIELD VALUES ARE NULL
13 PREPROCESSOR external_dir:’gunzip.sh’
14 (order_id, customer_id, order_date DATE ‘YYYY-MM-DD’, amount)
15 )
16 LOCATION (‘orders.csv.gz’)
17 );
# 5. 创建预处理器脚本
$ echo “#!/bin/sh” > /backup/external/gunzip.sh
$ echo “gunzip -c $1” >> /backup/external/gunzip.sh
$ chmod +x /backup/external/gunzip.sh
# 6. 测试压缩文件的外部表访问
$ gzip /backup/external/orders.csv
$ mv /backup/external/orders.csv.gz /backup/external/orders.csv.gz
SQL> SELECT * FROM fgedu.external_orders_gz;
ORDER_ID CUSTOMER_ID ORDER_DATE AMOUNT
———- ———– ———- ———-
1 1 2026-01-15 1000
2 2 2026-02-15 2000
3 3 2026-03-15 3000
4 4 2026-04-15 4000
# 7. 验证调优效果
# 执行查询,比较性能
SQL> EXPLAIN PLAN FOR SELECT * FROM fgedu.external_orders_parallel WHERE amount > 2000;
Explained.
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
PLAN_TABLE_OUTPUT
————————————————————————–
Plan hash value: 3912729313
————————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
————————————————————————–
| 0 | SELECT STATEMENT | | 2 | 36 | 3 (0)| 00:00:01 | | | |
| 1 | PX COORDINATOR | | | | | | | | |
| 2 | PX SEND QC (RANDOM)| :TQ10000 | 2 | 36 | 3 (0)| 00:00:01 | Q1 | P->S | QC (RAND) |
| 3 | PX BLOCK ITERATOR | | 2 | 36 | 3 (0)| 00:00:01 | Q1 | PCWC | |
| 4 | TABLE ACCESS FULL| EXTERNAL_ORDERS_PARALLEL| 2 | 36 | 3 (0)| 00:00:01 | Q1 | PCWP | |
————————————————————————–
Note
—– – dynamic statistics used: dynamic sampling (level=2)
# 8. 测试大批量数据的外部表性能
# 创建大文件
$ for i in {1..10000}; do echo “$i,$((i%1000+1)),2026-01-01,$((i*10))” >> /backup/external/large_orders.csv; done
# 创建外部表
SQL> CREATE TABLE fgedu.external_large_orders (
2 order_id NUMBER,
3 customer_id NUMBER,
4 order_date DATE,
5 amount NUMBER
6 ) ORGANIZATION EXTERNAL (
7 TYPE ORACLE_LOADER
8 DEFAULT DIRECTORY external_dir
9 ACCESS PARAMETERS (
10 RECORDS DELIMITED BY NEWLINE
11 FIELDS TERMINATED BY ‘,’
12 MISSING FIELD VALUES ARE NULL
13 (order_id, customer_id, order_date DATE ‘YYYY-MM-DD’, amount)
14 )
15 LOCATION (‘large_orders.csv’)
16 ) PARALLEL 8;
# 9. 测试查询性能
SQL> SET TIMING ON
SQL> SELECT COUNT(*) FROM fgedu.external_large_orders;
COUNT(*)
———-
10000
Elapsed: 00:00:00.05
SQL> SELECT customer_id, SUM(amount) total_amount FROM fgedu.external_large_orders GROUP BY customer_id;
CUSTOMER_ID TOTAL_AMOUNT
———– ————
1 50050
2 100100
3 150150
…
1000 5005000
Elapsed: 00:00:00.10
Part05-风哥经验总结与分享
5.1 外部表调优最佳实践
- 选择合适的外部表类型:根据数据特点选择合适的外部表类型
- 优化外部表定义:优化外部表的访问参数和并行度
- 定期监控:定期监控外部表使用情况,及时发现问题
- 分析瓶颈:分析外部表性能的瓶颈,采取相应的措施
- 持续优化:根据数据量和访问模式持续优化外部表配置
5.2 外部表调优注意事项
- 根据数据特点选择合适的外部表类型
- 优化外部表定义,提高访问效率
- 定期监控外部表使用情况,及时发现问题
- 结合其他性能工具,全面分析外部表性能
- 与开发团队分享外部表调优结果,提高应用程序性能
5.3 外部表调优建议
- 建立外部表调优流程,定期执行外部表配置和分析
- 培训DBA,提高外部表管理能力
- 建立外部表调优结果的审核机制
- 跟踪外部表使用的变化趋势
- 与Oracle支持团队保持沟通,获取外部表调优的最佳实践
更多视频教程www.fgedu.net.cn
更多学习教程公众号风哥教程itpux_com
from oracle:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
