1. 程式人生 > >SQL 邏輯優化 case when 轉為 union all

SQL 邏輯優化 case when 轉為 union all

mysq ins 完成 cli 操作 nbsp 過程 date lec

通常數據庫的優化從硬件層面去考慮可分為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