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

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

内存索引查询

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

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

其中cardNo是简化后的身份证,格式以下:性能

image.png

省、地区:各自取值范围为1-10。fetch

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

流水:取值为1-100。spa

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

将上述身份证转为排号键,可采起以下思路:orm

1.      省、地区:排号键的每一层只支持1-255的整数,所以将省和地区分别转为整数,做为第一、2层排号键。对象

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

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

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

具体转换脚本以下:

image.png

下面对cardNormal.btx和cardK.btx分别执行百万次索引查询。

image.png

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的差别。

具体算法以下:

image.png

image.png

B二、B七、B1三、B19:预遍历游标,避免操做系统缓存的影响。遍历以后需用reset函数重置游标,以便后续再次遍历。

B十一、B23:用总时间减去遍历时间,得到关联动做消耗的时间。

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

相关文章
相关标签/搜索