![](http://images.cnitblog.com/blog/257159/201401/01233642-70b2437f66d74545bb946b65c4032af4.jpg)
这里一如既往的先感谢帮助过我的人(排名不分先后):
感谢微软公司、我的家人、博客园、宋沄剑、高文佳、听风吹雨、黄总、论坛里的怡红公子 、rmiao、KevinLiu328
我的同事、园子里的哥本哈士奇、stswordman、邀月等等等 ,还有很多很多人我需要感谢的
我在他们的帮助下不断成长~
关于SQLSERVER的开发
我一直很好奇,SQLSERVER这个软件到底有多少人在开发
后来我看了一篇文章:SQL Server Build系统
SQLSERVER要学习的内容
其实学习数据库有很多东西需要你掌握,不是说你学习了一两年的SQLSERVER,就能够说对于SQLSRVER非常精通
其实要学的东西还多着呢,没有多年的开发经验是很难精通SQLSERVER的,加上SQLSERVER的技术一直在更新
我觉得自己所掌握的SQLSERVER的东西还只是冰山一角
例如下面几项技术:
1、SQL Azure
2、SQLSERVER复制
3、SQLSERVER集群
4、SQLSERVER负载均衡
5、SQLSERVER插件开发
6、SQLSERVER BI开发
7、存储系统
现在技术日新月异,今天你学会了这个,微软明天在SQLSERVER出个新功能,你也要学习
在DBA的日常工作中,某些工作或者很多工作一般都会超出SQLSERVER联机丛书BOL(Books Online)的范畴
有些SQLSERVER的功能甚至在BOL里都没有提到,只能自己测试
所以学习是永无止境的,不单只对SQLSERVER的学习
为什么我选择写SQLSERVER方面的文章
博客园中的技术类文章非常多,编程,软件工程,运维,面试,算法等等
其中写数据库方面的文章也是获得最多人关注的一种技术文章之一
因为现在的程序大部分都离不开数据库,大部分都要用到数据库
写数据库方面的文章不仅C#技术人员可以看,PHP技术人员可以看,JAVA技术人员也可以看
而如果你写的是C#方面的文章,那么PHP技术人员并不想看,那么你的文章的关注率就会降低
而目前市面上主流数据库就那么几个,找工作的时候也比较好,如果公司用的C#技术,只会PHP的程序员不会去面试
编程语言这麽多,就算是主流的编程语言也有很多,有时候选择工作的范围也是比较窄的
大家可以看一下博客园里推荐博客排行榜里,排前10的就有两个是数据库专家!
计算机之路
从2007年开始说起吧
2007年:高考时候数学不合格,最喜欢的科目是英语,糊里糊涂就考入了广州某个大专院校,糊里糊涂就选择了“软件开发”专业
2008年:学习数据结构的时候特别对算法不感冒,无论怎麽听都不明白,想不到以后会做跟计算机相关的工作,虽然现在不是程序员
2009年:考试各科都合格,顺利拿到毕业证,但是对于前面的路很迷茫
2010年:在家乡的某个论坛认识了前一个公司的老板,老板在帖子里说亲自教授嵌入式编程,当时自己对计算机方面工作还是比较感兴趣
跟老板一起出差,到客户那里进行系统培训,出差回来就进入了公司,公司做的是油站管理系统,用的数据库是SQLSERVER,
慢慢开始研究SQLSERVER,但是真的算深入研究是从买了徐老师的《SQLSERVER企业级平台管理实践》这本书开始的~
跟大家一样,平时自己学习会买很多技术图书,其中有很多都当废纸卖给收废品的
如果你想要的话我可以免费给你,前提是邮费您们来付(到付),反正摆在家里也是当摆设
先到者先得,我会在文章结尾公布谁获得了我的书本
![](http://images.cnitblog.com/blog/257159/201310/23211935-9af46471735e4d6ea12fa4818c4d6fb0.jpg)
![](http://images.cnitblog.com/blog/257159/201310/23211951-cfa4609496e740669798ec6df3a41a8f.jpg)
![](http://images.cnitblog.com/blog/257159/201310/23212000-4b8be3dd95184cb78a65b485e91a237e.jpg)
![](http://images.cnitblog.com/blog/257159/201310/23212007-b4dcf30e66134cdfb70f1afd7bbadfcd.jpg)
![](http://images.cnitblog.com/blog/257159/201310/23212107-bb1bcfef23914c16a1e4947acbb8701e.jpg)
可以提供的书籍有:
FLASH CS4标准教程
Linux系统管理员职业技能鉴定教程
面向对象程序设计与VC++6.0教程
Windows server2003从入门到精通
AUTO CAD实用教程
VS2008高级编程
等级考试-二级JAVA语言
JAVA程序员上班那点事儿
从零开始学EXCEL VBA
C#应用程序设计教程
网店赢家淘宝新手开店7步通
ASP.NET案例教程
批处理命令在Windows操作中的典型应用
汇编语言程序设计教程第二版
Illustrator CS3 中文版
TCP/IP详解 卷1:协议
Microsoft .NET 企业级应用架构设计
程序员考试辅导
C++程序设计教程--基于VS2008
矛与盾 黑客就这几招
矛与盾 黑客攻防与脚本编程
WCF技术剖析
深入浅出WPF
留下您的联系方式:姓名,收货地址,手机,默认圆通快递
每人只能够取一本
某数据库大牛的话
数据库的变化,某一天我看到某位数据库大牛朱XX在新浪微博发了一条:
关键之关键在于数据库的内核:存储机理,索引机制,SQL编译器,优化机制,等等,
一般来说,数据库的小版本会改进优化机制,提供新函数,大版本可能就会提供新索引,改写SQL编译器等等,
但是如果真正改变存储机理,那一定是革命性变化。
我觉得这个也适用于SQLSERVER,SQLSERVER在SQLSERVER2005的时候,存储机理发生了比较大的变化,
然后到SQL2008、 SQL2008 R2、 SQL2012都没有多大变化存储机理,你掌握的个中原理也不会过时
我在这一年里大概做了哪些事
清华出版社某个机构博图轩找我出书,sql中国区产品经理叫我加入sql pass(可惜在北京),也有猎头找到我问我有没有兴趣跳槽
不过这些猎头很多都不靠谱,我写的是数据库方面的文章,他推荐一个在武汉的系统架构师的职位给我
因为他看到我在博客园里资料,当时我感兴趣的技术写了“架构设计”,不过现在我改了
![](http://images.cnitblog.com/blog/257159/201311/02123558-51fac313b80e405991114ea63e47dfb3.jpg)
博客园里的某位大侠叫我去上海微软去面试SQLERVER技术支持(最后因为比较穷,心里没有底怕掌握的姿势不够,怕面试不通过亏了就没有去了)
对于前一份工作中所犯的错误
经常在论坛或者QQ群里经常说到:DBA是随时都要准备简历的,万一做错了,你有可能承担不起
本人曾经就试过,就算是初学者都知道的问题你也可能会犯了,因为工作太累等等原因
虽然没有丢数据,但是因为我的出错,造成客户的数据错乱,让公司造成了损失
被领导训了一顿,并要写检讨书,这件事虽然没有扣工资,但是印象特别深刻
所以做任何重要操作前都需要备份,不然的话神仙也很难拯救您!
这个教训会伴随着我~
感谢博客园
博客园真的很好:1 人多 2 自定义js让不懂前端的人用简单的js能够装饰博客, 3上传图片方便,很多图片也不怕
关于数据库的优化
我客观的以我自己个人的观点讨论一下吧
在这里再说一下性能,性能这个东西真的不能一概而论,比如某篇文章《性能极高的分页存储过程》,
很多情况下,你的表有没有加索引,加的索引是不是对的
数据量是不是很大,有没有用其他技术,性能都跟这些有关系
网上有很多数据库调优的教条、文章,真的非常非常多,每次我都要去收藏这些文章,记住每一个教条
在哪种情况下用哪个教条去优化数据库,记不住了就在收藏的文章里找,现在我这种情况,好像用A文章的优化会比较好
但是B文章里的情况跟我现在的情况又匹配,究竟用哪个好呢???
当然啦,有部分文章还会误导人,有些文章中的环境跟你的环境又不一样,虽然情况一样,但是有可能因为数据库版本、操作系统版本不同会产生不一样的结果,
最后用了也白搭
如果你还停留在我上面所描述的阶段,那么你应该要系统地学习一下数据库
结合实战经验,多动手做实验才是硬道理
说到这里让我想起了之前某件事情:
我曾经在博问里问过一个问题
“请问什么叫索引对齐?什么叫稠密索引 什么叫稀疏索引?”
当时网上没有一篇文章能够说得很清楚,很明白,都是你抄我的文章,我抄你的文章
无奈之后只有在博问里问高手了,我是一个非常喜欢寻根问底的人,不懂的东西一定要找遍互联网
除非真的找不到答案,不然的话我不会罢休的
当时有一个小虾三级给了我这样一个回复
![](http://images.cnitblog.com/blog/257159/201310/05232819-175052aa4b9a40f9bda3ff0b67373d25.jpg)
我当时无语了,一直到现在我还是没有明白“什么叫稠密索引 什么叫稀疏索引?”
这个博问帖子我到现在还没有结贴o(∩_∩)o
其实要做大牛真的要经常看下面的网站里的博客文章,从中去吸收,我发觉基本上都是英文资料,学习起来非常吃力
我希望有更多人去写书,去写像《SQLSERVER企业级管理平台实践》这样的有深度的书,或者翻译下面网站的
一些博客,然后刊登在书本里就好了
![](http://images.cnitblog.com/blog/257159/201310/21181643-be1c0fcf0f1c4d3fb3648426c20168a5.jpg)
关于技术屏蔽
这里说的技术指的是不泄露公司机密信息的情况下
比如下面这个场景
比如:两个MVP在同一个部门,某天MVP大侠A遇到数据库问题,MVP大侠A说索引太宽了
MVP大侠B不知道宽索引、窄索引,想请教MVP大侠A,但是MVP大侠A一副高高在上的样子
最后,MVP大侠B走了
我想如果MVP大侠A能够使用一些方式例如写博客、讨论、白板等工具来跟MVP大侠B沟通,结果肯定不一样
(至于什么是宽索引,什么是窄索引我也不是很清楚)
可惜大部分公司都不是这样
没有大家互相切磋的平台,MVP大侠B不会进步,当然不是说谁的水平高的问题,大家交流一起进步
才是最重要的,不是的话,辞职是迟早的事情 ,或者会进入一个恶性循环
内部培训
员工可以选择自己感兴趣的技术讲座
有时候小公司(这里针对某些小公司不是全部)真的不适合新手,虽然做了很多项目但是充其量只能是熟手不能是大侠,
小公司没有培训,很多制度不完善,打杂的活特别多
最重要缺少的是交流和分享,交流和分享从何而来?
网上、公司内部培训 、外面的技术沙龙(技术沙龙的内容讲的内容不一定是你们在使用的)所以关键还是公司内部培训
网上的交流毕竟是有限的,面对面的交流才是最重要的!提高大家研究公司所使用的技术的兴趣
对于博客园里面的每个读者和博主
我这里有一个愿望:
对于博主:希望读者反对的时候留下您们反对的声音、意见,不要按一下“反对”按钮,拍拍屁股就走了,
每个博主都希望听取反对者的真实的反对声音,进一步改进自己的文章
对于读者:一篇好文章基本上都会有反对,不是一味地推荐,有反对的文章证明博文的题材比较有争议性
既然有反对,证明这篇文章值得去看,有读者对此有不同的观点,如果只有推荐,那么大家都一味崇拜博主
认为博主很牛,不动手验证一下,那么对读者是没有好处的
我这里的愿望不单只针对我自己写的博文,园子里的所有博主和读者应该都是这样希望吧o(∩_∩)o
在出差的时候看到吉日大师的书
在2013年11月份去了南宁出差,由于酒店离南宁书城(朝阳广场附近)很近
夜晚刚食完饭,就到处瞎逛,刚好路过南宁书城,进去肯定光顾一下计算机板块
刚好看到吉日大师的书,我翻了几页没有买,里面写了吉日大师如何从低级程序员干到高级程序员,书里面他说了如何学习NEC公司的系统架构
他的经历真的值得我们学习,我也希望有一天能把自己的经历整理成书
![](http://images.cnitblog.com/blog/257159/201311/13210939-233d843c05f24b55ae9aa42b5a4ad10f.jpg)
不过最后我还是买了这本书,作为技术人员不能总是看技术书籍的,有时候也需要放松一下的o(∩_∩)o
![](http://images.cnitblog.com/blog/257159/201311/30202617-dc3ded23b8594febba0d5d733cc88f51.jpg)
井底之蛙
其实有时候我也觉得自己是井底之蛙,为什麽这样说?
大家可以看一下这篇文章:Buffer Latch Timeout的解析
下面是文章中的内容:
下面是一个案例分析。我们在数据库的错误日志里,发现有下面的错误,并且产生了一个内存转储。
A time-out occurred while waiting for buffer latch -- type 2, bp 0000000088FBFA40, page 1:153568, stat 0xc0010b, database id: 10, allocation unit Id: 72057594047758336, task 0x000000000C8E2988 : 0, waittime 300, flags 0x1a, owning task 0x0000000005A2F048. Not continuing to wait.
下面是对内存转储的的分析,为了简单起见,不相关的调用堆栈被省略。
我们可以看到,下面的这个进程在获取Buffer Latch的时候,由于无法及时得到Latch锁,产生了上述错误信息,并生成一个内存转储。
0a 00000026`ebe09350 00000000`0215d1b8 sqlservr!CDmpDump::Dump+0x7c
0b 00000026`ebe093a0 00000000`0215dd0c sqlservr!SQLDumperLibraryInvoke+0x1a0
0c 00000026`ebe093d0 00000000`021503f7 sqlservr!CImageHelper::DoMiniDump+0x3d4
0d 00000026`ebe095d0 00000000`0206af82 sqlservr!stackTrace+0x82b
0e 00000026`ebe0ab20 00000000`02069f69 sqlservr!LatchBase::DumpOnTimeoutIfNeeded+0x19a
0f 00000026`ebe0abf0 00000000`008e7bcc sqlservr!LatchBase::PrintWarning+0x205
10 00000026`ebe0ace0 00000000`000e7a29 sqlservr!LatchBase::Suspend+0xd12
11 00000026`ebe0b950 00000000`000a0689 sqlservr!LatchBase::AcquireInternal+0x1ff
12 00000026`ebe0b9f0 00000000`000a1792 sqlservr!BUF::AcquireLatch+0x8d
13 00000026`ebe0bd10 00000000`000a166c sqlservr!BPool::Get+0xc7
14 00000026`ebe0bd70 00000000`000a35a0 sqlservr!PageRef::Fix+0xbc
15 00000026`ebe0bdd0 00000000`000a320a sqlservr!BTreeMgr::Seek+0x44d
16 00000026`ebe0bff0 00000000`000a2e5d sqlservr!BTreeMgr::GetHPageIdWithKey+0x20a
17 00000026`ebe0c070 00000000`000a38e8 sqlservr!IndexPageManager::GetPageWithKey+0xbd
这时,错误信息中的owning task地址0x0000000005A2F048对于问题的分析就很重要了。
我们通过owning task的地址,结合内存转储分析,可以找到对应于该owning task的进程编号。
其调用堆栈如下:
0:175> kM
# Child-SP RetAddr Call Site
00 00000026`f027fa68 000007fe`fcd910dc ntdll!ZwWaitForSingleObject+0xa
01 00000026`f027fa70 00000000`00083b1a KERNELBASE!WaitForSingleObjectEx+0x79
02 00000026`f027fb10 00000000`00082d76 sqlservr!SOS_Scheduler::SwitchContext+0x26d
03 00000026`f027ffa0 00000000`00082700 sqlservr!SOS_Scheduler::SuspendNonPreemptive+0xca
04 00000026`f027ffe0 00000000`000829ac sqlservr!SOS_Scheduler::Suspend+0x2d
05 00000026`f0280010 00000000`000e7e46 sqlservr!EventInternal<Spinlock<153,1,0> >::Wait+0x1a8
06 00000026`f0280060 00000000`000e7a29 sqlservr!LatchBase::Suspend+0x599
07 00000026`f0280cd0 00000000`00645aac sqlservr!LatchBase::AcquireInternal+0x1ff
08 00000026`f0280d70 00000000`00646a49 sqlservr!SQLServerLogMgr::GrowAFile+0x7c
09 00000026`f0281150 00000000`000cb38b sqlservr!SQLServerLogMgr::ReserveAndAppend+0x1fb
0a 00000026`f0281290 00000000`000cbe89 sqlservr!XdesRMReadWrite::GenerateLogRec+0x567
0b 00000026`f02813d0 00000000`000cbc23 sqlservr!XdesRMReadWrite::LogBeginXact+0x243
0c 00000026`f0281530 00000000`000cbc3f sqlservr!XdesRMReadWrite::MakeActive+0x64
0d 00000026`f0281560 00000000`001746c1 sqlservr!XdesRMReadWrite::GenerateLogRec+0x87
0e 00000026`f02816a0 00000000`00174860 sqlservr!PageRef::ModifyRow+0xce0
0f 00000026`f02818f0 00000000`00176749 sqlservr!PageRef::ModifyColumnsInternal+0x1b3
10 00000026`f0281b50 00000000`00175f71 sqlservr!IndexPageRef::Modify+0x2fd3
上面的调用堆栈显示,这是在增长数据库日志文件。
由于数据库日志无法及时增长完成,因此导致了这个线程长时间拥有Latch锁而不释放,而其他进程无法及时获取相应的Latch锁。
到现在我还没有看明白在哪里可以看出数据库日志文件在增长?
要看懂调用堆栈需要熟悉Windows的底层和SQLSERVER的内部原理,才知道SQLSERVER在做什么操作
关于梦想驱动
各位程序员肯定或多或少听过事件驱动,领域驱动这些软件开发概念
就像事件驱动
百度百科的解释:鼠标的一个点击,移动,键盘的按键按下等等操作,都是对应操作系统的一个事件,然后应用程序接受你的操作进行处理
那么人呢?
我们每天起床、刷牙、洗脸、上班、吃饭、下班/加班、睡觉究竟为了什么???
人由什么来驱动??
我觉得是由梦想来驱动,有了梦想我们就有了目标,可以追的目标
正因为有梦想驱动着我们,我们觉得每天的生活才有意义,您们说对吗?
我自己的梦想,嘻嘻,不方便透露了,希望不那么晚实现就行o(∩_∩)o
如何写一篇好文章
写出一个好软件需要重构您的代码,写文章也是一样,要重构您的文章,重构您的语言文字
文章出品时间
其实这篇文章我在2013年9月已经写好了,一直保存为草稿,一直在修改,一直在补充,希望在拿到MVP那天将自己的所有想法爆发出来
文章标题我改了,感觉只有心路历程没有想说的话比较单薄,而且心路历程刚毕业3年多没有太多要说的
![](http://images.cnitblog.com/blog/257159/201310/23213407-5c7945b767544129b78894fa3575990c.jpg)
如果拿不到MVP,可能这些想法就会一直埋藏了
![](http://images.cnitblog.com/blog/257159/201311/02232242-f7f37bc647bd4de58c0404d3c523c67f.jpg)
这就是我的心路历程
有人说:当云计算普及之后,DBA这个职位就会消失了,无论DBA这个职位消失与否,我希望喜欢数据库的人还能做着数据库的相关工作
无论是业余的还是平常工作中,就算是业余的,我相信您在未来的某一天可以找到一份自己喜欢的DBA的工作的
以上为个人观点,如有不对的地方,欢迎大家拍砖o(∩_∩)o