概述
大家都知道資料庫有些指令會對結果進行排序,當資料量較大時,排序會非常耗時。今天主要讨論如何避免無謂的排序,提升SQL執行效率。
會進行排序的SQL 指令
下面列舉會排序的代表性運算:
GROUP BY 子句
ORDER BY 子句
聚合函數(SUM,COUNT,AVG,MAX,MIN)
DISTINCT
集合運算(UNICON,INTERSECT,EXCEPT)
視窗函數(RANK,ROW_NUMBER等)
執行個體
下面通過兩個示例進行說明,分别是union 和 distinct。
1、盡可能使用 union all 代替 union
SELECT * FROM TABLE_AUNION ALLSELECT * FROM TABLE_B;
如果不在乎結果中存在重複資料,或預先知道結果中不會有重複資料。請使用union all 代替 union,這樣就不會進行排序。
2、盡可能使用exists 代替 distinct
示例資料說明,下面有商品表和銷售記錄表。
Items:
SalesHistory:
需求::查找有銷售記錄的商品。
可以使用in方式實作,但因為in會産生子查詢,不如使用連接配接查詢效率高。
SELECT DISTINCT I.item_noFROM Items I INNER JOIN SalesHistory S ON I.item_no = S.item_no;
因為是一對多查詢,會産生重複記錄,所有使用DISTINCT過濾重複記錄。
但更好的做法是使用exists方式:
SELECT DISTINCT I.item_noFROM Items I WHERE EXISTS ( SELECT * FROM SalesHistory S WHERE I.item_no = S.item_no);
說明:因為使用exists 查詢時不會進行排序,而且使用exists和使用連接配接效率一樣高。
總結
今天主要讨論了如何在SQL中避免出現無謂的排序,通過兩個示例進行說明,盡量使用union all 代替 union,exists 代替 distinct。
後面會分享更多DBA方面内容,感興趣的朋友可以關注下!