1. 首页 > Oracle教程 > 正文

Oracle教程FG321-Oracle外部表调优实战

内容大纲

内容简介:本文主要介绍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 外部表配置与管理

# 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 外部表监控

# 1. 查看外部表信息
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 外部表调优

# 1. 分析外部表使用情况
# 查看外部表配置和使用情况

# 2. 优化外部表定义
# 根据分析结果优化外部表定义

# 3. 调整外部表配置
# 根据分析结果调整外部表配置

# 4. 验证调优效果
# 查看调优后的外部表使用情况

3.4 外部表调优结果管理

# 1. 保存外部表调优历史数据
# 将外部表使用情况保存到表中,用于后续分析

# 2. 建立外部表调优的审核机制
# 定期审核外部表使用情况,确保外部表资源的合理使用

# 3. 跟踪外部表使用的变化趋势
# 分析外部表使用的变化趋势,预测外部表需求

# 4. 分析外部表性能的瓶颈
# 识别外部表性能的瓶颈,采取相应的措施

# 5. 与开发团队分享外部表调优结果
# 提供外部表调优结果给开发团队,帮助优化应用程序

Part04-生产案例与实战讲解

4.1 外部表配置与管理实战

# 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 外部表监控与分析实战

# 1. 查看外部表信息
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 外部表调优实战

# 1. 分析外部表使用情况
# 查看外部表配置和使用情况

# 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

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息