索引类型的选择需结合查询场景与数据特征:
UPPER(name)、TO_CHAR(create_time))设计,解决函数导致索引失效的问题。SELECT name, age FROM employees WHERE dept_id = 10,索引包含dept_id、name、age),避免回表访问,提升查询速度。WHERE子句(过滤条件)、JOIN子句(关联字段)、ORDER BY子句(排序字段)中的列,如订单表的order_date、用户表的login_name。(dept_id, employee_id)的顺序优于(employee_id, dept_id)。INSERT、UPDATE、DELETE操作的开销(需维护索引结构),建议单表索引数量不超过5-10个。quantity字段频繁修改,建索引会导致更新操作变慢。WHERE UPPER(name) = 'JOHN'、WHERE salary + 1000 > 5000),会导致索引无法识别。IS NULL、IS NOT NULL条件(Oracle无法高效使用索引定位空值)。NOT操作(如WHERE NOT dept_id = 10),会强制全表扫描。/*+ INDEX(table_name index_name) */强制查询使用指定索引,适用于优化器选错索引的场景(如SELECT /*+ INDEX(emp idx_emp_dept) */ * FROM employees WHERE dept_id = 10)。dept_id、name,查询SELECT dept_id, name FROM employees WHERE dept_id = 10无需访问表数据)。ORDER BY子句中的列创建索引,且顺序与索引列一致(如ORDER BY create_time DESC,索引应为(create_time DESC))。ALTER INDEX index_name REBUILD命令重建,回收空间并优化结构。对于分区索引,可使用ALTER INDEX idx_name REBUILD PARTITION partition_name单独重建。V$INDEX_USAGE_INFO视图查看索引的使用频率(如USER_SEEKS、USER_SCANS),或使用AWR/ADDM报告分析索引性能瓶颈(如未使用的索引可删除)。COMPRESS 1),减少索引存储空间(可降低30%-50%),提升查询性能(减少I/O)。(dept_id, employee_id),查询WHERE employee_id = 100),Oracle会跳过前导列,直接扫描后续列,适用于前导列选择性低但整体查询条件选择性高的场景。ALTER INDEX index_name REBUILD PARALLEL 4),利用多CPU核心加速处理,缩短维护时间(需根据系统负载调整并行度)。