性能优化技巧 - 多层排号键

简介: 排号键是SPL独特的数据类型,适合替代多层次、各层不连续的键值,比如身份证号、合同编号、产品编号、组织机构代码等。排号键定位速度快,常用于优化内存索引查询和外键关联计算。内存索引查询cardNormal.btx是集文件格式的身份证信息表,数据量一百万条,字段为:cardNo(身份证,主键),name(姓名),gender(性别),province(省份),email(电子邮件),mobile(移动电话),address(住址)。

排号键是SPL独特的数据类型,适合替代多层次、各层不连续的键值,比如身份证号、合同编号、产品编号、组织机构代码等。排号键定位速度快,常用于优化内存索引查询和外键关联计算。

内存索引查询
cardNormal.btx是集文件格式的身份证信息表,数据量一百万条,字段为:cardNo(身份证,主键),name(姓名),gender(性别),province(省份),email(电子邮件),mobile(移动电话),address(住址)。cardK.btx与cardNormal.btx在结构和数据上完全相同,唯一的区别在于cardNo字段是排号键。

本案例对cardNormal.btx和cardK.btx分别执行百万次索引查询,并比较两者性能。

其中cardNo是简化后的身份证,格式如下:
1
省、地区:各自取值范围为1-10。

生日:取值为"1980-06-01"至"1981-01-01"。

流水:取值为1-100。

校验:根据前15位计算出的冗余校验位,取值为0至10,其中10用x来表示。

将上述身份证转为排号键,可采取如下思路:

1.      省、地区:排号键的每一层只支持1-255的整数,因此将省和地区分别转为整数,作为第1、2层排号键。

2.      生日:排号键以1为起始,可以取得更好的性能,因此算出原生日和1980-06-01的间隔天数,作为第3层排号键。

3.      流水:转为整数,作为第4层的排号键。

4.      校验位:冗余数据,可删除。

具体转换脚本如下:

k(int(mid(cardNo,1,2)),

int(mid(cardNo,3,2)),

interval("1980-06-01",date(mid(cardNo,5,8),"yyyyMMdd")),

int(mid(cardNo,13,3))

)

下面对cardNormal.btx和cardK.btx分别执行百万次索引查询。
2
A8:对排号键建立内存哈希索引,需使用函数选项@s。

可以看到,对字符串键建立索引,查询需耗费5547毫秒,而排号键只需1977毫秒,后者明显快。

 外键关联查询
taxNormal.btx是集文件格式的报税信息表,数据量一千万条,字段为:serial(主键,流水号),cardNo(外键,身份证),tax(报税额),area(所属地区),declaretype(申报类型),unit(申报单位),declareTime(申报时间),network(办理网点)。taxK.btx 与taxNormal.btx在结构和数据上完全相同,唯一的区别在于cardNo字段是排号键。

本案例算法:

1.       对taxNormal.btx和cardNormal.btx进行外键关联计算,排除操作系统缓存和硬盘IO的影响,只取关联动作消耗的时间。

2.       对taxK.btx和cardK.btx进行外键关联计算,排除操作系统缓存和硬盘IO的影响,只取关联动作消耗的时间。

3.       比较1和2的差异。

具体算法如下:
3
B2、B7、B13、B19:预遍历游标,避免操作系统缓存的影响。遍历之后需用reset函数重置游标,以便后续再次遍历。

B11、B23:用总时间减去遍历时间,获得关联动作消耗的时间。

可以看到,用普通键做外键关联计算,其关联动作耗时7553ms;排号键做外键关联计算时,只需耗时966ms,后者明显快。而且可以看出,使用排号键读出记录(fetch)的时间也少于使用字符串(其它字段和记录行数都相同),说明排号键对象的生成性能更好。

相关文章
|
1月前
|
存储 数据库管理 索引
索引的优点和缺点是什么
【10月更文挑战第15天】索引的优点和缺点是什么
|
11天前
|
存储 缓存 搜索推荐
优化PHP数组性能
优化PHP数组性能
29 8
|
2月前
|
UED
代码分割的优势和劣势分别是什么?
代码分割的优势和劣势分别是什么?
|
3月前
|
数据库 索引
数据库索引的作用和优点缺点
【8月更文挑战第27天】创建索引能显著提升系统性能,确保数据唯一性,加快检索速度,加速表间连接及优化分组排序过程。然而,过度使用索引会导致创建与维护成本增加、占用更多物理空间并降低数据维护效率。因此,在创建索引时需谨慎评估需求及影响。
58 2
|
4月前
|
存储 SQL 运维
MSSQL性能调优精要:索引深度优化、查询高效重构与并发精细控制
在MSSQL数据库的运维与优化领域,性能调优是一项复杂而细致的工作,直接关系到数据库的稳定性和响应速度
|
5月前
|
存储 算法
数据结构和算法——散列表的性能分析(开放地址法的查找性能、期望探测次数与装填因子的关系、分离链接法的查找性能)
数据结构和算法——散列表的性能分析(开放地址法的查找性能、期望探测次数与装填因子的关系、分离链接法的查找性能)
103 0
|
算法 测试技术 UED
如何优化模型渲染性能
优化模型渲染性能对于提升用户体验、节约资源消耗、支持复杂场景、扩展到低端硬件、节约能源以及提高开发效率来说都是非常重要的。通过优化性能,可以实现更高质量、更高效的图形渲染。
151 0
|
负载均衡 并行计算 算法
BWA序列比对方法丨针对较大基因组的并行计算和性能优化方式,利用多线程和负载均衡策略提高效率
BWA序列比对方法丨针对较大基因组的并行计算和性能优化方式,利用多线程和负载均衡策略提高效率
|
存储 关系型数据库 MySQL
第七章 创建⾼性能的索引
第七章 创建⾼性能的索引
|
搜索推荐 算法 C语言
排序优化:如何实现一个通用的、高性能的排序函数?
如何选择合适的排序算法? 如果要实现一个通用的、高效率的排序函数,我们应该选择哪种排序算法?我们先回顾一下前面讲过的几种排序算法。
193 0
排序优化:如何实现一个通用的、高性能的排序函数?