1

用惯了ORM,居然不会写分页SQL了

 2 years ago
source link: https://www.cnblogs.com/bluedoctor/archive/2011/11/01/2232297.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

用惯了ORM,居然不会写分页SQL了

    最近准备找新工作,于是下午请了假,去上地软件园一家国内大型软件外包公司去面试架构师,从国贸到面试地点,坐地铁足足走了一个半小时,终于到了前台,联系了HR小姐,她声音都嘶哑了,然后叫了一位同事带我去一个小会议室等待技术面试官。

    面试官一进来,就跟我说,“刚才还在看你的PDF.NET框架,从网上下载了你的示例程序,我也是做ORM的,自己把NBear进行了深度改写,来,给我讲解下你的框架是怎么设计的...”。一听说都是搞ORM的,自然有共同语言了,我跟他说PDF.NET框架有3大特性:

1,数据表单控件;

2,ORM组件;

3,SQL-MAP组件;

然后给他详细说明了这几个东西的设计思想。

    说完了ORM,面试官对我的内存数据库很感兴趣,他说他们目前正在搞这个,想听听我的设计方案,刚好他也打开了我的《PDF.NET开发框架“内存数据库”架构设计 》这个页面,于是我就把内存数据库的原理跟他说了下,不过他更关心内存数据库支持分布式缓存和如何将数据写入数据库的问题,我强调说:内存数据库是一个整合的解决方案,目标是脱离RDBMS的限制,利用了.NET4.0的缓存管理,并封装了缓存接口,以便支持第3方缓存或者NoSQL数据库

    之后,又问了WCF方面的问题,是否使用Remoting,我说有了WCF本身已经封装了这个通讯方式了,WCF不仅可以使用HTTP,TCP,也可以使用SMTP作为通讯管道,并给他举例说了我们一个银行项目,采用邮件作为WCF的通讯管道,完成银行内网与我们公司局域网的信息交互问题(详细可以看《唯一不变的就是一直在变”--“数据”的华丽“变身术” 》)。

    其它又问了些SOA,MDA方面的问题,我也简要回答了,并举了例子,这里也就不复述了。

    最后,他问我PDF.NET框架的分页是怎么做的?我说框架会根据你输入的原始SQL语句,进行词法分析,自动组合成当前页的SQL语句(详细可以看《基于SQL词法分析的多种数据库自动分页方案 》),你已经下载了源码,可以看看。他说我不看了,我这里有一个数据库,你写给我看看。

    一听说还要这种方式来面试,心里就有点不舒服,另外用别人的笔记本键盘,非常不习惯,更加剧了我的焦躁情绪,头脑一片空白,不知道该怎么写了,但还是按耐住情绪,试着敲了一行SQL,结果还执行不过,这个场面,相当的尴尬,相当的难堪......

    楼主不是PDF.NET开发框架的作者么?ORM框架的编写者,居然不会写分页的SQL?会不会是李鬼?

    我的简历上写着自己有这个框架,的确为自己的在其它公司的面试增色不少,至今已经拿到4个Offer(建国路、国贸、望京、上地)了,没想到反而因为这个在这里遭遇滑铁卢,真是成也萧何,败也萧何阿,很是为自己暴汗一个!

    说实话,自从有了这个框架,真的很少写SQL了,那个分页SQL方案都是2006年的事情了,时间长了的确不记得了,于是我就直接说,时间很长了,自己不会了。

    看着我尴尬的样子,面试官又准备让我现场写个10进制转3进制的程序,但这个时候我毫无心情,直接拒绝了。

    下面的面试过程已经没啥意思了,我主动放弃了他的继续面试,于是我们又聊了些工作生活中的问题,他说他现在女儿都11个月了,但陪伴女儿的时间1个月都没有,虽然全家人都在北京,这让我很是震惊,这面试官要么是个工作狂,要么就是被外包公司变态的工作制度逼迫的,心里更加滋生了对软件外包工作的厌恶感,看来至少对我来说,外包不是适合的,之前本着"只要出价高哪怕做外包"的想法去面了几家外包公司,现在这个想法已经灰飞烟灭了!

    回到家,都已经8点半了,吃了饭,陪儿子玩了一小时,然后给他洗脸换衣服,给他讲了一小会儿故事,就让他妈妈哄他睡觉了,突然觉得,有时间陪儿子,是多么幸福的事情!

    之后,我打开电脑,在自己的Northwind数据库上,花了不到1分钟写出了那个分页SQL,不是今天面试官说的In,Not IN分页方式,也不是通常的双OrderBy方式,这是使用于千万级别数据分页的SQL语句:

--orderid 1:1028 10:10257 20:10267 30:10277
--查询第20-30条
select top 10 * from Orders where OrderID> 
(select max(OrderID) from 
  (select top 20 OrderID from Orders order by OrderID ASC ) t0
)
order by OrderID ASC 

PDF.NET开发框架对于SQLSERVER中,有整形主键字段的表,采取的就是这个高效分页方案。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK