问题如下:
         1.char,varchar,nvarchar之间的区别
         2.MS SQL Server2005支持哪几种访问协议
         3.tempdb的作用
         4.Select * fron tableName where colName=NULL有什么问题
         5.join,in,exists的使用场景及取舍因素

        近段时间我使用这几个问题和一些开发人员进行了交流,其中不乏有工作3,5年,声称自己精通Oracle和MSSQL的人。不过结果却是很失望。

        OK,闲话不多说了。首先来看这几个问题所描述的领域。

        问题1,数据类型。这个问题所管理按到的背景知识是存储引擎。不同的数据类型是如何存储在存储介质上面的,定长、变长以及溢出数据在数据槽以及页面的组织方式。

        问题2,协议。这个问题关系到MS SQL Server内部体系结构。当客户端的请求到达服务器时,服务器是如何进行处理的,要经过哪些模块,每个模块都进行一些什么样的处理。

        问题3,系统数据库。这个问题涉及到是MS SQL Server的逻辑结构。SQL服务器和数据库引擎实例的关系,实例和各种服务(Reporting Service,Analisys Service)的关系,实例和数据库的关系,数据库和架构,架构和对象。一个这些逻辑结构中每个对象的作用,例如tempdb。

        问题4,关系理论。开发人员和DB关系最紧密之处就是SQL语言了,这就涉及到关系理论。这个是非常重要的,关系理论有的时候并不像我们想象的那样工作,比如MS SQL2005采用了3值逻辑(true,false,unknown),unknown如果不理解unknown就可能会导致返回非预期结果。

        问题5,查询引擎。如果说不不太理解存储引擎,还过得去,比如说在char,varchar,nvarchar之间永远选择nvarchar就可以了,程序不太会出问题。但是如果有人说精通SQL,那就一定要理解查询引擎。查询引擎是如何处理索引的,是如何处理表连接的。这都是非常关键的问题。

        从上面不难看出,作为一个好的面向数据的开发人员应该具有哪些数据库知识,这里以MS SQL Server为例(我基本上只懂这个)

        1.了解基本的关系理论,并且了解所使用的RDBMS是如何处理的。个人认为关系理论至关重要,因为对于开发人员来说,RDBMS中使用最多的就是SQL了,而SQL又是基于关系理论的。

        SQL语言本身观看上去是比较简单的。其实本来是应该叫SEQL(Structure Engilish Query Language),因为商业上原因的IBM才将其改为SQL。其声明式的设计理念导致其简单的使用方式。不过我认为SQL本身并不简单,众多的关键字,以及过于灵活的语法。

        学好SQL的基本前提就是理解关系理论(有人把关系和表之间的主外键关系划了等号,实在是汗啊),了解各种各样的谓词逻辑。

        2.熟悉所使用的RDBMS的逻辑和物理体系结构,这里指外部结构。从逻辑上来讲,例如MSSQL Server数据库引擎和实例之间的关系,实例和数据库的关系。以及数据库和其中的架构、对象的关系。物理上来讲的话,有哪些工作进程,每个工作进程的职责。数据库文件组的组成(mdf,ndf,ldf)。还要了解数据库的各种活动,例如如何与客户端通信(net library),使用什么格式交换数据(TDS),数据库运行周期中的活动(如check point)。

        3.熟悉内部体系结构。以MSSQL为例,至少应该知道其组成:协议,查询引擎、存储引擎、SQL OS API。还应了解每个模块提供了哪些具体的功能,是如何工作的。例如查询引擎是如何处理索引的,以及如何进行表连接或则排序。还有存储引擎是如何分别对待定长、变长、LOB数据的,以及聚集和非聚集索引的存储机制,事务处理的机制。如果还想深入的话了解一下各模块的实现。一般来说查询引擎会比较复杂,存储引擎是一个好的入口点(MySQL采用了插件式的存储引擎机制,InnoDB是一个很好的学习资源)。


        对于一些数据库的高级功能,我认为开发人员并不需要投入太多的去了解,只要知道有这些功能就可以了。虽然说对于商业化的RDBMS来说很重要,但毕竟是附加功能(MySQL中有些村存储引擎连事务都不支持还是有人用了)。核心的基本原理才是重要的。把了解数据库=会写SQL是完全错误的,因为就目前的大多数企业软件系统而言数据库都是核心软件。