日期:2014-05-18  浏览次数:20479 次

深入理解原理,一切表面问题都是浮云
这是一个在任何领域都适用的规律。对于计算机这个相对更加面向思维的领域尤为如此。

就以SQL Server为例:

理解了SQL的理论基础——关系代数和关系理论,那么所有的查询语句将会像数学中的加减乘除一样简单明了。不会再觉得SQL的语法如何诡异(因为它与通常的编程语言有明显差别),不会再觉得子查询、DISTINCT、JOIN、GROUP BY如何绕人,也不会再干那种把SQL当一种编程语言把表当一种数据结构的吃力不讨好的事。

理解了SQL Server的数据类型,当你写下一个表达式时,你就能够知道SQLServer是怎么理解和处理这个表达式,而不会出现莫名的误会。同时,你也更能够随心所欲地将一个值转换为另一个你想要的结果。(其中datetime是一个大家经常会困扰的数据类型,参看该帖22楼。)

理解了SQL Server的字符编码和排序规则,varchar和nvarchar将能够更好地各司其职,你的字典里也将不再有“乱码”一词,只有字节、字符和编码规则的泾渭分明。(参看SQLServer中文处理)

理解了SQL特有的三值逻辑(Three-valued Logic, 3VL),NULL与NOT NULL将没有分别,不一不异。

理解了表和索引的存储机制,当你看到一个表,你可以透过SSMS的数据结果看到每一条记录每一个字段在磁盘里的排布,你可以知道一个CREATE INDEX将会增加多少的磁盘占用量,你也很容易明白怎么样的查询才能高效地使用索引,以及为何有时候查找索引还不如表扫描来得快。

理解了SQL Server的系统架构,当你按下F5执行一个语句时,你可以看到数据是如何在磁盘、内存、tempdb之间流转,也更容易明白为什么一个查询会慢,慢在哪里;你也能够事先料想到什么时候一个操作会让日志文件飞速膨胀,吃完你的磁盘空间。

理解了会话、事务和隔离级别,那么一个查询何时会等待、何时能读取、何时能修改,将一目了然。这是维护数据一致性和增强访问并发性的必备知识。

理解了SQL Server支持的动态语句,你可以更好地发挥它天使般的神奇功力,同时避免被它魔鬼的一面所伤及。

至于SQL Server的系统函数、系统过程、系统视图和命令,以及SSMS、sqlcmd、bcp、SSIS几种常用的工具,都是Hack SQL Server的必备技巧。翻翻联机丛书,了解了才能应用自如。

抓住本质,深入理解原理,一切表面问题都是浮云。

一点感慨。


p.s. 类似这种非求助性质的帖子,希望大家各抒己见。结帖时分数会给比较有想法的回复。

------解决方案--------------------
其实不是原理不知道,而是很多缺少实践,工具不会用而已,学生在学校学的原理够多,我就是一个例子,编程语言语法我都了解,逻辑思维也还好,就是很多编程工具不会用,或者说不熟悉,所以工资总上不去
------解决方案--------------------
探讨

弱弱地问两个问题:
2. CSDN论坛,左侧头像下方括号里的昵称在哪里改?没找着。
^___^|||

------解决方案--------------------
关系数据库的理论基础是集合论吧
------解决方案--------------------


不过感觉所论述的偏于开发,而且仅限于STORAGE ENGINE。再扩展出去的话,还是蛮多内容的,且不说与SSRS,SSAS组成的整个体系,跟OS关联的就够我们啃了。如果这些也啃下来,会更有万物皆浮云的感觉吧。
但原理毕竟是个基石,东西是学得越多,越发现自己了解得少的。。。比较不屑那种有两把刷子就天上飞的人,呵呵。

楼主貌似把inside T-SQL 啃得很熟了,而且能运用自如,境界确实不错,有时候认真也是种态度。

向楼主学习。


------解决方案--------------------
SQL code
惊诧于楼主五个裤衩,却只发帖7次……

------解决方案--------------------
恩,楼主把我想的都说出来了,支持一下。不过根据数据库的使用范围可能第个人需要偏重的方向不同。程序员对数据库的学习可能是集中于查询的写法,再延伸到查询效率方面。设计数据库的工作可能偏重于数据库理论和存储结构、需求分析之类的。DBA们则偏重系统视图和系统函数的功能,监测数据库状态,保证数据安全和数据库正常运行,除了数据库也要对硬件、网络、操作系统有所研究。
------解决方案--------------------
说得好,勿在浮沙筑高台,现在计算机技术发展迅速,各种衍生原理,便捷的开发工具,层出不穷,
让人应接不暇,
大量的程序员只停留在肤浅的应用层面,缺乏深入理解各种技术背后的设计思想。
“其实这些都是虚名,就像浮云一样。。。”
只有掌握其中的精髓。才能成为真正的高手专家。
------解决方案--------------------
深入理解需要环境,没有环境,难以深入理解。
这个环境指的是大数据量、多服务器(包括低配和高配)、SAN存储、甚至于小型机。
SQL Server在不同的硬件上表现是不同的。

写出纯熟的T-sql,仅仅是一个初级入门,即使特别是看上去相当花哨相当巧妙相当简炼的写法,却性能可能低下,没有大的数据量无法体会到这些,而CSDN上大部分问SQL问题的人都没有数据量来检测这些,换句话说来问这些问题的人,离深入理解还有距离,并且目的也只是为了完成某个任务而已。


------解决方案--------------------
其实,随着水平的不断提高,认识的不断加深,才会有LZ的领悟。如果一开始连招式都不熟悉,何来谈后面的深入理解。抽象是随着认识的不断加深而提高的,也就是LZ所谓的理解了原理。
可是在这之前,你要先练招式,才能练好内功。思想是最主要的东西,可是却是最不可捉摸的东东。不断地学习,不断地总结,抓住各种表像后面的本质,其实值得人一生的追求,认识世界,改造世界,这不就是我们一辈子要干的事情么。
纵观各位大师级别人物的各种论文,各种观点,无不透露出高水平的认知,对后辈的指导作用。祝福楼主,哪天也能写写文章,为后人指路。若可成,功德无量也!
------解决方案--------------------
hehe, 说得太好了,忍不住续貂一把。

经常看到有人遇到乱码问题,而最常见到的解决办法就是“试着转一下看看”,多试几种编码方式,一旦蒙对了就凑合着用。看着实在是揪心哪。

探讨
原理不是脱离实践的纯理论,而是对程序和工具内在工作机制的深入理解和把握。

我从来没有认为理论比实践更重要。这种争论没有意义,就好像争论爱因斯坦和爱迪生谁更伟大一样。