情景描述:數據存儲在兩個表中,其中表內容直接有少量重複數據及異同數據,可以理解爲大表中存在大批量數據,小表中存在少量的重複數據及異同數據。
有以下方案可供參考:
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左右。