SQL 邏輯優化 case when 轉為 union all
通常數據庫的優化從硬件層面去考慮可分為4個方面:
CPU:即降低計算復雜度,如減少sql各類聚合函數,窗口函數,case when等。
IO :(較少查詢結果集過程中對數據的訪問量。數據優化很大程度從這裏入手
網絡 : 較少查詢結果集的大小,去除不必要的查詢字段
數據庫資源 : 這裏講的數據庫資源主要是數據的一些參數設置,如索引、數據緩存。鎖的爭用,死鎖,鎖等。 鎖問題大部分從業務邏輯上去優化。如拆分事務,降低事務復雜度及事務中的表關聯。做到少量多次提交。即讓事務盡快完成,釋放資源。另一方面,根據業務情況,使用滿足需求的低隔離級別的讀鎖。在業務中對庫表的操作盡量使用相同順序。如相近業務中事務先查詢T1表再查詢T2表。(mysql中盡量避免使用 replace into .. ,insert into ... on dumplicate ...。並發時容易出現死鎖)
舉例:
SQL邏輯改寫,減少cpu及io的使用:
case when 某些情況轉為 union all
簡寫
SELECT * FROM (
....
(CASE WHEN a.updatetime>b.updatetime THEN a.updatetime ELSE b.updatetime END) as updatetime,
FROM a
LEFT JOIN b on b.ClientID = a.ClientID
) t
WHERE t.updatetime>=‘xxxxx‘
改寫:
SELECT ....
a.updatetime AS updatetime ,
FROM a
LEFT JOIN b on b.ClientID = a.ClientID
WHERE a.updatetime>=‘xxxx‘ AND a.updatetime>b.UpdateTime
UNION ALL
SELECT ....
b.UpdateTime as updatetime ,
FROM a
LEFT JOIN b on b.ClientID = a.ClientID
WHERE b.UpdateTime>=‘xxxx‘ AND a.updatetime<=b.UpdateTime
SQL 邏輯優化 case when 轉為 union all