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值越低越好)。