数值型与文本型在索引方面的差异以及解决办法

2018-02-23  本文已影响28人  每天学点编程

请关注我的微信公众号

个人微信公众号

技术交流群 (仅作技术交流):642646237

​请关注我的头条号:

建表T1 主键为数值型

建表T2 主键为文本型

向T1中插入测试数据

向T2中插入测试数据

统计表, 列,索引的统计信息

数值型主键的执行计划

对于数值类型字段,范围查询是正常的索引范围扫描,执行效率很高。

对于文本类型字段,范围查询就是对应的全表扫描,效率较低。

原因分析

字符类型的排序方式跟数字类型的排序是不同的,所以如果按照数字类型的排序规则去看,则字符类型在索引中是“乱序”的。

字符类型还导致了聚簇因子很大,原因是插入顺序与排序顺序不同。
比如按照数字类型插入(1..3200000),按字符类型('1'...'32000000')t排序。

在对字符类型使用大于运算符时,会导致优化器认为需要扫描索引大部分数据且聚簇因子很大,最终导致弃用索引扫描而改用全表扫描方式。

​解决方案

将SQL语句由开放区间扫描(>=),修改为封闭区间(between xxx and max_value)。使得数据在索引局部顺序是“对的”。如果采用这种方式仍然走索引扫描,还可以进一步细化分段或者采用“逐条提取+批绑定”的方法。

结论

这是一个由不好的数据类型带来的执行计划异常的例子。
糟糕的数据结构设计往往是致命的,后期的优化只是补救措施。如果从源头上加以杜绝,这才是优化的根本。

上一篇 下一篇

猜你喜欢

热点阅读