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

從應用端優化 Oracle:SQL 寫法決定 80% 效能

     編輯:Oracle 資料庫基礎

統計顯示:硬體、OS、網路、參數調校總共僅貢獻 40% 效能提升,剩餘 60%~80% 來自應用程式與 SQL 優化。本文聚焦 WHERE 子句常見陷阱,示範錯誤寫法導致索引失效、全表掃描的案例。

資料庫設計層面:正規化與反正規化

  • 遵循 3NF 易維護,但多表 Join 降低查詢速度。
  • 視需求採用水平分割(按範圍/雜湊分區)、垂直分割(熱冷欄分離)、冗餘欄位(避免頻繁 Join)、衍生欄位(預先計算彙總值)等反正規化手段。

SQL 寫法三大殺手

1. IS NULL / IS NOT NULL 讓索引失效

含 NULL 的欄位不進入 B-Tree 索引。任何 WHERE col IS NULL 或 IS NOT NULL 皆無法使用該欄索引。
對策:給預設值(如 DEFAULT 'N'),或使用函式式索引 CREATE INDEX idx_nvl ON t(NVL(col, 'X'))。

2. 欄位串接(||)導致索引失效

-- 錯誤:無法使用 last_name 索引
SELECT * FROM employee WHERE first_name || ' ' || last_name = 'George Bush';

-- 正確:可使用 last_name 索引
SELECT * FROM employee WHERE first_name = 'George' AND last_name = 'Bush';

-- 變數拆解法(函式不可用於索引欄)
SELECT * FROM employee
WHERE first_name = SUBSTR(:name, 1, INSTR(:name, ' ')-1)
  AND last_name  = SUBSTR(:name, INSTR(:name, ' ')+1);

3. LIKE 前置萬用字元(%abc%)無法用索引

-- 無法使用索引
SELECT * FROM employee WHERE last_name LIKE '%Bush%';

-- 可使用索引
SELECT * FROM employee WHERE last_name LIKE 'Bush%';

若業務必須模糊前綴,可考慮 Oracle Text、反向鍵索引 + REVERSE() 或 函式式索引。

核心心法

「能用索引就用索引,能少掃描就少掃描。」每一條 SQL 寫完,先 EXPLAIN PLAN 確認存取路徑,再上線。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved