graph TD
A[会话查询外部表] --> B{是否符合智能扫描条件?}
B -->|是| C[存储节点读取文件]
C --> D[应用谓词过滤和列投影]
D --> E[仅返回有效数据到PGA]
E --> F[记录cell external table smart scan事件]
B -->|否| G[全文件传输到DB节点]
关键特性
绕过Buffer Cache:数据直接进入PGA,减少内存开销。
依赖存储索引:若存储索引(Storage Index)生效,可跳过无关数据块。
三大前提:
全扫描操作(FULL SCAN)
直接路径读取(Direct Path Read)
外部表文件位于Exadata存储。
🔍 二、产生过程与典型场景
1. 智能扫描触发流程
SQL解析:优化器选择全扫描访问路径。
智能扫描检查:
参数cell_offload_processing=TRUE(默认开启)
文件位于Exadata存储
非时区升级模式(DST_UPGRADE_STATE=NONE)
存储节点处理:
读取外部文件(如CSV)
应用WHERE条件过滤行
投影SELECT所需的列
结果返回:仅有效数据通过InfiniBand网络传输到数据库节点。
2. 典型高发场景
场景
案例说明
日志分析
外部表查询GB级日志文件,应用正则表达式过滤
批量数据加载
通过外部表将CSV导入数据库,执行复杂转换
跨平台数据交换
外部表访问HDFS或对象存储中的文件(需Exadata兼容配置)
实时监控数据流
持续查询新增的日志文件(如tail -f模式)
⚠️ 三、根本原因分析
1. 智能扫描未触发
原因
检测方法
影响
时区升级模式
SELECT property_value FROM database_properties WHERE property_name='DST_UPGRADE_STATE'; ≠ ‘NONE’
智能扫描完全禁用
参数关闭
SHOW PARAMETER cell_offload_processing = FALSE
智能扫描不生效
文件位置不符
外部表文件未放在Exadata存储(如NFS挂载非Cell)
无法下推计算
Quarantine隔离
v$sysstat中cell physical IO bytes eligible for predicate offload不增加
SELECT event, total_waits, time_waited_micro
FROM v$session_event
WHERE sid =&sid AND event ='cell external table smart scan';
步骤2:诊断存储节点处理效率
-- 检查存储节点状态SELECT cell_name,status, cpu_utilization, flash_cache_usage
FROM v$cell_state
WHERE cpu_utilization >80;-- CPU >80%可能触发反向卸载-- 检查时区与QuarantineSELECT name,valueFROM v$sysstat
WHERE name LIKE'%quarantine%'OR name LIKE'%timezone%';
步骤3:分析外部表配置
-- 检查外部表定义SELECT owner, table_name, directory_name, access_parameters
FROM dba_external_tables
WHERE table_name ='&EXT_TABLE';-- 验证存储索引SELECT name,valueFROM v$mystat
WHERE name IN('cell physical IO bytes saved by storage index');-- 若value=0 表示存储索引未生效