Linux环境下Oracle查询优化的核心技巧
执行计划是SQL执行的“路线图”,通过它可清晰识别全表扫描、索引失效、不合理连接等性能问题。常用获取方式包括:
EXPLAIN PLAN命令:EXPLAIN PLAN FOR SELECT * FROM employees WHERE department_id = 10; 生成计划后,用SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);查看;AUTOTRACE工具:SET AUTOTRACE TRACEONLY EXPLAIN; 执行SQL即可显示执行计划;INDEX RANGE SCAN优于TABLE ACCESS FULL)、连接方式(如NESTED LOOPS适合小数据集驱动大表,HASH JOIN适合大数据集等值连接)、关键指标(Cost越低越好,Rows与实际差异过大可能导致性能问题)。WHERE、JOIN、ORDER BY子句中的高频列创建索引(如CREATE INDEX idx_emp_dept ON employees(department_id););WHERE UPPER(name) = 'JOHN'会导致索引失效)、隐式类型转换(如字符串列与数字比较);CREATE INDEX idx_emp_dept_sal ON employees(department_id, salary)),避免回表操作;ALTER INDEX idx_emp_dept REBUILD;)、删除未使用的索引(通过DBA_UNUSED_COL_STATISTICS视图识别)。SELECT *:明确列出所需列(如SELECT employee_id, name FROM employees),减少不必要的数据传输;:var代替(如SELECT * FROM employees WHERE department_id = :dept_id),降低硬解析次数(硬解析会消耗大量CPU和共享池资源);WHERE子句:避免在索引列上使用OR(如WHERE department_id = 10 OR salary > 5000),可改写为UNION ALL;减少函数使用(如WHERE TRUNC(create_time) = '2025-10-01'改为WHERE create_time >= TO_DATE('2025-10-01', 'YYYY-MM-DD') AND create_time < TO_DATE('2025-10-02', 'YYYY-MM-DD'));JOIN(如SELECT * FROM employees WHERE department_id IN (SELECT id FROM departments WHERE location = 'NY')改为SELECT e.* FROM employees e JOIN departments d ON e.department_id = d.id WHERE d.location = 'NY'),或使用WITH结构(CTE)提高可读性。SHARED_POOL(存储SQL、PL/SQL代码,建议占总SGA的10%-20%)、DB_CACHE_SIZE(缓存数据块,建议占总SGA的50%-70%)、SORT_AREA_SIZE(排序内存,避免磁盘排序);可通过ALTER SYSTEM SET SGA_TARGET = 4G SCOPE=BOTH;启用自动内存管理;PGA_AGGREGATE_TARGET(如ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 1G SCOPE=BOTH;),用于存储排序、哈希连接等操作的内存,避免频繁的磁盘I/O。RANGE)、范围(RANGE)、列表(LIST)等维度分区(如CREATE TABLE sales (sale_id NUMBER, sale_date DATE) PARTITION BY RANGE (sale_date) (PARTITION p2024 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD')), PARTITION p2025 VALUES LESS THAN (TO_DATE('2026-01-01', 'YYYY-MM-DD'))););ALTER TABLE sales ADD PARTITION p2026 VALUES LESS THAN (TO_DATE('2027-01-01', 'YYYY-MM-DD'));)、删除旧分区(ALTER TABLE sales DROP PARTITION p2024;),减少查询时的数据扫描量。ALTER TABLE employees PARALLEL (DEGREE 4);),或使用并行提示(SELECT /*+ PARALLEL(employees, 4) */ * FROM employees WHERE department_id = 10;);ALTER SESSION SET parallel_degree_policy = AUTO;,让Oracle自动决定并行度;DBMS_STATS包定期收集表、索引的统计信息(如EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'EMPLOYEES');),确保优化器生成最优执行计划;@?/rdbms/admin/awrrpt.sql生成AWR报告(分析系统性能趋势),@?/rdbms/admin/addmrpt.sql生成ADDM报告(提供具体优化建议),快速定位性能瓶颈。/etc/sysctl.conf中的参数(如shmmax(共享内存最大值)、shmmin(共享内存最小值)、shmall(共享内存总页数)),确保Oracle能使用足够的共享内存;noatime挂载选项(减少文件访问时间更新),提高I/O性能;