调整CentOS内核参数以提升Oracle对系统资源的使用效率,关键参数包括:
fs.file-max = 6815744(允许Oracle打开更多文件);kernel.shmmax = $(free|grep Mem|awk '{print int($2*1024*0.85)}')(设置为物理内存的85%,用于SGA);kernel.sem = 250 32000 100 128(提升进程间通信效率);net.ipv4.ip_local_port_range = 9000 65500(扩大客户端连接端口范围)、net.core.rmem_default/net.core.wmem_default = 262144/262144(调整网络缓冲区大小);vm.swappiness = 10(降低交换分区使用频率,优先使用物理内存)。sysctl -p使参数生效。noatime,nodiratime选项(减少文件访问时间更新的开销);systemctl stop firewalld)、SELinux(setenforce 0)及非核心服务(如Postfix、Avahi),减少系统资源竞争。Oracle内存结构(SGA+PGA)是性能核心,需根据系统负载合理分配:
SGA是实例共享内存区,包含**数据缓冲区(Database Buffer Cache)、共享池(Shared Pool)、重做日志缓冲区(Log Buffer)**等组件。
1 - (physical_reads / (db_block_gets + consistent_gets)))。若命中率低,可增大db_cache_size(如ALTER SYSTEM SET db_cache_size=4G SCOPE=BOTH;);shared_pool_size(如ALTER SYSTEM SET shared_pool_size=2G SCOPE=BOTH;),避免硬解析(可通过v$sqlarea视图查看重复SQL);MEMORY_TARGET(总内存)和MEMORY_MAX_TARGET(上限)参数,让Oracle自动分配SGA与PGA。例如,16GB物理内存的服务器可设置MEMORY_MAX_TARGET=13G、MEMORY_TARGET=12.8G,并将SGA_TARGET、PGA_AGGREGATE_TARGET设为0(需重启实例)。PGA是进程私有内存区,用于排序、哈希连接等操作,设置pga_aggregate_target(如ALTER SYSTEM SET pga_aggregate_target=2G SCOPE=BOTH;)。OLTP系统(高并发短事务)可设置为Oracle内存的20%,DSS系统(复杂查询)可设置为50%-70%。
SQL是数据库性能的“牛鼻子”,优化重点在于减少资源消耗:
CREATE INDEX idx_emp_name ON employees(name););EXPLAIN PLAN分析SQL执行计划,避免“TABLE ACCESS FULL”(全表扫描);WHERE UPPER(name)='JOHN'会导致索引失效)、使用绑定变量(如:name代替硬编码值),减少硬解析。SELECT *,明确列出所需列(减少数据传输量);SELECT a.* FROM table_a a JOIN table_b b ON a.id=b.id WHERE b.status=1);FORALL语句)替代循环单条插入,减少事务开销。索引是提升查询性能的关键,但过度索引会影响DML(增删改)性能:
ORDER BY)、连接列(JOIN)创建索引;CREATE INDEX idx_emp_dept ON employees(dept_id, salary);,注意列顺序需匹配查询条件)。ALTER INDEX idx_emp_name REBUILD;),提升索引访问效率;v$object_usage视图查看索引使用情况),减少索引维护开销。I/O是Oracle性能的“瓶颈”,优化目标是减少磁盘等待时间:
使用SSD/NVMe替代机械硬盘(HDD),提升随机读写性能(SSD的IOPS可达数万,而HDD仅为数百)。
lvcreate -i 4 -I 64 -L 100G -n lv_oradata vg_oracle,将数据分散到4块磁盘),实现并行I/O;/u01/oradata,重做日志放在/u02/redo);/u03/archive);temp放在/u04/temp)。定期维护是保持性能稳定的关键:
统计信息是优化器生成高效执行计划的基础,定期执行DBMS_STATS.GATHER_SCHEMA_STATS(如EXEC DBMS_STATS.GATHER_SCHEMA_STATS('SCOTT', cascade=>TRUE);),建议每周执行一次。
ALTER TABLE employees MOVE;);使用Oracle内置工具定位性能瓶颈:
SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(1,1,1,1)););通过v$系列视图实时监控性能:
v$sysstat:查看系统统计信息(如物理读、逻辑读);v$sqlarea:查看SQL执行情况(如执行次数、耗时);v$session:查看会话状态(如等待事件、CPU使用率)。