CentOS环境下Oracle索引优化技巧
=或IN的场景)。WHERE department_id=10 AND salary>5000的查询,组合索引应为(department_id, salary),而非(salary, department_id)。WHERE UPPER(name)='JOHN'),创建CREATE INDEX idx_upper_name ON employees(UPPER(name)),可使函数查询走索引。ALTER INDEX idx_name REBUILD ONLINE(在线重建,不影响业务)或ALTER INDEX idx_name REORGANIZE(重组,适用于空间不足的场景)回收碎片,提升索引访问效率。DBA_INDEX_USAGE视图(SELECT index_name, index_owner, index_usage FROM DBA_INDEX_USAGE;)监控索引使用情况,删除3个月以上未使用的索引。EXEC DBMS_STATS.GATHER_TABLE_STATS('SCHEMA_NAME', 'TABLE_NAME');),确保优化器选择最优索引。WHERE UPPER(name)='JOHN'会使索引失效,应改用函数索引CREATE INDEX idx_upper_name ON employees(UPPER(name)));NOT(如WHERE NOT department_id=10)、IS NULL/IS NOT NULL(除非索引支持NULL值);WHERE id=123,应将123改为'123')。CREATE INDEX idx_employee_details ON employees(email, phone_number)),查询SELECT email, phone_number FROM employees WHERE email='john@example.com'时,Oracle可直接从索引中获取数据,无需访问表(减少I/O)。/*+ INDEX(table_name index_name) */提示强制SQL使用指定索引(如SELECT /*+ INDEX(emp idx_emp_department) */ * FROM employees WHERE department_id=10),适用于优化器未选择最优索引的场景(需谨慎使用,避免过度干预)。DBA_INDEX_USAGE视图查看索引的使用次数、最后使用时间,识别未使用或很少使用的索引(如某索引3个月未被使用,可考虑删除)。EXPLAIN PLAN FOR SELECT ...生成执行计划,再通过SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);查看,重点关注:
INDEX RANGE SCAN/INDEX UNIQUE SCAN);TABLE ACCESS FULL,需优化);Cost值越低越好)。