Ubuntu环境下Oracle数据库SQL优化的核心方法
WHERE、JOIN、ORDER BY的列创建索引(如单列索引、复合索引),例如CREATE INDEX idx_emp_dept ON employees(department_id),可大幅减少全表扫描次数。ALTER INDEX idx_name REBUILD命令重组碎片化索引,优化索引结构;删除未使用或重复的索引(通过V$OBJECT_USAGE视图监控),减少索引维护开销。CREATE INDEX idx_emp_id_name ON employees(emp_id, name)),避免回表操作,减少I/O次数。EXPLAIN PLAN FOR SELECT ...生成执行计划,再用SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY)查看,识别全表扫描、索引未使用等问题。SELECT *:明确列出所需列(如SELECT emp_id, name FROM employees),减少数据传输量;WHERE department_id = 1改为WHERE department_id = :dept_id,减少硬解析(Hard Parse)开销;EXISTS替代IN:对于子查询,EXISTS在找到第一条匹配记录后即返回,效率更高(如SELECT * FROM dept d WHERE EXISTS (SELECT 1 FROM emp e WHERE e.dept_no = d.dept_no));UNION ALL替代UNION:若无需去重,UNION ALL避免排序操作,提升性能。SGA_TARGET(共享全局区,如ALTER SYSTEM SET sga_target=2G SCOPE=BOTH)和PGA_AGGREGATE_TARGET(程序全局区,如ALTER SYSTEM SET pga_aggregate_target=1G SCOPE=BOTH),优化内存利用率。MEMORY_TARGET(总内存目标)和MEMORY_MAX_TARGET(最大内存目标,如ALTER SYSTEM SET memory_target=4G SCOPE=SPFILE),让Oracle自动分配SGA与PGA内存,简化配置。SHARED_POOL_SIZE(共享池大小,如ALTER SYSTEM SET shared_pool_size=500M SCOPE=BOTH)和SHARED_POOL_RESERVED_SIZE(保留大小,如ALTER SYSTEM SET shared_pool_reserved_size=50M SCOPE=BOTH),保留常用SQL、PL/SQL对象,减少重复加载。CREATE TABLE sales (sale_id NUMBER, sale_date DATE) PARTITION BY RANGE (sale_date) (PARTITION p2019 VALUES LESS THAN (TO_DATE('2020-01-01', 'YYYY-MM-DD')))),缩小查询范围,提升查询和维护效率。ALTER TABLE sales ADD PARTITION p2021 VALUES LESS THAN (TO_DATE('2022-01-01', 'YYYY-MM-DD')))、删除旧分区(ALTER TABLE sales DROP PARTITION p2019),适应数据增长需求。ALTER TABLE table_name PARALLEL (DEGREE 4)设置表的并行度(如4个并行进程),或使用PARALLEL提示(SELECT /*+ PARALLEL(employees, 4) */ * FROM employees),强制Oracle并行执行查询。ALTER SESSION SET parallel_degree_policy = AUTO开启自动并行度策略,让Oracle根据负载自动调整并行度。@?/rdbms/admin/awrrpt.sql)分析数据库整体性能趋势,生成ADDM报告(@?/rdbms/admin/addmrpt.sql)识别具体性能瓶颈(如SQL执行慢、资源争用),指导优化方向。top、htop等监控工具,实时查看CPU、内存、磁盘使用情况。systemctl disable <service_name>),释放系统资源;使用SSD/NVMe高速磁盘存储数据库文件,调整vm.swappiness(如sysctl vm.swappiness=10)降低交换分区使用,提升I/O效率。/etc/sysctl.conf文件,优化网络(如net.core.rmem_max=16777216)和文件系统参数(如fs.file-max=65536),提高系统吞吐量。