SQL—大數據量union去重的優化

情景描述:數據存儲在兩個表中,其中表內容直接有少量重複數據及異同數據,可以理解爲大表中存在大批量數據,小表中存在少量的重複數據及異同數據。

有以下方案可供參考:

1)union

2)union all+distinct

3)union all+group by

4)union all+開窗函數

 

其實優化前就使用的union  因爲兩個表結構是一致的,使用union 自動去重,方便而且對於數據量不大的情況 使用union是最好的選擇。寫法簡單而且速度與union all 並不會有很大的區別

 但是問題出現了:當數據量增加之後 查詢 大表 union 小表 明顯比只查詢大表 慢很多。(ps:百萬級千萬級的分頁查詢)

以下是優化的思路,並不涉及到代碼語句


union 從兩個已進行相應排序的輸入表中,使用其排序順序對行進行匹配
union al 追加多個輸入表以組成輸出表

查看問題首先要知道是什麼導致的慢,根據查詢執行計劃來看,order排序佔用很大一部分資源(先集合 後排序)。

當然集合之前是有各自的索引的 但是集合之後 進行排序這個就沒有用到。

 

如果不適用union的話 只能是union all了。

關於上述2,3,4點  均已測試 其實 union all+distinct 與union all+group by 區別不大。

忘記了看到誰寫的一點 開窗函數over() 對大數據量 的速度有提升。經測試

union all+ROW_NUMBER() over(PARTITION BY A ORDER BY A) 查詢當頁數據 速度可以縮短到原先的1/10倍

有興趣的可以嘗試下  但是前提是數據量夠大。

ps:優化之後的速度在100ms左右  優化前的速度1000ms左右。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章