首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL 效率對比:子查詢 vs 關聯派生表,實測為準

     編輯:程式設計綜合問答

兩條 SQL


-- 方案一:派生表關聯
SELECT e.* FROM emp e
JOIN (SELECT AVG(sal) avg_sal, deptno FROM emp GROUP BY deptno) d
  ON e.deptno = d.deptno
WHERE e.sal > d.avg_sal;

-- 方案二:相關子查詢
SELECT * FROM emp e
WHERE e.sal > (SELECT AVG(sal) FROM emp WHERE deptno = e.deptno);

理論分析

維度方案一(派生表)方案二(子查詢)
執行計劃物化派生表 → Hash Join對外層每行執行子查詢(可能轉為 Semi Join)
平均值計算次數每部門一次理論上每行一次,優化器常轉為每部門一次
臨時表開銷需創建派生表無顯式臨時表
索引利用需 deptno 索引支持 Join需 deptno 索引支持子查詢

結論

無絕對優劣,必須在目標數據庫、數據量、索引環境下實測。

  • MySQL 5.6+ / 8.0:優化器常將方案二轉為方案一等效計劃,性能接近。
  • Oracle / SQL Server:方案一物化派生表通常更穩定,避免嵌套循環。
  • 大數據量(>100萬):方案一配合物化視圖或緩存平均值表最優。

驗證方法


-- MySQL
EXPLAIN FORMAT=JSON SELECT ...;
-- Oracle
EXPLAIN PLAN FOR SELECT ...; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- SQL Server
SET STATISTICS IO, TIME ON; SELECT ...;

關注 rows、cost、Actual Time 指標。

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