【摘要】
日常生活中,我们会遇到各种各样的数据,小到公司通讯录,大到互联网用户行为分析 。在进行数据分析处理的过程中,查询是必不可少的环节,如何更加高效地进行数据查询 。点击:性能优化技巧 - 查询,来乾学院一探究竟!
SPL为用户提供了强大的索引机制以及针对不同场景中各对象的查询函数,善加运用,可以显著提高查询性能 。
1 键值查找
1.1 序表
我们先建立一个份“通话记录”的模拟数据,通过这份数据,来比较一下不同查询函数对序表查询性能的影响 。建立模拟数据的代码如下:
文章插图
代码1.1.1
其中部分数据如下:
文章插图
图1.1.1
对序表进行查询,通常我们会想到使用A.select()函数 。我们来看一下使用该函数的效果:
文章插图
代码1.1.2
查询耗时为80毫秒 。
对序表的键值进行查询时,可以利用A.find()函数进行查询 。示例代码如下:
文章插图
代码1.1.3
查询耗时为1毫秒 。
这是因为在集算器的序表中,可以指定某个或某些字段作为主键,基于主键的查找可以使用专门的函数 。比如代码1.1.3中A5的find函数,不仅能简化书写,更能有效地提高计算性能 。
当键值较多时,我们使用函数A.find@k ()进行批量键值查找 。示例代码如下:
文章插图
代码1.1.4
要注意的是,在使用A.find()函数时,需事先建立主键,否则会报“缺少主键”的错误 。
利用主键值查找的函数,可以有效地提升计算性能,是由于在序表中为主键建立索引表 。在代码1.1.4中,未建立索引时,平均查询时间在1400毫秒左右;建立索引后,查询平均耗时不到1毫秒 。
序表中的数据量越大,需要查找的次数越多,对效率的提升就越明显 。
当查询条件对应多个键时,示例代码如下:
文章插图
代码1.1.5
switch/join函数同样需要根据主键值在序表中查找记录,使用时会对维表自动建立索引 。若在多线程fork函数之前没有对相应维表建立索引,就会在每个线程中都自动为该维表建立一个索引,执行过程中会消耗更多内存,这样有可能会造成内存溢出,如图1.1.1.2,要注意避免,较好的处理方式可以参考图 1.1.3 。
文章插图
图 1.1.2 fork中的每个线程都自动建立了索引导致内存溢出
文章插图
图 1.1.3 fork执行前,先对维表建立索引
1.2 集文件
对有序的集文件进行查找,可以使用f.iselect()函数实现二分查找,该函数也支持批量查找,下面是个基于集文件使用f.iselect()批量查找的例子:
文章插图
代码1.2.1
代码1.2.1,建立集文件voiceBill@z.btx 。显然,Subscriber是有序的 。
文章插图
代码1.2.2
代码1.2.2,因为f.iselect()是个二分查找函数,所以需要注意代码中的A2作为查询序列,与集文件的编号一样,都需要有序 。还要注意,这里的选项@b不是二分法的意思,而是读取通过f.export()函数导出的集文件 。该集文件导出时,注意需要使用选项@z,否则在使用f.iselect ()对集文件进行查询时会报错 。
假设数据总量为N,使用二分法进行查找的时间复杂度为logN(以 2 为底),当数据量越大,性能提升也就越明显 。
1.3 组表
组表也有类似序表的T.find()和T.find@k()函数,可以高效地实现键值查找 。适合于在大维表中找出少量记录的场景 。我们来看这样一个例子:
文章插图
代码1.3.1
代码1.3.1,建立组表文件voiceBill.ctx,其中Subscriber是该组表的维 。
推荐阅读
- 网络实用技巧:保护在线账户 谨慎共享信息
- 定制优化Nextcloud镜像
- 微型投影仪选购及保养技巧
- 预防疾病 冬季练习太极拳的五大技巧
- 神回复|神回复:这就是所谓的职场神话技巧,不会说话的你快学起来吧!
- 晾衣服的技巧 晒衣服10个小贴士
- 中考作文提高技巧?中考作文题目技巧_2
- 六安瓜片的冲泡技巧,六安瓜片的味道口感和品茗技巧
- 显卡性能怎么看好坏?独立显卡天梯图2021年3月最新版排行榜
- windows10如何设置能更好的发挥电脑的性能?