为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM Database Server 64 V8
【操作系统】:windows
【CPU】:i5-9300H
【问题描述】*:
前提:分区表t,时间范围字段c1(number),索引index1(字段c1),index2(字段c2);
情景:(1)查询条件where c1 < ? and c1 > ?; 查询速度正常,执行计划可见 SSEK2 = scan_type(ASC), INDEX_C1(T), scan_range(exp_cast(?), scan_range(exp_cast(?))
(2)查询条件where c1 < ? and c1 > ? and c2 = 150; 查询极慢,执行计划可见 SSEK2 = scan_type(ASC), INDEX_C2(T), scan_range(exp_cast(150), scan_range(exp_cast(150))
(3)补充说明:分区表是从Oracle迁移到dm的,在Oracle中,2种筛选条件查询速度是差不多的。
请问这种情况是否正常? 我该如何优化表结构或者sql语句?
从第二个情况来看是添加c2条件后执行计划走的是c2列的索引
1.c2列过滤性如何
2.c2列索引统计信息是否准确
stat 100 on index 索引名
3.可以按照上面老师说的把c1列添加至c2列后
删除索引C2后,执行条件where c1 < ? and c1 > ? and c2 = 150; 速度加快,查看执行计划可见走了分区;
验证是否为普通索引C2导致,执行条件where c1 < ? and c1 > ? and c2 = 150 and c3 = ‘SSBB’ (c3也是原本存在的索引字段),结果出现了和之前一模一样的问题。删除索引c3索引后恢复正常。
这是属于bug还是索引使用不当?
分区表查询时,走分区裁剪功能性能会好很多.即看执行计划里分区表是FULL还是EQU扫描.大分区表上查询一定要带上分区键,避免全表扫描,优先建分区本地索引,或者不建索引.在调试案例SQL时,可以把索引全部设置成不可见,然后查询看耗时是否比之前快,执行计划是否合理,然后在有很好过虑列上建分区本地索引,进一步提升速度
INDEX_C2 这个索引把C1加到C2后面