无论你写了什么、做了什么、别人都觉得你没啥的、写得不好、不深入,给你泼N多冷水,但是往往这些泼冷水的家伙往往大多是狗屁不是的家伙,甚至大多是马甲而已,有本事大家都多写写文章,用文章、用实力来证明写得更好就足可以让大家心服口服了。
我为了鼓励其他同行写文章,几乎觉得写得不错的文章,都给推荐+1,这是无形的支持与鼓励,举手之劳而已,但是能给人很多鼓舞了,先讲购买他的软件产品,至少点一下推荐+1,又不花费力气,也不用花钱,的确从他的文章里学到了知识、自己也提高了,那就顺手点一下推荐+1,难道就想要个这么简单的回报,都那么难?搞软件开发的都吝啬小气到这个程度了?
正文部分
============================================================================================
1:今年公司里有一些人辞职了,他们大多都觉得在公司没有发挥潜能的机会、没被公司重视、没给足够高的薪水或者其它单位有更高的薪水。
2:公司有一个2000W条数据的Oralce查询功能,运行速度有些缓慢,但是一直没人能有效解决这个问题,或者对此没啥兴趣爱好。
3:有一部分人觉得,自己不是干数据库技术的,有些人觉得这个事情不管他的事情,有些人觉得这个没办法解决,但是客户的反应有些强烈。
4:这个事情也变成了老板、项目经理、客户经理的一块心病,甚至影响了整个项目的验收及收款,我们只能迎难而上。
当老板把这个任务压到我们开发部头上时,我们逃也逃不掉,虽然我们平时是写C#程序为主,但是数据库性能优化也只能由我们自己做:
当时觉得需要2周时间有希望能解决,1周熟悉业务及数据结构,另1周用来性能优化,我也是新来的,对项目不熟悉、功能也不熟悉,所以觉得需要2周时间也是天经地义的,但是老板说必须要解决这个问题而且只能给1周时间。
没办法的事情老板的命令下来了只能执行,要们就丢这个饭碗,我就跟我们公司的一个搭档承担了这个攻坚任务。
曾经很多年前,优化过别人的MYSQL的数据库查询优化,当时公司里有个牛B轰轰的程序员,觉得自己的数学水平高、编写程序思路也很严,平时谁也不服,也不把别人放在眼里的那种,当他有一个数据量很大的程序运行效率比较低时,老板让我看看是否能提高性能,我足足用了半个小时,优化了他的SQL语句,结果性能提高了10倍,只用了1/10的运行时间就可以了,这次成功的SQL优化,给了我很大的信心,而且开始对性能优化有了很高的兴趣。
后来几年里看了很多数据库方面的资料,但是一直没遇到过能发挥实力的机会,也学了很多数据库脚本编成,但是一直没机会能露两手,不过自己一直是对数据库优化很有信心了,平时也很自信。
但是最近几年,心思没在数据库优化上了,大多是用在“大规模编程系统架构优化”上,而且Oralce没有用也有好几年了,开始也不敢吹了,毕竟不是天天干这个的,时代发展得也快,新技术都没留意过了。
自己没信心了,那就先找找这方面的专家,看看人家有没有什么好的建议吧,我和我的搭档就开始这个痛苦的数据库优化工作了。
01:先找集团内部的资源,找名气比较大的专业的数据库管理员,给了我们一些建议系统底层优化的建议,对我们没实质性的进展,失败。
02:只能硬着头皮与同事们一起深入研究,发现SQL语句也很复杂,并没有想象的那么简单。
03:把比较复杂的SQL语句先分解成若干个简单的SQL语句,运行、失望,性能影响不大,失败。
05:里面有些多余的字段被SELECT出来的字段,去掉了,没有明显的进展,影响不大,失败。
06:SELECT 出来的东西,再进行了SUM操作,感觉内存里的处理数据过大,先进行SUM,再进行SELECT,没有明显的进展,影响不大,失败。
07:把2000W条数据的表,拆开成若干个表,每个表达该500W条数据,没有明显的进展,影响不大,失败。
08:修改数据类型,把数值类型的长度、精度在变小点儿,影响不大,失败。
09:数值类型比较,例如日期类型的比较,不要转成字符再比较,人家已经这么做了,没这方面的缺陷。
11:查询条件的先后顺序调整,影响不大,失败。
12:将过滤条件放到子语句里,选出来的数据尽量小一些,影响不大,失败。
13:再看看索引,以前的开发人员索引设置得也比较合理,而且他们告诉我们,他们做测试优化索引,耗时会更多,去掉索引反而还会好一些。
14:经过这8个步骤,我是有些失望了、心情沉重,但是我不能把这个表现出现,还是继续表现得很自信,不管遇到什么困难,都需要给自己打气、给自己信心,男人要坚强、只能靠自己了。
15:接下来足足想了一晚上,问题会出在哪里?数据库的极限能力是多少?找谁咨询?2000W条数据不应该是Oracle的性能瓶颈呀,问题应该是我们身上。
16:继续坚信问题应该是在设置索引上,继续把重点突破口放在深入索引设置上,按不同的组合、不同的索引方式进行优化。
17:索引优化后,奇迹出现了,性能提高了100倍,唉,这下不用丢饭碗了谢天谢地了,问题搞定了,可以给老板一个交待了,老天不想灭我们2个呀。
18:不管是干啥,都需要靠自己,不要指望靠别人能解决问题,关键时刻,一定要对自己时刻打气、始终需要保持必胜的信念。
2000W条数据的性能优化,我跟搭档一起努力做到了,下一次目标是2亿条数据的性能优化瓶颈了,还是照样需要有信心的。
去年做的是百万元RMB级别的信息管理系统,今年开始在做千万元RMB级别的信息管理系统,将来会是亿元RMB级别的信息管理系统了,还是照样需要有信心的。
每天、每年都在挑战自己能力的极限,每年身心都会死三回,每次挺过来了都会升华三回,需要记住职场不同情弱者。
想要当个过硬的技术主管不仅需要有“心灵鸡汤”、还需要拿实力证明的,老板不需要“心灵鸡汤”。
以下是千万级Oracle数据库性能优化的前后对比表,Oracle为什么那么值钱,唉、不服不行啊、这就叫科学技术,哪{yt}我若能做到了就是死也愿意了。
每个软件公司都有很多问题在困扰着老板、客户,只有能及时解决这些棘手问题的人,才是公司最需要的人才,很可能机会就摆在你眼前,其实你也可以的。
posted on 2010-05-01 22:17 阅读(2250)
评论
对于数据库的优化方法理论,是不分平台的。不论是oracle还是sql server ,优化的方法步骤和理论是相同的,尽管在实现的具体细节中可能会有稍许不同。
对于数据库优化的方法论,已经有前人总结出一套了,推荐你看三部分内容:
1. SQL SERVER 2000 技术内幕,《查询处理器》这一章。它会告诉你很多关于查询处理器工作的细节内容。让你对SQL SERVER 引擎收到一个SQL 语句之后,都做了些什么,以及在查询执行的过程中是怎么做的有一个较为全面的理解。
2. SQL SERVER 2005 T-SQL 查询的《优化的方法论》这一小节的内容。它会告诉你怎么查找出数据库中性能有问题的部分及SQL。
3. SQL SERVER 2005 T-SQL 查询的《索引优化的等级》这一部分的内容。它会告诉你各种扫描/查找(也就是如何利用索引)的成本开销的大致情况。以及在各种环境下如何将索引的访问方法优化到{zy}。
而对于你所遇到的,由客户直接反映出"问题所在"的性能问题,我想“ NineFlowers”已经告诉了你按照什么步骤去做优化了。
大家都不是神仙,不可能把所有的问题,都能1分钟内解决好,呵呵。
首先,我谢谢你的回复,mssql的性能优化,大家还是很自信的,但是会微软的数据库与折腾Oralce数据库,还是有很大的差别,一个人会熟练的优化微软的数据库,未必能在短时间内就能优化Oralce数据库,但是给的时间足够长,那是90%是应该能搞定的,但是对于{dj1}的数据库优化,我还是不认可的这一点的。
为什么Oralce的数据库优化专家就那么值钱,SQLServer的数据库优化专家相对就不太值钱了,呵呵,很简单的道理就明显的摆在我们眼前的,还是有很大的区别的。
优秀的的Oralce优化专家,不算{dj0}的,大概年薪20万以上的很普遍的吧,但是没怎么听说过优秀的SQLServer优化专家轻松有20万以上的。
但是没怎么听说过优秀的SQLServer优化专家轻松有20万以上的。
(数据库的使用存在一个历史问题,随着SQL SERVER 逐步步入各个大企业的核心业务,得高薪的SQL SERVER 从业者会越来越多,尽管我无法确定当前SQL SERVER 的从业者是不是拿高薪“较不普遍”)
但是Oralce,用什么工具?用什么功能?怎么看?看哪里?都很容易是一头雾水的,有时候想顺利连接上数据库,不懂的、没用过的人还需要折腾个半死的,sqlserver 我老婆都可以轻易的连接上服务器的,这就是差别。
你举得“在Oralce里建立一个类似SQLServer的数据库”例子,说明了你知道“Oracle中可以建立类似SQL SERVER 数据库”,这个可以建立就是“理论”。
而对于“足足花费了1天”,只是表表明了其实现上和SQL SERVER 有不同。
回到本文,理论就是“你应该知道通过查询计划去确定问题”
而实现是“在oracle 中通过oracle的方法调出执行计划”
而显然,本文中表明你“不知道通过查询计划去确定问题”
晚了,睡觉了,明天还有事情....
Oracle很多组件都是单独购买的,而不是类似sql server一样,企业版全部打包。Oracle买了企业版之后,什么Data Mining啊,OLAP啊,Reporting services啊,XML support啊,等等,都是一个一个单独需要另行购买的组件,你到Oracle官方网站上可以看到一大串列表。我想Oracle也未必没有执行计划查看器吧,或许是你们没有购买,呵呵。执行计划查看器是优化数据库最重要的方式,因为可以直观的看到{zh1}数据库是如何的执行一条sql语句。
我想多数人可能都和我一样,非常想知道你是如何优化这个索引的?
数据库性能的优化是一门学问,也可以说是经验,索引的优化只是其中之一。
我个人认为,要想真正提高数据库的性能,还是要从数据结构上下功夫,从表的设计上下功夫,从业务逻辑上下功夫。象你举的SELECE与SUM的例子,就是数据表的设计不合理,并不能从索引上做根本的解决。
如果有这样一个报表:
每个月的销售占比,估算一下领导看到这个表至少需要:
2*12=24秒,
还是不能满足要求的,要适时使用数据仓库的工具了。
综合来说,还是个软件架构问题,和索引关系不是很大。
(意思是说:现在的做法是治标;因为只有从架构的角度,才能从根上解决和此相关的所有问题)
==》从另外的一个侧面,说明你们公司的DBA,根本不称职,或狗屁不通
(或者没有DBA职位)
Oracle不管{dj0}的轻松上20W以上?你给的?
"没怎么听说过优秀的SQLServer优化专家轻松有20万以上"
这说明你没在这个圈子里而已,现在很多公司在招SQL Server DBA,薪水都能达到15-20k/mon.
不清楚不要紧,不清楚还拿出来说就是你的不对了。。
很高兴看到你这么优美的标题名称,我也经常碰见上亿级的ORACLE数据库查询计算优化问题(我们是专业开发电力行业软件的,所以数据量特别大).我们知道,ORACLE数据库优化方面的技术很多,除了最常用的索引之外,比如你还可以使用内存表技术等.
但看了你的索引优化之后,"按不同的组合、不同的索引方式进行优化"没看清楚具体怎么优化的方法(或许咋是小菜).依我看来,索引优化的方法也很多,并且索引优化这个"名词性的口号"好象大家都知道.能够给出具体案例吗,呵呵,这样也才有说服力.......
这点上支持吉日。现在的新人啊,把饭都摆到眼前了,还怪你不拿勺喂他。
这很可能表明你还嫩一些,相对有水平的、有点儿基础的人,看个文章的大概就明白是什么意思了,呵呵,看来你还需继续提高了再来读这个文章了,不好意思啊,不是我没写出来知识点,是你没能理解而已,不能怪我了。
笨笨的考拉熊兄,你的这个观点我就不太同意.我认为"技术"方面的问题一定要精细化,讲清楚,说明白,而不是点到为止.尤其是这类"优化"话题.
就像我现在说VS2010功能很强大,你能够知道它具体在那些方便表现很强大吗?"如果这时候你再来问我具体强大在那些方面,我说你怎么连这么基础的问题还要问啊,那你去学学VS2010具体功能再来问这个问题吧..."
之所以大家喜欢老赵的文章,因为老赵讲问题很清楚很透彻,就像前段时间写的<<数组排序方法的性能比较系列>>,难到你会说这么基础的数组排序问题还需要讲吗.....
呵呵,{zh1}声明,咋不是针对个人,就事论事而已,千万不要引起不愉快...
我想多数人可能都和我一样,非常想知道你是如何优化这个索引的?
数据库性能的优化是一门学问,也可以说是经验,索引的优化只是其中之一。
我个人认为,要想真正提高数据库的性能,还是要从数据结构上下功夫,从表的设计上下功夫,从业务逻辑上下功夫。象你举的SELECE与SUM的例子,就是数据表的设计不合理,并不能从索引上做根本的解决。
----------------------------------------
貌似*日的文章都能看到你在鼓风吹浪,一直强调什么鸡汤,你提出的问题,他给你解答了么?有人有了疑问,提出来,*日正面回复过么?这就是你所谓的鸡汤?至于你曾经在*日要滚蛋的文章中为其辩护说海洋的文章看不懂什么的,可是至少海洋的文章没那么多废话,很实在,也许只是他写文章的逻辑还没整清楚,所以让人理解起来很难,反观*日的他自认为的技术文章,其实大多数文字都是废话或者就是忽悠人,只有一两句结论才说到正题上,可是又不讲清楚或者给点思路(又不要直接给代码什么的),更不会在回帖中回答相关的技术问题,不知道是故意的(也就说可能要付费什么的)还是他自己都不怎么清楚。你自己可以从头看*日的文章。
如果这就是你所谓的鸡汤,希望你能坚持喝下去。
@卡通一下
貌似*日的文章都能看到你在鼓风吹浪,一直强调什么鸡汤,你提出的问题,他给你解答了么?......
如果这就是你所谓的鸡汤,希望你能坚持喝下去。
我能得到您的关注,很是荣幸;同时也为吉日感到荣幸,这说明你也经常光顾吉日的博客,不是吗?
至于你说我是鼓风吹浪,一直强调什么鸡汤,那是因为我在喝汤之前,一定要鼓起腮帮子吹去浮油,否则喝多了对身体不好。如果非要说我,那就当我是个汤勺吧,就是来和弄鸡汤的,呵呵...
对于吉日,你恨也好、骂也好、怒也好,毕竟你自己的内心还是想来看看热闹,否则你怎么知道吉日的那么多事情呢?
我曾与吉日开玩笑,说看他的文章一定要把文章的推荐数和反对数加在一起算,如果平淡无奇,到是索然无味!你看吉日文章有那么高的阅读数,不也能说明问题吗?
说到海洋,我觉得海洋的写作态度要比吉日严肃,也很是可爱,呵呵!
海洋的文章不便在此评论,还是到海洋的博客上再说吧。
{zh1},我要说的是博客园中的一些文章,是属于“心灵鸡汤”类的,是用来滋润人们心灵的,而不是用来学习技术的。如果这类文章能引起您的共鸣,那说明您的心灵确实需要“鸡汤”;如果引起您的反感,那您还是快快地倒掉...
我自己既不需要“鸡汤”,也不反感,因为我就是一个大汤勺!
哈哈...
我也是解决了温饱问题,生活无忧、工作无忧、家庭无忧,才能有这么多空写写文章,扯扯蛋,真的哪个人也能跟我一样,能静下心来写来写去又赚不到钱啥的,还是需要付出很多精力、代价的,不是吹的一般人写个几百篇原创文章,还是没那么容易的,很多人的知识一方面是没的什么好写,很可能都不知道能写些什么,不管怎么样,在能写,也能得到大家的点击,已经很不错了,很成功了。
很多人,多么想吸引人家的目光,都很难啊,我的点击量、回复量有时候也很让我知足了,大家都懒得看了,那我就离失败越来越近了。
只看老赵的吵架文。技术性文章看多了不一定好,限制思路是一方面,另一方面,给你多个选择,意志不坚定的会在各种选择之间摇摆。我经常写东西,经验是:写小说,一定不能多看小说。我培养我lp写小说,结果看了2年,杂七杂八的看了一大堆,没写出两千字出来,为什么呢?没自信。写小说,不要看小说,而是想到一个卖点,就写,然后修改,修改再修改。做技术也是,一个问题或需求,先实现,再修改修改再修改。。。
@卡通一下
貌似*日的文章都能看到你在鼓风吹浪,一直强调什么鸡汤,你提出的问题,他给你解答了么?......
如果这就是你所谓的鸡汤,希望你能坚持喝下去。
我能得到您的关注,很是荣幸;同时也为吉日感到荣幸,这说明你也经常光顾吉日的博客,不是吗?
至于你说我是鼓风吹浪,一直强调什么鸡汤,那是因为我在喝汤之前,一定要鼓起腮帮子吹去浮油,否则喝多了对身体不好。如果非要说我,那就当我是个汤勺吧,就是来和弄鸡汤的,呵呵...
对于吉日,你恨也好、骂也好、怒也好,毕竟你自己的内心还是想来看看热闹,否则你怎么知道吉日的那么多事情呢?
我曾与吉日开玩笑,说看他的文章一定要把文章的推荐数和反对数加在一起算,如果平淡无奇,到是索然无味!你看吉日文章有那么高的阅读数,不也能说明问题吗?
说到海洋,我觉得海洋的写作态度要比吉日严肃,也很是可爱,呵呵!
海洋的文章不便在此评论,还是到海洋的博客上再说吧。
{zh1},我要说的是博客园中的一些文章,是属于“心灵鸡汤”类的,是用来滋润人们心灵的,而不是用来学习技术的。如果这类文章能引起您的共鸣,那说明您的心灵确实需要“鸡汤”;如果引起您的反感,那您还是快快地倒掉...
我自己既不需要“鸡汤”,也不反感,因为我就是一个大汤勺!
哈哈...
-----------------
不看行吗?非得每篇文章往首页放,假如你让他放到候选区,或者干脆去新手区(反正你也说了他的文章是给新手看的),阅读数超100都难,再说那个阅读数也没什么意义,又不是不能刷。
海洋是个严肃的人,但是他也乐于分享,至少你对文章提到的技术有啥问题,他看到了也会互相讨论,据理力争都没关系,总比发出来丢在那不管,别人有了技术疑问,就沉默或者指责别人没看懂什么的,你觉得博客弄成这样,又总是发到首页,还装委屈说博客园不容他,csdn抢着邀请,这样有啥意义?
既然你把*日的文章当鸡汤,没当他的文章是技术的,那又何必提什么技术问题了?
后面也不没啥好说的,都扯太远了,您请继续享用,我先找地方吐去。
@马伟
我经常写东西,经验是:写小说,一定不能多看小说。我培养我lp写小说,结果看了2年,杂七杂八的看了一大堆,没写出两千字出来,为什么呢?没自信。。。
说到自信,我觉得这是最根本的东西,无论做什么事,如果缺乏自信,那什么也做不好。
对于一个自信满满地人来说,看看吉日的文章也没有什么;但对于缺乏自信的人来说,就可能引发焦躁、不安、愤怒,继而引发口水。
其实吉日文章大家看多了,只要一见到标题,就能猜出是吉日文,只是有些人还是忍不住,非要“窥一窥”,然后猛烈地抨击,以彰显自己的正义。更有些人还要到边上吐一吐,不是很好笑吗?
@卡通一下
海洋的文章没法看啊,南辕北辙。
海洋应当是一个非常有激情的人,他能把自己关在屋内尽情地“造车”。也许他没有多少实战的经验,可他的那份投入,他的那份努力,还是令人感动的。
我们每个人所处的环境不一样,海洋也应当有他自己的一份天地,我还是给予深深地理解。
海洋的文章确实有些东拉西扯的,宽容一些地看,也是挺有意思的。
刚刚看到“世界因你不同”的{zh1}一句,“成功并没有{jd1}的意义,成功,就是做{zh0}的自己,并把{zh0}的你呈现出来”
是啊!我们是否把自己做到{zh0}了呢?
这点上支持吉日。现在的新人啊,把饭都摆到眼前了,还怪你不拿勺喂他。
这很可能表明你还嫩一些,相对有水平的、有点儿基础的人,看个文章的大概就明白是什么意思了,呵呵,看来你还需继续提高了再来读这个文章了,不好意思啊,不是我没写出来知识点,是你没能理解而已,不能怪我了。
笨笨的考拉熊兄,你的这个观点我就不太同意.我认为"技术"方面的问题一定要精细化,讲清楚,说明白,而不是点到为止.尤其是这类"优化"话题.
...
呵呵,马兄多虑了,讨论观点而已么,不至于的。
我写文章也是喜欢讲得非常细致的,可以看看我的博客,有的文章我是每一步操作都要截图的。而且一项技术,从操作到原理都会说到,读者照着文章操作,甚至可以一点脑筋不动就做出来。而不是像吉日这样一带而过。
这里我说的不是不要细节,而是说如何写文章是根据每个人的风格不同决定的。一盘文章写的详细,能教会你知识,哪应该心怀感激;如果写的不细,也没啥好说的。因为作者不欠你什么,没必要为你没有学到东西而负责。
不过现在博客园的首页也是够乱的了,真是林子大了啥鸟都有,什么破文章都敢往上放,前几天我都忍不住差点开骂了。我发首页的宗旨只有一条,那就是确保这篇文章肯定对别人的实际工作有帮助才会放,像吉日的这篇文章,以我的标准不但首页,连新手区我都不会放的,只会归档在文章里,为以后做个参考。
不管是Oracle/SQL Server也好,要做好优化,关键是要了解他们的机制,然后采取楼上几位XDJM的优化建议和意见来分析问题,然后制定方案来解决问题,这样的话做到一定的优化还是可以的。当然了,要是系统的架构有问题的话,你可以提升性能的空间的天花板也是很快要被touch的,在那时候得找找别的出路了,一切到{zh1}都是空间和时间的平衡,关键在于自己的取舍。
换个角度来说,单纯讨论Oracle/MS SQL产品其实是无意义的,花钱买了别人的产品,还帮别人吹牛,这样的话难道厂商就会给你打折了吗?No Way!所以没必要进行产品好坏之争,除非Oracle/MS给你们发红包。