DM 一次SQL优化经历
工作中遇到一個SQL查詢慢的問題
查詢語句是:
SELECT * FROM db_msg.t_xxpt_xx_cocall xx WHERE dt_fssj >=‘2020-06-03 00:00:00’ AND dt_fssj <= ‘2020-06-10 23:59:59’ order by dt_fssj desc limit 20;
篩選字段為30w左右數據,返回結果集20,首次執行時會執行有7,8秒的時間
為了優化這個SQL我首先查看這個SQL執行計劃:
1 #NSET2: [6696, 20, 764]
2 #PRJT2: [6696, 20, 764]; exp_num(26), is_atom(FALSE)
3 #SORT3: [6696, 20, 764]; key_num(1), is_distinct(FALSE), top_flag(1), is_adaptive(0)
4 #BLKUP2: [418, 198120, 764]; I_XXPT_XX_COCALL_FSSJ(XX)
5 #SSEK2: [418, 198120, 764]; scan_type(ASC), I_XXPT_XX_COCALL_FSSJ(T_XXPT_XX_COCALL as XX), scan_range[exp_cast(‘2020-06-03 00:00:00’),exp_cast(‘2020-06-10 23:59:59’)]
執行計劃時首先走SEEK2二級索引數據定位,同時篩選字段數據,然后走BLKUP2(定位查找)
然后我這邊打開MONITOR_SQL_EXEC參數,然后執行這個語句,使用ET來查看這個執行計劃每個步驟的消耗,發現執行計劃BLKUP2這一步會消耗百分之98以上時間。
主要是因為當前語句為select * 要返回所有列的信息,而二級索引只記錄rowid和索引列信息,所以執行計劃需要定位查找其他列數據,消耗大量資源
所以后續優化中去掉了此列上的普通二級索引,新建了一個聚集索引,聚集索引上包含所有列的值,走CSEK2查找篩選后就能獲得所有列的值,不會再走BLKUP2(定位查找)這個過程,從而減少資源開銷
添加聚集索引:
CREATE CLUSTER INDEX I_XXPT_XX_COCALL_FSSJ ON db_msg.t_xxpt_xx_cocall (DT_FSSJ DESC);
然后查看新的執行計劃:
1 #NSET2: [0, 20, 764]
2 #PRJT2: [0, 20, 764]; exp_num(26), is_atom(FALSE)
3 #TOPN2: [0, 20, 764]; top_num(20)
4 #CSEK2: [0, 100, 764]; scan_type(ASC), I_XXPT_XX_COCALL_FSSJ(T_XXPT_XX_COCALL as XX), scan_range[exp_cast(‘2020-07-10 23:59:59’),exp_cast(‘2020-07-03 00:00:00’)]
新計劃下執行時間基本不到1S,SQL優化成功
總結
以上是生活随笔為你收集整理的DM 一次SQL优化经历的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Server 使用ORDER B
- 下一篇: 安徽二级计算机考试准考证打印入口