過去工作也有優化查詢速度的經驗,但在現在這家公司因為長達十年的累積用戶量,動輒數億的資料累積在客戶表,導致相關查詢緩慢的問題叢生。 在持續優化的過程中也累積了許多相關經驗,特別記錄起來 數據庫: Oracle 11g ## 背景 客戶標籤表,一個用戶有N標籤,就會有 1 * N 的資料筆數 表資料僅約1800萬筆 關聯用戶表,因需要過濾用戶條件 標籤表查詢緩慢問題困擾業務運營與技術團隊良久 ## 困難 使用標籤類別搜尋目標用戶,長達 500s - 600s 經團隊與DBA聯合調優,搜尋時間降至 260s - 280s (方式: 根據執行計畫與經驗,調優索引、調優查詢語句、調優子查詢順序、資料下線、調優Oracle優化器 等等) 調優後的查詢時間仍然未達業務可用性,團隊開始研擬OLAP, NOSQL, ES等其他技術方案 ## 我採取的作法 #### 找出具體原因: 1. 表結構分為大、中、小類標籤。 總標籤類別不多,以標籤搜用戶時索引無法發揮作用,selectivity 約20%。 oracle 查詢優化器自動改走full table scan 2. 標籤刪除為軟刪除,資料無法下線 3. 標籤索引過濾後仍可能有八百萬用戶做表關聯,之後才做用戶條件過濾,最後才排序、取偏移量做分頁 #### 嘗試解決方法: 1. 考慮將標籤獨立出一張表,用戶標籤表資料結構設計改為BitMap, Oracle欄位使用RAW 或者 BLOB類型儲存BitMap。 一個用戶只要一條資料,縮減約 80% 的資料數量 2. 思考並討論是否可能刪除無用資料 3. 冗余需要過濾的用戶條件至標籤表,去除表關聯 4. 以標籤大中小類別,做多鍵分區、多層分區 5. 開啟並行查詢 ## 效果 查詢縮短為2.8s 1. BitMap: 與團隊及業務運營討論後確認,標籤表內有多個其他資料欄位不可去除,因行資料複雜無法改用BitMap 2. 刪除無用資料: 將刪除資料移至刪除表,減少約 5% 資料量。 並且防杜了表未來無限增生 3. 冗余欄位: 成功去除用戶表關聯,依照執行計畫分析,降低約 25% 查詢時間 4. 多層分區: 11g 不支援多鍵分區 (12c以後),也不支援三層以上分區 (12c),因此在大、中類標籤,做主子List雙層分區。 約降低 30% 查詢速度 5. 並行查詢: 針對透過標籤類別尋找用戶的查詢,添加 hint 開啟並行查詢。 並行查詢本就會加快速度,但並行查詢加上多層分區會更大幅度的加快並行效果。 又降低約 30% 的查詢時間
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.