首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle SQL 語句優化實戰:操作符陷阱、寫作規範、索引利用與 Hint 策略全解析

     編輯:Oracle 資料庫基礎

前言

SQL 語句寫法直接決定執行計畫好壞。本文針對 Oracle 環境,系統整理操作符優化、寫作規範、索引失效場景、Hint 使用原則,並對比常見誤區,助你寫出高效 SQL。

一、操作符優化:避坑指南

操作符問題推薦替代方案
IN需轉換為多表連接,含群組統計時無法轉換,多一層解析開銷業務核心 SQL 改用 EXISTS 或 JOIN
NOT IN無法使用索引,且含 NULL 時語義陷阱NOT EXISTS 或 LEFT JOIN + IS NULL
!= / <>永不走索引,導致全表掃描改寫為 a > 0 OR a < 0、a > '' 等區間查詢
IS NULL / IS NOT NULLB-Tree 索引不存 NULL,通常全掃1) 設 NOT NULL + 預設值 2) 位圖索引(低基數、少 DML) 3) 改寫 a > 0
LIKE '%abc%'前導萬用字元無法走索引範圍掃描若知前綴改 LIKE 'X5400%';或用 Oracle Text / 函數索引
UNION隱含 SORT UNIQUE,大量資料落磁碟排序確知無重複時用 UNION ALL

二、SQL 寫作規範:共享游標與解析優化

  • 統一大小寫、縮排、別名:Oracle 依字面比對 Shared Pool,完全相同才能共享游標,減少 Hard Parse。
  • 加上 Schema 前綴:SELECT * FROM scott.emp 避免解析時搜尋同義詞/公共同義詞。
  • WHERE 條件順序:無索引全掃時,把過濾率高(選擇率低)的條件前置,減少 CPU 比較次數。
  • FROM 表順序:無統計資訊時 Oracle 按書寫順序驅動,小表應寫在前;有統計則由 CBO 自動決定。

三、索引失效常見模式與改寫

失效寫法原因改寫範例
SUBSTR(col,1,4)='5400'函數作用於索引欄col LIKE '5400%'
TRUNC(date_col)=TRUNC(SYSDATE)函數阻擋索引date_col >= TRUNC(SYSDATE) AND date_col < TRUNC(SYSDATE)+1
col+5 = 100運算式導致隱式轉換col = 95
'X'||col > 'X5400'連接運算破壞索引順序col > '5400'
col1 || col2 = 'AB'多欄運算無法使用單欄索引col1='A' AND col2='B' 或建立複合索引

四、Hint 使用原則

Hint 只是建議,非強制。優先從統計資訊、索引設計、SQL 改寫著手;Hint 作為最後手段,且需在多環境驗證無副作用。

分類常用 Hint說明
目標模式/*+ ALL_ROWS */ /*+ FIRST_ROWS(n) */全表最佳化 / 前 n 列快速回應
連接方法USE_NL USE_HASH USE_MERGE指定 Nested Loop / Hash Join / Sort Merge Join
索引指定INDEX(t idx_name) INDEX_FFS(t idx_name)強制索引範圍掃描 / 快速全索引掃描
並行PARALLEL(t,8) PARALLEL_INDEX(t, idx, 4)並行查詢/索引掃描

五、ERP 上線前五大 SQL 品質檢核

  1. 核心交易 SQL 無 NOT IN、!=、LIKE '%...%'、函數索引欄。
  2. 所有表、索引已收集統計資訊(DBMS_STATS.GATHER_SCHEMA_STATS)。
  3. 執行計畫無 FULL TABLE SCAN(小表除外)、無 CARTESIAN PRODUCT。
  4. 綁定變數一致性:同一邏輯 SQL 文字完全相同,確保游標共享。
  5. 已建立 SQL Plan Baseline 或 SQL Profile 固定關鍵 SQL 計畫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved