一、操作系统级优化
/etc/sysctl.conf文件,优化系统对Oracle的支持。关键参数包括:fs.aio-max-nr = 1048576(异步I/O最大请求数)、fs.file-max = 6815744(系统最大文件描述符数)、kernel.sem = 250 32000 100 128(信号量参数)、net.ipv4.ip_local_port_range = 9000 65500(本地端口范围)、net.core.rmem_default/wmem_default = 262144(接收/发送缓冲区默认大小)、net.core.rmem_max/wmem_max = 4194304/1048586(接收/发送缓冲区最大大小)、vm.swappiness = 10(减少内存交换,优先使用物理内存)、kernel.shmmax = $(free|grep Mem|awk '{print int($2*1024*0.85)}')(共享内存最大值,取物理内存85%)、kernel.shmall = $(free|grep Mem|awk '{print int(($2*1024*0.85)/4096)}')(共享内存总页数)、vm.nr_hugepages = $(free -m|grep Mem|awk '{print int(($2*0.8*0.8)/2)}')(大页数量,提升SGA访问效率)。修改后执行sysctl -p使配置生效。noatime,nodiratime选项(减少文件访问时间更新),例如:mount -o noatime,nodiratime /dev/sda1 /oracle。systemctl stop firewalld)和SELinux(setenforce 0),若无需远程访问可禁用SSH反向隧道等服务,减少系统资源消耗。/etc/security/limits.conf,为Oracle用户设置上限:oracle soft nproc 2047(软进程数)、oracle hard nproc 16384(硬进程数)、oracle soft nofile 1024(软文件描述符数)、oracle hard nofile 65536(硬文件描述符数)、oracle soft memlock $(free|grep Mem|awk '{print int(2*0.90*1024)}')(软内存锁定限制)、oracle hard memlock $(free|grep Mem|awk '{print int(2*0.90*1024)}')(硬内存锁定限制)。编辑/etc/profile,为Oracle用户添加环境变量:if [ $USER = "oracle" ]; then ulimit -u 16384; ulimit -n 65536; fi,执行source /etc/profile生效。二、数据库参数优化
ALTER SYSTEM SET sga_target = 8G SCOPE=BOTH;(SGA目标大小)、ALTER SYSTEM SET pga_aggregate_target = 2G SCOPE=BOTH;(PGA聚合目标大小)。启用自动内存管理(AMM)可简化配置:ALTER SYSTEM SET memory_target = 10G SCOPE=BOTH; ALTER SYSTEM SET memory_max_target = 12G SCOPE=BOTH;。ALTER SYSTEM SET log_buffer = 64M SCOPE=SPFILE;,重启数据库生效。ALTER SYSTEM SET processes = 300 SCOPE=SPFILE; ALTER SYSTEM SET sessions = 335 SCOPE=SPFILE;(sessions通常为processes的1.1倍加5)。三、索引优化
CREATE INDEX idx_employee_name ON employees(last_name);。根据查询模式选择索引类型:B-tree索引(默认,适用于等值/范围查询)、位图索引(适用于低基数列,如性别、状态)。ALTER INDEX idx_employee_name REBUILD ONLINE;(ONLINE选项允许重建时继续使用索引)。DBA_INDEXES视图分析未使用的索引(SELECT * FROM dba_indexes WHERE last_analyzed IS NULL;),删除无用索引以减少插入、更新、删除操作的开销。四、SQL语句优化
EXPLAIN PLAN FOR SELECT * FROM employees WHERE department_id = 30;查看查询执行计划,识别全表扫描、索引未使用等问题。结合SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);查看详细分析结果。SELECT employee_id, last_name, salary FROM employees WHERE department_id = 30;。SELECT * FROM employees WHERE department_id = :dept_id;,通过应用程序传递:dept_id参数。SELECT /*+ HASH_JOIN(e, d) */ * FROM employees e JOIN departments d ON e.department_id = d.department_id;。SELECT * FROM employees WHERE department_id = 30 AND salary > 5000;(若department_id和salary有复合索引,可避免全表扫描)。五、分区技术优化
CREATE TABLE sales (sale_id NUMBER, sale_date DATE, amount NUMBER) PARTITION BY RANGE (sale_date) (PARTITION p2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')), PARTITION p2024 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD')));。CREATE INDEX idx_sales_date ON sales(sale_date) LOCAL;。定期维护分区索引(如重建、合并),保持索引有效性。ALTER TABLE sales ADD PARTITION p2025 VALUES LESS THAN (TO_DATE('2026-01-01', 'YYYY-MM-DD'));;删除2023年分区:ALTER TABLE sales DROP PARTITION p2023;。六、并发与事务管理
ALTER TABLE sales PARALLEL (DEGREE 4);;使用并行提示:SELECT /*+ PARALLEL(sales, 4) */ * FROM sales WHERE sale_date BETWEEN TO_DATE('2024-01-01', 'YYYY-MM-DD') AND TO_DATE('2024-12-31', 'YYYY-MM-DD');。COMMIT)或回滚(ROLLBACK)。使用SELECT FOR UPDATE NOWAIT避免等待锁,提高并发性能。七、监控与维护
@?/rdbms/admin/awrrpt.sql(选择两个快照时间点);生成ADDM报告:@?/rdbms/admin/addmrpt.sql(基于AWR报告)。EXEC DBMS_STATS.GATHER_SCHEMA_STATS('SCHEMA_NAME');;重建碎片化严重的索引;备份数据库(如使用RMAN);清理归档日志(避免占用过多磁盘空间)。