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

SQL 語句優化 34 條黃金法則:從 Oracle 到通用關係型資料庫的效能心法

     編輯:關於SqlServer

查詢結構優化 (1-7)

  1. 表順序 (RBO):Oracle RBO 從右往左解析 FROM,小表放最後 (驅動表);3 表以上選交叉表 (被多表引用)
  2. WHERE 條件序:自下而上解析,連接條件先寫、過濾性最強條件寫最後
  3. 禁用 SELECT *:解析期轉換列名、查詢數據字典、增加網路/IO/緩存負擔
  4. 減少資料庫往返:批次處理、陣列綁定 (ARRAYSIZE 200)、少即是多
  5. DECODE/CASE 替換多次掃描:單掃描完成多條件分支
  6. 合併無關查詢:UNION ALL 或單一陳述式多結果集
  7. 刪除重複最高效:DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO)

DML 優化 (8-10)

  1. TRUNCATE 代替 DELETE (全表):無 Log、不觸發 Trigger、DDL 非 DML、不可回滾
  2. 頻繁 COMMIT:釋放 Rollback Segment、鎖、Redo Log Buffer、管理開銷
  3. WHERE 代替 HAVING:HAVING 在分組後過濾,WHERE 分組前過濾,ON 最早 (JOIN 時)

子查詢與連接 (11-16)

  1. 減少表存取:合併子查詢、避免重複掃描
  2. 內部函數提效:ANALYTIC、KEEP 等進階函數
  3. 表別名:SELECT a.col FROM table_a a JOIN table_b b ON a.id = b.id
  4. EXISTS 代替 IN:NOT IN 最差 (全表掃描+排序合併),改 NOT EXISTS 或 LEFT JOIN ... WHERE IS NULL
  5. 識別低效 SQL:查 V$SQLAREA 找 Hit_Ratio < 0.8、Reads_Per_Run 高者
  6. 索引提效:B-Tree、選擇性高、定期 REBUILD,但 INSERT/UPDATE 代價 +4-5 I/O

進階改寫技巧 (17-25)

  1. EXISTS 代替 DISTINCT:一對多查詢時,EXISTS 滿足即停止
  2. SQL 大寫:Oracle 解析先轉大寫,省轉換開銷
  3. Java 少用 + 拼 SQL:用 StringBuilder 或參數化
  4. 索引列避 NOT:導致全掃
  5. 索引列避運算/函數:SAL*12>25000 → SAL>2083
  6. >= 代替 >:直接定位邊界值
  7. UNION 代替 OR (索引列):OR 導致全掃
  8. IN 代替 OR (同列多值):可讀性、計畫穩定
  9. 索引列避 IS NULL/NOT NULL:空值不存索引 (單列/全空複合),改 >=0 等
  10. 複合索引必用首欄:否則全掃

進階索引與排序 (26-34)

  1. UNION ALL 代替 UNION:免排序,但會重複行
  2. WHERE 代替 ORDER BY:ORDER BY 需索引列全匹配、非空、不與 WHERE 索引衝突
  3. 避免隱式類型轉換:EMP_TYPE=123 → TO_NUMBER(EMP_TYPE)=123 索引失效,顯式 CAST
  4. 警惕 !=/||/+/自比較:全掃觸發器
  5. 大表 >30% 回表不如全掃:但索引通常快數倍~數千倍
  6. 慎用 DISTINCT/UNION/MINUS/INTERSECT/ORDER BY:觸發 SORT,調大 SORT_AREA_SIZE
  7. GROUP BY 前置過濾:WHERE 先過濾再分組,比 HAVING 快
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved