昨天长春的天气让人倍感生活丰富多彩。早上的时候是阴天,然后下了场小雨,小雨还没停,转成下雪。大雪,全年无休,春天以后每天一场,大家正期待这场有能耐的大雪持续到五一节。先是小雪,然后开始刮风,等风把雪吹成斜斜的线条的时候,转成了大雪片子。中午以前,大雪停了,出太阳。太阳晒了一会,起风,终于开始了正常的春天,沙尘暴开始了。
沙尘暴一直没停,到晚上九十点钟,PM10飙升至重度污染。尚未结束供暖期,但是暖气早就停了好几天,大家宅在家里,穿上羽绒服唱热水,透过玻璃看灯光照亮的满天沙子,听外面鬼哭一样的风声。
不过毕竟还是有过阳光,有点阳光,不然这日子可怎么过下去。今天和包师弟还有ZHUMAO分别讨论,解决了两个很有意思的小问题。
一. 解析解
跟包师弟先是听大李yang同学报告stm32的板子加以太网,与PC机间进行socket通信。然后去包师弟家,包师弟给我讲循环伏安法的实验参数间的约束关系,我把它们写成方程。我们打算把方程给偶像,然后看看是否可以有些合作。偶像当时问过我,你们的方程都要求什么计算。我说,有加减乘除,有指数对数啥的,没有找一堆数的最大值最小值。实践表明,有找最大值最小值这种运算。而且在最后一个方程里,我还看到了递代。
我说,这算什么运算,可咋写成方程啊。我还不知道偶像他们是否接受不是方程的东西。
包师弟说:是啊,原理就是这样,我也不知道用方程怎么表示。
我说,迭代啊,然后我讲了段故事。
故事的背景是大李yang同学每周五跟我讨论SICP上的题目,半个小时。那个时间正好是我七八节课和九十节课的课间,我们共进晚快餐,并讨论SICP上他感兴趣的题目。前两周有道题目,是证明斐波那契数列的递归或迭代算法,其结果等价于一个公式。当时我也不知道怎么证,只知道他给出的穷举测试是不够强有力的。回家查了下google,有位牛人给出了不到半屏的证明,提到一个词,我们都熟悉,但是似乎又忘记了,齐次线性方程的特征根。我又查了一下wikipedia,发现前人们早有结论,迭代算法可以等价于齐次线性方程的特征根的什么什么。
所以,我说,至少我们可以用齐次啥啥的把这个迭代法的公式写出来,是一堆指数和lambda什么的。
然后我俩闲扯了一会儿,我说,这个东西估计是个经典算法,就是咱们不知道它的名字啊……然后包师弟给我讲了一下这个迭代的原理是咋出来的。
这时,这一天的阳光时刻到了。我指着其中一行说,这个就是个公式啊,这不就是什么什么然后再什么什么吗。包师弟说,听着倒是像,不知道是不是等价。我请大李yang同学把包师弟的代码和我的公式分别实现一下。此时,包师弟在厨房开始炒菜,一边跟我们说,mvs设成多少多少,rs设成多少多少,再试一次;大李yang同学靠墙坐地板上,本子搁腿上pilipala敲键盘;我在包师弟找到一个木鱼,做成青蛙的形状,它嘴里叼个小木棍,拿这个小木棍刮它的后背,就发出蛙鸣,声音还非常像,我这个时候就负责刮它的后背,感叹,"真是什么牛人都有啊,这也能做出来。"
目前为止,我的公式与包师弟的迭代看起来还是等价的。这个公式的价值不在于让代码从五六行缩为一行,或者执行效率有多么高。让我兴奋的是,这是一个实例,我十多年前考研究生的时候寻找的东西,问题的解析解。虽然只是一个实例,正如阳光虽然只露了那么一下头,也足够令人高兴一下。
二. 有些人那么值钱的原因
跟包师弟讨论其间,给ZHUMAO打个电话,说,你们啥啥服务器坏了啊,我从什么什么链路上去,估计哪哪的用户也访问不到了啊,你们赶紧修吧,别让人投诉了啊。
ZHUMAO片刻之后说,修好了,然后说,你在哪呐。我说我在包师弟家,他说,你回不回家啊。我说,回,我没跟包师弟"在一起"。他说,那你吃完饭到我这来吧,我十点才走。然后,我和包师弟"分手"以后,就去找ZHUMAO。
去找ZHUMAO的过程挺现代化的。我在图书馆门口掏出一卡通,嘀,然后推三脚滚闸进门,上电梯,穿过阅览室,来来往往很多同学,空气里全是人味。刷卡,嘀,通过东北特色馆藏,灯明瓦亮空间开阔,一个工作人员对着墙沉思,画什么图。往里走,再刷卡,嘀,进门,看见大间办公室,办公室里很多小隔间,很多机器,嗡嗡地响,ZHUMAO一个人缩得小小的,坐在角落里。
我俩跟谁也没看见谁似的,我卸护膝护腰,他在那pilipala摘键盘。我说,你整啥呢。他给我看,你看,这个东西整差不多了。
我说,咋这么慢捏。
他说,是啊,在mysql里也没这么慢呢。
我凑过去看屏幕,他用JSP写的东西,从oracle里select东西。
我说,是,oracle值钱,值钱的都这样?
值钱的东西倒底比不值钱的东西好在哪里,有很多个故事,以后再说。
1. 你用 sqlplus 执行一下你那几个语句试试。
还是慢。
这个测试的动机是,分离性能问题的原因,到底是JSP,还是数据库部分。
我又抻头过去看,如果不贴到显示器上,我基本上啥也看不到。我说,哎呀,你用的不是我给你的select语句啊。他说,都一样。我说,别扯了,我看好几个字母都不一样,你查下我邮件,试试我的。
试了,还是慢。
2。我说,你加索引了吗?
加了啊。
在哪呢,你给我看看。
这呢。他展示了两个索引。
我说,那就是索引名字,我也不知道你索引的是哪个字段啊。
怎么显示索引的是哪个字段啊。
我也不知道。
重建一个吧。
好。
ZHUMAO又建了个索引,用我的SQL语句,在sqlplus上执行。啪,结果就出来了,瞬间。
ZHUMAO指着结果,但是数据不对啊,这都些什么玩意。
3. 对比一下我的语句和他的语句,啊,我没加 order by
所以顺序是乱的。加上,结果对了。
然后他用JSP一跑,完了,速度又下来了。JSP里一共两条SQL语句,一个升序排列的,一个降序排列的。我们刚才只测试了升序的,再单独在sqlplus下跑了一下降序的,非常慢。原来是降序那句把整个速度拖下来了。
4. 降序
也建索引了啊,这二分法查找,升序和降序还不一样吗。我自言自语,这建的都是啥索引呐。我的意思是,这都是些什么糟烂索引。ZHUMAO很正经和权威地回答,建的是B+树索引。
我突然想起来,B+树升序和降序好像根本不一样。我也不确认,不过,再建一个没有啥负面影响。
我们又建了降序的索引,select速度还是不行。至此,我算陷入绝境了,唯一知道的是,要么索引没建上,要么没用上。于是,我转去研究桌上的一根 不锈钢棍子,以前从来没见过。有不到20厘米长,直径二三厘米,上机标着USA。我说这是值更的时候砸坏人的么。ZHUMAO说,不是,这是签到的。我说做成这样干啥。他说,怕值更的人把它破坏了。我哈哈笑,脑海中浮现出ZHUMAO穿着教父里美国警察的制服,手里拎着个大手电筒一样的,银光闪闪的家伙,一边走,一边往沿墙的一排暖气片上嗑,当当当当地走过走廊。
我说,还是google吧,索引这玩意可能没那么简单。ZHUMAO说,不用了,我有书。一会他指着一行字给我看,优化器不知道你建立了索引,然后给我念一行代码,让我加在select里,告诉它用哪个索引。
瞬间,结果就出来了。性能问题完全没有了。
ZHUMAO拿的那本书一点也不厚,估计也就100页左右,名字叫《Oracle索引技术》。
我说,我现在知道为什么有些人那么值钱了,oracle dba的存在是有原因的啊。他们不会花费大半个晚上,才解决这种加上一行就能解决的问题,他们都是在问题上瞄上一眼,然后说,在这个位置锯开,把线圈去掉三匝。
新拍的照片和画在这里 [http://www.douban.com/photos/album/100752322/]。
--------------------
博客会手工同步到以下地址: