简介:这是一份关于Oracle一体机(Oracle Database Appliance)的专题介绍PPT,发布于2021年3月,适合数据库管理员、系统架构师及企业IT决策者快速了解其产品定位与核心价值。内容围绕ODA的设计思想、架构演进、技术特性、性能优势与典型应用场景展开,清晰梳理了从X3-2到X8-2各代产品的规格变化,并给出与传统x86方案在部署时间、维护成本及事务处理能力等方面的实测对比数据,可作为数据库一体化选型评估和内部培训的基础参考。资源包大小为6.66MB,仅含1个pptx演示文稿,内容组织紧凑,便于直接阅读或二次编辑。目前已有472人学习浏览,适合需要快速建立Oracle一体机整体认知、关注数据库一体化交付方案的技术人员下载研读。
1. 一体机不是一台机器:先用一句话说清它是什么
很多人第一次听到“Oracle一体机”这个名字,下意识以为是一台配置特别高的服务器。实际上,它是一整套软硬件深度集成的数据库平台,行业里更习惯叫它 Exadata。2021 年初的那次更新,也就是标题里那个 202103 对应的版本节点,核心是把数据库计算节点、智能存储节点和 InfiniBand 内部网络打包成一个交付单元,你拿到的不是一台机器,而是一整个机柜。
这套东西解决的核心问题很直接:当数据库的 SQL 扫描量从 GB 级涨到 TB 级时,传统架构里存储和数据库之间的流量会成为瓶颈,而 Exadata 把过滤、压缩、索引这些活下推到存储节点去做,让数据在到达数据库之前就已经被“瘦身”过一遍。适合谁用?两类人最值得看——被大查询和 IO 延迟折磨得想换架构的 DBA,以及正在做数据库选型、需要在普通服务器方案和一体机方案之间做成本对比的技术负责人。这篇文章不聊厂商 PPT 里的宣传指标,只讲它到底怎么工作、部署时怎么做、哪些参数必须调、以及那些只有上了生产环境才会发现的坑。
2. 为什么 Exadata 跑大查询快:存储端干了数据库的活
2.1 智能扫描不是缓存,是把 WHERE 下推给了磁盘
传统数据库架构里,一条SELECT COUNT(*) FROM orders WHERE status='P'的语句,数据库进程会把整张表的数据块从存储读到 Buffer Cache,再在数据库层面逐行过滤。表越大,磁盘到数据库之间的流量越大,数据库 CPU 越忙。Exadata 的做法完全不同:它把过滤条件直接下发到存储节点,存储节点上的 CELLSRV 进程在读取数据块时顺手就把不满足条件的数据丢弃,只把命中的行返回给数据库。
这个机制叫 Smart Scan(智能扫描),但它不是缓存——缓存是热数据的重复命中,Smart Scan 是让每一份被读出来的数据都变“轻”。你在 SQL 的执行计划里看到TABLE ACCESS STORAGE FULL而不是普通的TABLE ACCESS FULL,说明扫描已经被下推到存储层了。判断智能扫描是否真正生效,不能只看执行计划,还要看 Exadata 的统计视图或者cellcli里的响应时间分解,这一步后面避坑章节会细说。
2.2 存储索引和 HCC 压缩:两个容易被低估的加速器
除了 Smart Scan,一体机上还有两个特性在日常查询里贡献巨大。第一个是存储索引,它不占额外空间,只是在存储节点内存里维护每个存储区域(1MB 粒度)的最小值和最大值。当查询条件里有等值或范围过滤时,存储节点能直接跳过那些值不在范围内的区域。比如按订单日期查最近一天的数据,如果日期列有存储索引,扫描量可能直接从几 TB 降到几十 GB,而且完全不用你建任何数据库索引。
第二个是 HCC(混合列压缩)。它和普通压缩的最大区别是压缩比高得离谱,尤其适合数仓里只读的归档表。一张 1TB 的事实表,用 HCC Query High 压缩后可能只剩 150GB 左右,而且因为数据块变小,全表扫描需要读的 IO 也变少了。但 HCC 有个代价:数据块在插入后不支持直接 UPDATE 和 DELETE,任何修改都会触发解压重写,性能会断崖式下跌。所以生产环境里,HCC 只用在分区表的历史分区或者只读表上,OLTP 表千万不能碰。
2.3 一体机的性能公式:CPU + 内存 + IO 路径一起变快
Exadata 性能好,不是某一个部件强,而是整条数据路径没有短板。计算节点跑的是 Oracle 数据库软件,和普通服务器上的数据库没有任何区别,但存储节点上的 Exadata 软件把扫描、解压、加密、过滤全都卸载到了存储端。数据库节点的 CPU 不再消耗在大表扫描上,而是专注做复杂连接和排序;存储节点的 CPU 专门处理数据筛选。配合 InfiniBand 内部网络,把传统的 SCSI 存储协议换成了类 RDMA 的消息传递,单次 IO 的延迟更低,并发吞吐更高。
所以你要评估一体机适不适合自己的业务,核心问题不是“它快不快”,而是“我的负载是不是 IO 敏感型”。如果跑的是银行核心交易,每次查询都是走索引取几十行,那 Exadata 的优势发挥不出来;如果跑的是数仓报表、日志分析、批量加工,SQL 动不动就全表扫描几亿行,那才是它真正的主场。
3. 从拆箱到跑业务:部署一体机的完整路径与参数设置
3.1 规划配置:先算存储,再算计算,最后算网络
拿到一台 Exadata X 系列(X7、X8M、X9M 这些代际)之前,先做容量规划。常见做法是:先根据数据量定存储节点数量,再根据并发和 CPU 需求定数据库节点数量,最后看一眼 InfiniBand 网络的端口规划。数据库节点会跑操作系统和 Oracle Grid Infrastructure,存储节点跑 Exadata 存储软件,两者之间通过内部 IB 网络互通,外部应用通过客户端网络(一般是万兆以太网)访问数据库服务。
这里有个新手容易困惑的点:存储节点上的磁盘,不是直接格式化成文件系统给数据库用的。它要先划分成CELLDISK,然后在CELLDISK上建GRIDDISK,多块GRIDDISK组成 ASM 磁盘组,数据库文件最终落在 ASM 里。所以你规划磁盘时要想清楚:哪些盘给 DATA 磁盘组,哪些给 RECO 磁盘组,哪些留给闪存。我一般会把容量最大的盘放 DATA,RECO 至少留 20% 到 30% 容量,闪存盘优先分给FLASHCACHE,剩余空间做FLASHLOG。
3.2 初始化存储节点:用 cellcli 完成底层配置
部署的第一步是给存储节点装 Exadata 存储软件(出厂预装,一般不用手动装),然后逐台执行cellcli命令完成配置。以下是在存储节点上执行的操作,代表“从裸机状态到可以使用的存储池”的完整步骤。
# 查看当前存储节点的 cell 名称和状态 cellcli -e LIST CELL ATTRIBUTES name, status # 启动 cell 服务,如果状态不是 online 则需要手工拉起 cellcli -e ALTER CELL STARTUP SERVICES # 列出所有物理磁盘,确认磁盘类型和大小 cellcli -e LIST PHYSICALDISK # 将所有 3TB 的磁盘创建为 cell disk cellcli -e CREATE CELLDISK ALL # 查看创建的 cell disk 列表,确认大小正确 cellcli -e LIST CELLDISK # 在 cell disk 上创建 grid disk,assign 给所在计算节点 cellcli -e CREATE GRIDDISK ALL # 确认 grid disk 状态,active 表示可以正常使用 cellcli -e LIST GRIDDISK每个命令的逻辑:LIST CELL ATTRIBUTES是基础体检,确认存储节点自身健康;ALTER CELL STARTUP SERVICES拉起存储服务,这一步如果失败,后续所有命令都跑不了;CREATE CELLDISK ALL把物理磁盘转成 Exadata 可管理的存储单元,相当于给磁盘做了格式化;CREATE GRIDDISK ALL是在 cell disk 之上创建 ASM 能识别的卷。参数层面,CREATE GRIDDISK默认会按配置把所有空间分配给 grid disk,但如果你闪存盘要留空间给FLASHCACHE,需要先用以下命令预留。
# 给闪存盘配置 flashcache 和 flashlog 大小 cellcli -e ALTER CELL FLASHCACHE MODE=WRITEBACK # 查看 flashcache 状态,确认 writeback 模式生效 cellcli -e LIST FLASHCACHE DETAIL闪存盘在这里扮演的角色是临时加速层:FLASHCACHE用 writeback 模式缓存频繁读取的数据块,FLASHLOG缓存重做日志的写入,等磁盘空闲再刷下去。生产环境我推荐把闪存盘的 80% 分给FLASHCACHE,20% 分给FLASHLOG,因为重做日志写入往往是 OLTP 型业务的性能瓶颈,这部分空间不能省。
3.3 在计算节点上创建 ASM 磁盘组并安装数据库软件
存储节点配好后,回到计算节点操作。计算节点上已经装好了 Oracle Grid Infrastructure 和数据库软件,你需要做的是把 3.2 里创建的 grid disk 注册到 ASM 实例,然后建磁盘组。以下操作在计算节点上执行,使用asmcmd和sqlplus两个工具。
# 以 grid 用户登录,启动 ASM 实例 su - grid sqlplus / as sysasm -- 查看 ASM 实例当前识别到的候选磁盘 SELECT path, name, header_status FROM v$asm_disk; -- 创建 DATA 磁盘组,normal redundancy,使用 DATA 前缀的 grid disk CREATE DISKGROUP DATA NORMAL REDUNDANCY DISK '/dev/oracleasm/disks/DATA*' ATTRIBUTE 'compatible.asm'='19.0.0.0.0', 'compatible.rdbms'='19.0.0.0.0'; -- 创建 RECO 磁盘组,normal redundancy,用于快速恢复区和归档 CREATE DISKGROUP RECO NORMAL REDUNDANCY DISK '/dev/oracleasm/disks/RECO*' ATTRIBUTE 'compatible.asm'='19.0.0.0.0', 'compatible.rdbms'='19.0.0.0.0'; -- 检查磁盘组状态和数据分布 SELECT name, state, type, total_mb, free_mb FROM v$asm_diskgroup;上述 SQL 的逻辑:v$asm_disk用来确认 grid disk 是否被 ASM 正确识别,header_status必须是CANDIDATE或FORMER才能被建组。CREATE DISKGROUP里NORMAL REDUNDANCY意味着每份数据有两份拷贝,能容忍一个盘故障,这是在性能和容错之间的平衡点;compatible参数必须和数据库版本匹配,如果用 19c,就设成 19.0.0.0.0,默认值在新版本里已经够用,但手动指定能避免后续升级时出现兼容性告警。
磁盘组建好之后,数据库软件和实例的创建就和你在一台普通 Linux 服务器上装单实例数据库没有区别了,用dbca(Database Configuration Assistant)静默模式或者图形界面一步步走完即可。区别只在于:所有的数据文件、控制文件、在线日志都要指定到+DATA和+RECO这两个磁盘组,千万不要再写本地路径。如果项目里原本就有一套数据库要迁移过来,这一步就是选好迁移工具(Data Guard、EXPDP 或云迁移)把数据“搬”进 ASM。
3.4 数据库参数和初始化:几个必须动手改的默认值
数据库创建完成后,有一套参数在一体机环境下建议立即调整。下面这段 SQL 是在 19c 单实例数据库上执行的参数调整脚本,每一条都对应一个具体的资源策略。
-- 以 sysdba 身份执行 ALTER SYSTEM SET db_cache_advice=ON; ALTER SYSTEM SET result_cache_mode=MANUAL; ALTER SYSTEM SET parallel_degree_policy=AUTO; ALTER SYSTEM SET parallel_servers_target=64; ALTER SYSTEM SET db_files=2000 SCOPE=BOTH; ALTER SYSTEM SET open_cursors=2000 SCOPE=BOTH; ALTER SYSTEM SET processes=2000 SCOPE=SPFILE; ALTER SYSTEM SET sessions=2200 SCOPE=SPFILE; ALTER SYSTEM SET sga_max_size=32G SCOPE=SPFILE; ALTER SYSTEM SET sga_target=32G; ALTER SYSTEM SET pga_aggregate_target=16G; ALTER SYSTEM SET optimizer_adaptive_cursor_sharing=FALSE; ALTER SYSTEM SET optimizer_adaptive_plans=TRUE; ALTER SYSTEM SET "_flashback_verbose_redo"=FALSE;这些参数里,parallel_degree_policy=AUTO和parallel_servers_target=64和一体机最相关——Exadata 的智能扫描天然依赖并行查询,并行度设太低会导致存储端没有足够的扫描进程,设太高又会让计算节点 CPU 爆掉;processes和sessions是基础的连接容量,生产环境默认 150 绝对不够;sga_max_size要和机器物理内存对应,一体机数据库节点往往有 384GB 或 768GB 内存,SGA 只给 8GB 属于暴殄天物。这些参数改完后需要重启数据库实例才能让SCOPE=SPFILE的那几个生效。
4. 日常运维是一体机最值钱的部分:监控命令和备份恢复路径
4.1 存储节点健康检查:celcli 里最常用的三组命令
一体机的存储节点是一个跑 Linux 的独立计算单元,通过celcli命令行管理。日常巡检时,我一般会先在每个 cell 上执行三件事:看存储服务状态、看磁盘闪存健康、看最近有没有硬件告警。下面这套命令可以固化成一个运维脚本,每周跑一次。
# 1. 检查所有存储节点的服务状态 cellcli -e LIST CELL SERVICES # 2. 检查物理磁盘状态,Normal 表示健康,Predictive Failure 表示预警 cellcli -e LIST PHYSICALDISK ATTRIBUTES name, status, errcount # 3. 检查闪存设备是否有磨损或故障 cellcli -e LIST FLASHDEVICE ATTRIBUTES name, status, errcount # 4. 查看 cell 是否有硬件告警事件 cellcli -e LIST ALERT HISTORY # 5. 查看闪存缓存命中率,判断 flashcache 是否正常工作 cellcli -e LIST METRICDEF FLASH_CACHE_HIT_RATIO这套命令的价值在于,它能让你在业务出现性能问题之前就发现隐患。ERROOUNT字段如果持续增长,说明磁盘正在频繁重试,即便 SMART 状态还没报故障,也离坏不远了;LIST ALERT HISTORY会显示过去一段时间内的硬件事件,比如某个 InfiniBand 端口的链路抖动,这种问题在传统架构里要等业务感知到才能发现,在一体机上存储节点会直接记日志。
4.2 备份恢复:RMAN 和 Data Guard 谁负责什么
一体机最大的风险是硬件故障时数据不可用,所以在部署规划阶段就要把备份策略想清楚。RMAN 负责备份到外部存储或磁盘;Data Guard 负责实时同步一份数据到备库;两者不是替代关系,而是互补关系。RMAN 解决的是“数据被人为删了或逻辑损坏”的问题,Data Guard 解决的是“物理存储整个挂掉”的问题。
备份配置的核心工作是设置快速恢复区并启动自动备份策略。以下 SQL 在数据库里配置 RMAN 备份策略,备份目标指向 RECO 磁盘组:
-- 设置快速恢复区位置和大小 ALTER SYSTEM SET db_recovery_file_dest='+RECO'; ALTER SYSTEM SET db_recovery_file_dest_size=1000G SCOPE=BOTH; -- 控制文件自动备份开启,防止丢控制文件后无法恢复 ALTER SYSTEM SET controlfile_autobackup=ON; -- 开启归档模式(如果还没开启) SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER DATABASE ARCHIVELOG; ALTER DATABASE OPEN; -- 使用 RMAN 配置自动备份策略 RMAN TARGET /; CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS; CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO DISK; CONFIGURE CONTROLFILE AUTOBACKUP ON; CONFIGURE BACKUP OPTIMIZATION ON; BACKUP DATABASE PLUS ARCHIVELOG TAG 'weekly_full';这里的RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS意味着数据库可以恢复到 7 天内的任意时间点;ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO DISK表示归档日志只要备份过一次就可以从磁盘删除,避免 RECO 空间被归档撑爆。每周一次全备加每天一次归档备份是大多数项目的基础配置,如果数据量特别大,可以在两者之间加增量备份。
4.3 高可用架构:从单机到 RAC 的升级路径
很多项目最初部署一体机时只买了两个数据库节点,但只跑了一个单实例。这种情况下数据库节点挂了,存储节点还在,但数据库服务中断,业务不可用。正确的做法是利用一体机自带的两个数据库节点做 Oracle RAC,两个节点同时对外提供服务,任何一个节点宕机,另一个节点接管所有连接和会话,实现秒级切换。
RAC 的搭建在 Exadata 上比普通服务器简单得多——因为 Grid Infrastructure 的安装包已经预置,ASM 磁盘组也已经建好,只需要用asmca添加集群件、配置节点间互信、再用dbca创建 RAC 数据库即可。以下几个命令和参数是建 RAC 时必须注意的:
# 在两个节点上分别验证节点间互信 su - grid ssh equinox1 hostname ssh equinox2 hostname # 验证 SCAN 地址的 DNS 解析 nslookup scan-cluster.example.com # 给集群件配置扫描地址 /sbin/ipaddr add 192.168.1.100/24 dev bond0 # 查看集群服务状态,确保 css 和 crs 进程在线 crsctl status resource -tRAC 部署里最常翻车的点是SCAN地址的解析:每台客户端机器都必须能把 SCAN 名字解析到三个 IP(如果配置了三个 SCAN IP),且不能和任何节点 IP 冲突。数据库节点上的/etc/hosts需要同时包含两个节点名和三个 SCAN 名,缺一个都会导致集群件在启动阶段报CRS-0184或ORA-00603。如果 DNS 环境不熟悉,最简单的做法是把 SCAN 的记录也写进两台节点的/etc/hosts,虽然不够“标准”,但稳定可靠。
5. 常见问题与避坑:部署和运维中反复出现的 5 个坑
5.1 Smart Scan 没有生效,SQL 还是走全表扫描并拖垮 IO
现象:SQL 执行计划里明明显示TABLE ACCESS STORAGE FULL,但存储节点的读取量没有下降,数据库节点 CPU 仍被打满。原因:Exadata 的智能扫描只在满足特定条件下才启用——例如查询里不能用DECODE这类隐式转换函数包裹过滤列,也不能有TRUNC(date_col)这类对索引列做函数的过滤;更常见的原因是数据库参数cell_offload_processing被人为设成了 FALSE。
解决:先确认参数,再逐条排查 SQL 写法。
-- 检查是否启用了 cell offload SHOW PARAMETER cell_offload_processing; -- 如果 FALSE,立即改回来 ALTER SYSTEM SET cell_offload_processing=TRUE SCOPE=BOTH; -- 查看 SQL 执行计划里是否出现 STORAGE 关键字 EXPLAIN PLAN FOR SELECT /*+ OPT_PARAM('cell_offload_processing' 'true') */ COUNT(*) FROM sales WHERE channel_id='R';另一个隐蔽原因是索引问题:即便 Smart Scan 理论上不需要数据库索引,但当查询走了普通索引访问路径时,Offload 会被禁用。解决方法是让 CBO 放弃索引路径,改用全表扫描并配合存储索引。这种“看起来是倒车,实际是超车”的优化,在一体机上很多见。碰到 SQL 慢,第一反应不是加索引,而是确认它是否走了STORAGE FULL。
5.2 HCC 压缩表上的 DML 让性能瞬间崩塌
现象:一张 HCC 压缩的表,平时SELECT很快,但偶尔一次UPDATE一个字段,数据库就像是卡死了,会话长时间阻塞,业务大面积超时。原因:HCC 的一个块里压缩了成百上千行,任意一行修改,Oracle 都要把整个块解压、修改、重新压缩,期间还会触发行迁移和块重组,锁竞争被无限放大。这也是很多从传统数据库迁移到一体机的团队最容易翻车的地方。
解决:对 HCC 表做约束——只允许在维护窗口做 DML,平时只读。做法是把 HCC 用于分区表的历史分区,而不用于主表。比如订单表按月份分区,最近三个月用普通 OLTP 存储,更早的分区定期转换成 HCC:
-- 把一个分区从普通堆表压缩转为 HCC Query High 压缩 ALTER TABLE orders MOVE PARTITION p2020q4 TABLESPACE +DATA COMPRESS FOR QUERY HIGH;如果业务实在需要更新 HCC 表,至少要在更新前先把受影响的分区解压(ALTER TABLE ... MOVE PARTITION ... NOCOMPRESS),更新完成后再转回 HCC。把这个流程写进变更脚本,形成标准操作,别让开发在正常业务里直接UPDATEHCC 表。
5.3 磁盘组空间告警,但 ASM 显示磁盘还有很多空闲
现象:v$asm_diskgroup显示FREE_MB还有 30%,但数据库报ORA-1699: cannot allocate extent无法扩展数据文件。原因:ASM 磁盘组是区组(Extent Map)分配粒度较粗的单位——当磁盘组里每个磁盘的可用空间分布不均时,ASM 无法在某个特定磁盘上找到足够大的连续区域分配给扩展的数据文件。
解决:登录 ASM 实例,查磁盘组的可用空间分布,然后对表空间做空间重平衡:
-- 查看每个磁盘的可用空间 SELECT d.name, d.free_mb, d.total_mb, d.state FROM v$asm_disk d WHERE d.group_number=1 ORDER BY d.name; -- 如果某块盘 free_mb 明显偏少,触发一次重新平衡 ALTER DISKGROUP DATA REBALANCE POWER 5;这个坑在 Exadata 上尤其容易踩,因为 grid disk 是按固定大小创建的,一块物理盘故障替换后,新盘的容量可能和旧盘不同,时间一长各个盘的占用率会出现明显倾斜。预防手段是在创建磁盘组时就使用HIGH或NORMAL冗余,并定期检查各盘占用偏差,超过 15% 就做一次 rebalance。别等业务报错再去救火,那会儿往往已经晚了。
5.4 重启数据库节点后,存储节点上的连接全部卡住
现象:计算节点一次计划内重启,重启后应用连库一切正常,但过了一段时间后存储节点的cellcli命令开始超时,比如LIST GRIDDISK要十几秒才返回。原因:一体机的计算节点和存储节点之间靠 InfiniBand 通信,重启计算节点时 IB 链路会断开再重连,部分存储节点上的服务进程在处理断连时没有正确释放资源,导致连接堆积、后续请求排长队。
解决:不要在业务高峰期重启数据库节点。如果一定要重启,按顺序操作——先crsctl stop crs停掉数据库节点上的集群件,等两个节点的clusterware都停稳后再对存储节点做健康检查;重启后不要立刻做大量 IO 操作,先观察cellcli -e LIST CELL SERVICES的连接数是否恢复正常。另外,给所有服务器的 IB 网卡驱动和固件保持在同一个补丁基线内,固件版本不一致也会导致链路重建时出现诡异的握手失败。
5.512c 删除不干净与Oracle 等保命令引出的话题:软件打补丁的正确姿势
现象:有人在一体机上装过 12c 的数据库软件,卸载不干净,注册表、文件系统残留了一堆东西,之后再装 19c 时总报环境检查不通过。原因:Oracle 的安装程序(OUI)卸载功能只删除软件本身,不清理oraInventory里的注册信息,也不删/u01/app/oracle下的残留目录。
解决:手工清理再重装,步骤比想象的繁琐,但必须每一步都做:
# 以 root 用户清理软件目录 rm -rf /u01/app/oracle/product/19.0.0/dbhome_1 rm -rf /u01/app/grid/product/19.0.0/gridhome_1 rm -rf /u01/app/grid/crsdata rm -rf /u01/app/oracle/diag rm -rf /u01/app/oraInventory # 清理动态库和内核参数残留 rm -rf /etc/oraInst.loc rm -rf /etc/oracle sed -i '/ORACLE_HOME/d' /etc/profile sed -i '/ORACLE_BASE/d' /etc/profile在 Exadata 上,补丁和软件安装统一用opatchauto管理,它会把数据库节点和存储节点的补丁统一打到同一版本。一体机环境里最忌讳的就是在数据库节点上手动rpm -ivh安装补丁包,这会破坏整套软件的一致性。你只需要执行opatchauto apply /path/to/patch,它会自动把补丁应用到所有节点。等保场景里要求的安全加固命令,也建议在一体机上通过opatchauto写入基线脚本,而不是在每个节点上手工操作,这样既满足合规要求,又不会引入配置漂移。
6. 验证一体机投入价值:一套可以复制的性能基线测试法
买了这么贵的设备,如何向老板证明钱花得值?光靠业务报表“感觉变快了”是不够的,要在上线前做一轮标准性能基线测试,留下数据,后续容量规划和性能优化才有据可依。
我的做法是用swingbench或者 Oracle 自带的sh工具,在一体机上跑一套标准的 TPC-C 型负载,同时采集数据库节点 CPU、存储节点 IO、Smart Scan 命中率、SQL 响应时间四组数据。具体步骤是先构建一张 10 亿行的大表,然后跑几条典型的聚合查询和关联查询,分别记录开启和关闭 Smart Scan 时的响应时间差距。以下 SQL 可以快速制造一个测试场景:
-- 创建一张 5 亿行测试表,空间换时间 CREATE TABLE big_test AS SELECT ROWNUM id, MOD(ROWNUM,1000) channel_id, SYSDATE - ROWNUM/1000 create_date, DBMS_RANDOM.STRING('A',100) payload FROM DUAL CONNECT BY LEVEL <= 500000000; -- 收集统计信息,避免 CBO 猜错基数 EXEC DBMS_STATS.GATHER_TABLE_STATS(NULL,'BIG_TEST'); -- 测试聚合扫描:预期走 STORAGE FULL,响应时间应在秒级 SELECT channel_id, COUNT(*) FROM big_test WHERE create_date BETWEEN SYSDATE-30 AND SYSDATE GROUP BY channel_id;测试时把cell_offload_processing临时设为FALSE再跑一遍同样的 SQL,对比两次的时间差。如果时间差在 5 倍以上,说明智能扫描的效果明显;如果在 1.2 倍以内,说明你的查询根本没有触发大规模扫描,一体机的价值就不在查询加速上,而在于它的 IO 延迟和并发处理能力,需要换用小事务型测试负载重新验证。
我的最后一条习惯是:测试完之后立刻把参数改回TRUE,并把测试表的数据清掉,别留在生产环境占用磁盘空间。踩过的坑是有人把测试表漏删,结果容量规划时多出 500GB 数据,磁盘组告警又折腾了两天。所有性能验证的结果、参数截图、执行计划、测试时间,都归档到运维文档里,作为后续版本升级、业务扩容时的基准参照。多花半小时做这轮验证,后面谈预算、谈扩容、谈架构调整,每一回都用得上。希望帮到你。
本文还有配套的精品资源,点击获取