我们讨论过代码编写的难和繁的原理问题,现在关注性能问题,运行速度当然是非常重要的事情。
我们知道,软件不能改变硬件的性能,cpu 和硬盘该多快就多快。不过,我们可以设计出低复杂度的算法,也就是计算量更小的算法,计算机执行的动作变少,自然也就会快了。本来要做 1 亿次运算,如果有个好算法能把计算量降低到 100 万次,那快出 100 倍就不奇怪了。但是,光想出算法还不够,还要把这个算法实实在在地用某种程序语言写出来,否则计算机不会执行。
然而,如果采用的程序语言不给力,就有可能真地写不出来,这时候就干瞪眼忍受低速度。
sql 就会经常发生这种事。我们用这个简单例子来说明:从 1 亿条数据中取出前 10 名,用 sql 写出来并不复杂:
select top 10 * from orders order by amount desc
这个语句里有个 order by 的字样,对应的执行逻辑就是要对 1 亿条数据做大排序。我们知道,排序是个非常慢的动作,要把数据遍历多次(具体复杂度是 n*logn 次 ),如果数据量大到内存装不下,那还需要外存做缓存,性能还会急剧下降。如果严格按这句 sql 描述的逻辑去执行,这个运算无论如何是跑不快的。
其实,我们知道,只是取前 10 名并不需要将所有数据做大排序,只要在遍历时始终保持一个前 10 名的小集合,遍历过程中不断地修正这个小集合,一次遍历可以了,复杂度是 n*log10,和 log1亿相比差了 8 倍左右,也就是计算量能小 8 倍,而且这种算法完全不需要外存做缓存。
遗憾的是,用 sql 无法描述这样的计算过程,只能写成上面那个样子,然后指望数据库去优化。所幸,几乎所有数据库都会优化这个句子,没有傻到去做大排序了,所以也能跑得比较快。
但是,情况再复杂一些会怎样呢?比如我们把需求改成计算分组内的前 10 名,sql 写出来是这样的:
select * from ( select *, row_number() over (partition by area order by amount desc) rn from orders ) where rn= date_add(arg_date,interval -14 day) and visittime step1_time join eventgroup on eventgroup.id = e2.eventgroup where visittime step2_time join eventgroup on eventgroup.id = e3.eventgroup where visittime =a4 && visittime
10 =sessions=file(sessions.ctx).open().cursor@m(userid,id,devicetypeno;;a9)
11 =a9.joinx@m(userid:sessionid,a10id,devicetypeno)
12 =a11.group(userid)
13 =a12.new(~.align@a(3,eventgroupno):e,e(1).select(visittimee1.visittime && visittimee2 && visittime 16 =a15.news(e;~:devicetype,e2,e3)
17 =a16.groups(devicetype;count(1):step1_count,count(e2):step2_count,count(e3):step3_count,null:step3_rate)
18 =a17.run(devicetype=devicetype.m(devicetype).devicetype,step3_rate=step3_count/step1_count)
19 =interval@s(a1,now())
这个代码要比前面的 sql 更短,而且更灵活,再增加几步也还是这段代码。实测的结果,这段代码用单台服务器 10 秒就跑完了。 有了集合化和离散性的 spl,才能做到写着简单又跑得快。
本文来源 :github.com
闻泰科技携手安世拥抱半导体之梦!
Linux内核内存泄漏怎么办
市场报告:7月5G手机出货量1391.1万部,全年累计出货量7750.8万部
传博通有意收购网络设备商博科 出售处于最后阶段
可扩展图像传感器平台用于先进驾驶辅助系统和自动驾驶
SQL为什么不可能跑得快
破解流动人口管理难题,古荡经合社依托数字化全面升级
段码屏的温度该如何选择,一起来看看吧
中国乘用车销量连续四个月同比正增长,新能源汽车迎来发展机遇
LED电视的优点 2021年LED电视综合排行榜
在第十七届安博会(CPSE)上,肯定了安防智能化的趋势
乐视的希望?融创的每一个房子都会放一个乐视83寸超级电视
VR特警技能训练系统为警务培训工作提供有力支持
2017年企业开始布局氢燃料电池,投资规模正快速增长
海信大屏走向多元化布局,开启高动态内窥显示的新时代
基于RASC的keil电子时钟制作(瑞萨RA)(3)----使用J-Link烧写程序到瑞萨芯片
苹果13mini值得购买吗
壹凌电子聚合物电池“另谋出路” 迅速挖掘到新的市场机遇
RealMax乾是一款超大视场角的AR一体机 能带给参观者极致的沉浸式体验
WCDMA系统中物理信道的功率分配方式