2008-01-30 Wed
新书在china-pub的销售看起来不错,在计算机的大类目中,近7日排行上升到第一了。这可是计算机书籍的大类目,不仅仅是数据库的书籍。详情见:
http://www.china-pub.com/rank/?typeid=59&ordertype=0
Author:江枫 posted on Taobao.com
今天被一位朋友问到一个比较复杂的死锁,觉得有点意思,记录一下。数据库版本9206,死锁产生的trace文件包含如下信息:
---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TX-00090006-0002a8de 91 105 X 69 60 S
TX-0004002a-0002a7cb 69 60 X 91 105 S
session 105: DID 0001-005B-000001DD session 60: DID 0001-0045-00000077
session 60: DID 0001-0045-00000077 session 105: DID 0001-005B-000001DD
Rows waited on:
Session 60: obj - rowid = 000029E8 - AAANTUAAFAAAAAAAAA
(dictionary objn - 10728, file - 5, block - 0, slot - 0)
Session 105: obj - rowid = 00002829 - AAANTVAAFAAAAAAAAA
(dictionary objn - 10281, file - 5, block - 0, slot - 0)
导致死锁的两条sql,一条是session 105的insert,一条是session 60的update。
很明显,这不是数据行死锁,因为报出来的rowid中block为0,而且等待的是S锁,那么最有可能的是位图索引导致的死锁。然而很多情况下,位图索引死锁发生在同一个位图索引中,这里却有两个不同的obj:10728和10281。经过询问,这两个对象一个是位图索引,一个是B*tree索引,而且基于不同的列:
CREATE BITMAP INDEX WATOOL.SRV_PARTSINSTOCK_M_IND6 ON WATOOL.SRV_PARTSINSTOCK_M
(CRITERQTYINSTOCK, REMAINSUM, DELETEFLAG, BOSUM)
NOLOGGING
10281:
CREATE INDEX WATOOL.SRV_PARTSINSTOCK_M_IND3 ON WATOOL.SRV_PARTSINSTOCK_M
(DEALERCODE, PARTSCODE)
LOGGING
奇怪的是这里的B*Tree Index不是唯一索引,应该不会阻塞insert语句,也就不会产生上述的死锁。再问是不是有基于这个index的唯一约束存在,果然有如下主键:
CONSTRAINT SRV_PARTSINSTOCK_M_PK PRIMARY KEY (DEALERCODE, MAKERTYPE, PARTSCODE)
USING INDEX
TABLESPACE USERS;
到这里,死锁产生的原因基本上清楚了,B*Tree上的唯一约束阻塞insert,bitmap阻塞update,然后两个语句互相请求对方索引的某行被锁定的数据,导致了死锁的产生。
关于位图索引导致的死锁的原理,可以参考piner的文章。
Web retailer Amazon announced their fourth quarter earnings today and included some interesting figures on the state of their distributed computing products. Namely, web services bandwidth now accounts for more bandwidth than all of Amazon's global web sites combined. To put this in perspective, comScore ranked Amazon the 7th most visited site in the US in December. The retail giant was 6th in the UK, 9th in Canada, 11th in Germany, 11th in Japan, and 20th in France. In other words -- Amazon is big, which means AWS-powered sites must be really big (collectively, at least).
Adoption of Amazon Elastic Compute Cloud (EC2) and Amazon Simple Storage Service (S3) continues to grow. As an indicator of adoption, bandwidth utilized by these services in fourth quarter 2007 was even greater than bandwidth utilized in the same period by all of Amazon.com’s global websites combined.
As TechCrunch's Erick Schonfeld points out, "That means startups and other companies using Amazon’s Web-scale computing infrastructure now bigger collectively than Amazon.com, at least as measured by bandwidth usage."
Amazon also announced that there are now over 330,000 developers registered to use Amazon Web Services (AWS), an increase of 30,000 developers in the last quarter. Adoption of Amazon's platform is very likely helped by the over 200,000 developers who have signed up to use Facebook's platform. Amazon recently launched a specialized page for Facebook developers in an effort to court app developers to the AWS platform.
In November, Robert Scoble was in disbelief about the prospect of a serverless Internet company. Because of Amazon's web services, anyone can build a scalable web site without actually owning a single server -- and many companies are utilizing the service to do just that. "Let’s get this straight. Amazon used to be a book store," he wrote. "Now they are hosting virtualized servers for Internet companies."
A little over a year ago, Alex Iskold wrote about the Amazon web services stack, saying that it was "evidence of a new computing paradigm, where web services in aggregate give rise to a new web-based operating system." But Alex also conceded that small and medium sized businesses would be the first to get on board with Amazon's web scale computing platform. "Wall Street is not going to jump on this," he wrote.
Amazon's AWS success stories page still doesn't include any fellow members of the Fortune 500, but it does include a number of successful or well-funded web 2.0 start ups. The usage numbers released today indicate that even though Amazon isn't making a ton of money from their web services (TechCrunch guesses that AWS revenue was part of the $131 million "Other" category for the 4th quarter -- which includes other services and isn't much of the $5.7 billion in total Q4 revenue), they are striking a chord with developers and positioning themselves as a major provider of infrastructure services for an entire generation of web applications.
In oracle 10g documentation, it doesn’t mention 10g optimizer’s new features.
The documentation is not updated, it’s just coped from 9i’s :)
Here is the link:
http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/initparams142.htm#sthref
So we need to figure it out by ourself.
Here are my steps:
1. Create a temp table to store all parameters when optimizer_features_enable = 9.2.0
- SQL> show parameter optimizer_features_enable
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- optimizer_features_enable string 9.2.0
- SQL> create table params_9i
- 2 as
- 3 select ksppinm name, ksppstvl value, ksppdesc description
- 4 from x$ksppi x, x$ksppcv y
- 5 where (x.indx = y.indx)
- 6 order by name;
- Table created.
2. Change optimizer_features_enable to 10.2.0.2. BTW, this parameter can be changed online in 10g.
SQL> alter system set optimizer_features_enable=’10.2.0.2′;
System altered.
3. Create a temp table to store all parameters when optimizer_features_enable = 10.2.0.2
- SQL> show parameter optimizer_features_enable
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- optimizer_features_enable string 10.2.0.2
- SQL> create table params_10g
- 2 as
- 3 select ksppinm name, ksppstvl value, ksppdesc description
- 4 from x$ksppi x, x$ksppcv y
- 5 where (x.indx = y.indx)
- 6 order by name;
- Table created.
4. Compare the parameters:
- SQL> col value_9i format a30
- SQL> col value_10g format a30
- SQL> col name format a50
- SQL> select a.name,a.value value_9i,b.value value_10g
- 2 from params_9i a ,params_10g b
- 3 where a.name=b.name and a.value<>b.value
- 4 ;
- NAME VALUE_9I VALUE_10G
- -------------------------------------------------- ------------------------------ ------------------------------
- _bloom_filter_enabled FALSE TRUE
- _dimension_skip_null FALSE TRUE
- _gby_hash_aggregation_enabled FALSE TRUE
- _globalindex_pnum_filter_enabled FALSE TRUE
- _local_communication_costing_enabled FALSE TRUE
- _mmv_query_rewrite_enabled FALSE TRUE
- _optimizer_better_inlist_costing OFF ALL
- _optimizer_cbqt_no_size_restriction FALSE TRUE
- _optimizer_complex_pred_selectivity FALSE TRUE
- _optimizer_compute_index_stats FALSE TRUE
- _optimizer_connect_by_cost_based FALSE TRUE
- _optimizer_correct_sq_selectivity FALSE TRUE
- _optimizer_cost_based_transformation OFF LINEAR
- _optimizer_cost_hjsmj_multimatch FALSE TRUE
- _optimizer_dim_subq_join_sel FALSE TRUE
- _optimizer_enhanced_filter_push FALSE TRUE
- _optimizer_extended_cursor_sharing NONE UDO
- _optimizer_filter_pred_pullup FALSE TRUE
- _optimizer_join_elimination_enabled FALSE TRUE
- _optimizer_join_order_control 0 3
- _optimizer_join_sel_sanity_check FALSE TRUE
- _optimizer_or_expansion BREADTH DEPTH
- _optimizer_order_by_elimination_enabled FALSE TRUE
- _optimizer_outer_to_anti_enabled FALSE TRUE
- _optimizer_push_pred_cost_based FALSE TRUE
- _optimizer_rownum_pred_based_fkr FALSE TRUE
- _optimizer_squ_bottomup FALSE TRUE
- _optimizer_star_tran_in_with_clause FALSE TRUE
- _optimizer_transitivity_retain FALSE TRUE
- _optimizer_undo_cost_change 9.2.0 10.2.0.2
- _partition_view_enabled FALSE TRUE
- _push_join_union_view2 FALSE TRUE
- _px_pwg_enabled FALSE TRUE
- _query_rewrite_setopgrw_enable FALSE TRUE
- _remove_aggr_subquery FALSE TRUE
- _right_outer_hash_enable FALSE TRUE
- _selfjoin_mv_duplicates FALSE TRUE
- _sql_model_unfold_forloops COMPILE_TIME RUN_TIME
- optimizer_dynamic_sampling 1 2
- optimizer_features_enable 9.2.0 10.2.0.2
- optimizer_mode CHOOSE ALL_ROWS
- query_rewrite_enabled FALSE TRUE
- skip_unusable_indexes FALSE TRUE
数据:
create table t2(id number,attr varchar2(10),val varchar2(10));
insert into t2 values(1,’地区’,'HZ’);
insert into t2 values(1,’区号’,'0572′);
insert into t2 values(1,’类别’,'医药’);
insert into t2 values(2,’传真’,'0588′);
insert into t2 values(2,’类别’,'IT’);
insert into t2 values(3,’类别’,'IT’);
insert into t2 values(3,’地区’,'BJ’);
insert into t2 values(4,’性别’,'男’);
需求:
每个id下面的attr是唯一的。数据量不大。
要求把 attr=’地区’ 且 val=’HZ’的
同时满足 attr=’类别’ 且 val=’IT’的
的id取出来,前提是有这样的attr。
如果这个id下面没有attr=’地区’ 或者没有 attr=’类别’的值,也需要被取出来。
返回的结果是:id=2,4
解决方案:
大家集思广益,最终觉得这个方案比较好。
select id from (
select id,
max(case when attr=’地区’ then val else null end) t2,
max(case when attr=’类别’ then val else null end) t3
from t2
group by id
) where (t2=’HZ’ or t2 is null)
and (t3=’IT’ or t3 is null) ;
这样再传一个attr进来,只需要增加:
max(case when attr=’xx’ then val else null end) t4
和
and (t4=’xx’ or t4 is null) ;
我算是比较正式做VC了。很高兴和张颖和一个优秀的团队合作。同时,我仍然与宝宝树、诺凡麦、和两个目前还是秘密的公司创业,仍然会以一个创业与创投之间者的身份写博客。
新浪科技讯 1月30日17:25消息,据美国风险投资商经纬创投(Matrix Partners,下称“经纬创投”)确认,经纬中国第一期基金已于日前全部募集完毕,规模达到2.75亿美元。
原美国中经合集团董事总经理、中国区首席代表张颖(David Zhang)和原易趣网创始人、现诺凡麦医药董事长、美国经纬创投合伙人邵亦波(Bo Shao)成为该基金的联席管理合伙人。
在未来,经纬中国基金将专注于中国市场,在互联网、无线服务、新媒体、生命科学、环保科技、以及消费者产品与服务等领域寻找投资机会。
经纬创投正式入华
总部位于美国波士顿的经纬创投是美国历史最悠久的创业投资基金之一,专注于对早期创业型企业的投资,在美国与红杉投资、KPCB齐名。自1977年成立以来,经纬创投扶植了大量的成功企业,其中包括苹果电脑、联邦快递、SanDisk等。
“经纬创投在美国的成功来自于对创业者的严格甄选和对所投资企业的鼎力相助。我们想和每一个创业团队建立的关系,不仅表现在对某一创业团队的投资中,而更重要的是,我们希望这种关系能持续到这些创业者未来的每一次再创业中。”
邵亦波表示,在经纬创投30多年历史上,有很多创业者第二次甚至第三次创业,都选择与经纬创投再次合作。
据介绍,经纬中国将致力于投资高速成长的早期和扩张期企业,单笔投资额将从100万美元至2500万美元不等。结合邵亦波在互联网领域、张颖在新媒体和高科技领域的丰富投资经验,该基金将仍然以互联网、无线服务和新媒体见长。
而由于团队方面的扩充,这支基金也将会积极捕捉在生命科学、环保科技、以及消费者产品与服务方面的机会。
与中经合团队联手
张颖和他领导的中经合中国团队曾投资分众传媒、DivX、爱康国宾、全景图片、3G门户、傲游浏览器、大旗网、美兆体检等公司。
邵亦波对此表示,中经合的中国团队对待创业者的态度和投资理念与经纬创投不谋而合,很高兴能与张颖共事。经纬创投的管理合伙人Tim Barrows认为,张颖注重与中国的创业者建立长久的关系,其投资理念和经纬在美国的风格很一致。
张颖认为,经纬创投在美国、中经合在中国,都有着很悠久的历史和成功的投资经验。刘宇环创建的美国中经合集团早在1995年就在中国大陆设立了办公室,是中国风险投资界最富经验和最具影响的创业投资公司之一。自己的团队加上经纬创投的经验与资源,为经纬中国第一期基金的成功奠定了基础。他也指出,这支团队还将继续支持中经合原有投资的所有公司。
2007年4月,美国风险投资公司KPCB曾宣布在中国成立凯鹏华盈中国基金,其中国团队由原软银赛富基金合伙人周志雄(Joe Zhou)和华盈基金(TDF Capital)创始合伙人汝林琪(Tina Ju)领衔。
在业内人士看来,邵亦波的成功创业背景结合张颖在中国丰富的投资经验和人脉,以及两人共同倡导的投资理念,经纬中国基金有望成为中国早中期投资界的一支生力军。(马全智)
I’ve now had about 24 hours to play with the Mtron SSDs and had some time to benchmark them.
The good news is that the benchmarks look really solid. The drive is very competitive in terms of performance. I’m seeing about 100MB/s sequential read throughput and 80MB/s sequential write throughput.
I’ve had some time to benchmark them and they’re really holding up.
The bad news is that they can only do about 180 random writes per second. Here’s are the raw performance numbers from Mtron’s data sheet:

I spent a lot of time reviewing this drive and didn’t notice this before.
The Battleship Mtron review went over this as well but didn’t spend much time on it:
Although they do perform astounding in random read operation, random write is still very sub-par on flash technology. Even though we are not benchmarking random write IOP’s I will give you some quick insight. Write performance is not yet a perfect and refined process using NAND flash and you will not have a drive that is going to write file operations as well as a high end U320 15K SCSI or SATA 10K setup. There is a company that I have been talking with directly about this NAND flash write issue called EasyCo in PA, USA. They are working on a process called MFT technology and they offer a simple MFT driver that is claiming to increase random write IOP’s on a single drive up to 15,000 IOP’s. Doug Dumitru had explained to me this technology will take your standard Mtron 16GB Professional drive and turn it into an enterprise behemoth.
I spent some time to see what EasyCo was up to and came across their Managed Flash Technology:
Managed Flash Technology (MFT) is a patent pending invention that accelerates the random write performance of both Flash Disks and Hard Disks by as much as a thousand fold.
It does this by converting random writes into chained linear writes. These writes are then done at the composite linear write speed of all the drives present in the file volume, subject only to the bandwidth limits of the disk control mechanism. In practice, even with as few as three drives present, this can result in the writing of as many as 75,000 4-kilobyte blocks a second.
As a result, MFT can dramatically improve the real-time performance of asymmetric storage devices such as Flash disks by making reads and writes symmetrical. Here, flash disk performance is typically improved 10 to 30 times, making some of these 60 times as fast as the fastest hard disk. Finally, it is possible to make clusters of as few as 20 flash drives run collectively as fast as RAM does but with a much larger storage space than RAM can practically have.
The question is what are they doing to get such substantial performance?
Here’s what I think is happening.
From what I’ve read they take a normal Mtron drive and install a new Linux kernel module which they use to interface with the drive. They then use a normal write ahead log and keep data in memory (probably something like a 500M buffer) and a binary tree of the block offsets. When the buffer fills they then take the data in memory, sort the results by offset, and apply the buffer to disk sequentially.
If the box crashes they have an on disk log that they apply. Probably when the drive is first mounted.
Basically a flash aware write ahead log.
Fortunately, InnoDB has a write ahead log internally so this should save us from needing to run a custom kernel module. Any database with a write ahead log should be more than competitive.
I wrote a simple benchmarking utility (see Figure 1 below) to simulate an InnoDB box performing thousands of random reads and one sequential write.
The benchmark consists of 3500 dd process running in the background reading from the SSD and writing to /dev/null. I then have one sequential write performing in the foreground writing out about 5G of data to the SSD.
The HDD holds up really well when compared to the SSD which should have an unfair advantage. So much so that I think the Linux scheduler is interfering with my benchmark. I think that’s happening is that the first few dd’s start reading in parallel and block the remaining process. This continues with 5-10 concurrent readers until the entire chain of 3500 completes.
I’m going to rewrite the benchmark to create one large 10G file and randomly read 10G from misc locations.
As you can see while SSD is very fast but it’s only about 2.5x faster than HDD. I’d expect it to be about 20-40x faster.

Figure 1. Performance of SSD vs HDD (measured in seconds)

Okay, okay, we know this video was just us having some fun. But if you’re interested in hearing all of Fedora Project Leader Max Spevack’s speech, we have a nifty torrent you can grab.
The torrent version of the speech is in .ogg format, and approximately :30 long. Thanks to Max for getting that tracked for us!
We're looking for a DBA with strong LAMP background.
Specific Duties:
• Work with engineers on performance tuning, query optimization, index tuning.
• Monitor databases for problems and to diagnose where those problems are.
• Work with Senior DBA to maintain a scalable, reliable, and robust database environment.
• Build database tools and scripts to automate where possible.
• Support MySQL databases for production and development.
• Provide 24x7 escalated on-call support on a pager rotation.
Requirements & Education:
• 3-4+ years MySQL experience.
• 2+ years of experience as a MySQL DBA in a high traffic, transactional environment.
• 2+ years working in a LAMP environment, particularly PHP/MySQL combination.
• Proficient with database performance strategies.
• Proficient tuning MySQL processes and queries.
• Experience in administration of InnoDB
• Experience with MySQL Replication, with both Master-Slave and Master-Master replication.
• Ability to work cooperatively with software engineers and system administrators.
• Excellent communication skills
• Exceptional problem-solving expertise and attention to detail.
• BS in Computer Science or equivalent.
Bonus Points For:
• Experience with Data Sharding and federated architectures.
• Experience with multi-datacenter MySQL replication.
• Experience working in a social media environment.
Send me an email with your resume.
How do you query hundreds of gigabytes of new data each day streaming in from over 600 hyperactive servers? If you think this sounds like the perfect battle ground for a head-to-head skirmish in the great MapReduce Versus Database War, you would be correct.
Bill Boebel, CTO of Mailtrust (Rackspace's mail division), has generously provided a fascinating account of how they evolved their log processing system from an early amoeba'ic text file stored on each machine approach, to a Neandertholic relational database solution that just couldn't compete, and finally to a Homo sapien'ic Hadoop based solution that works wisely for them and has virtually unlimited scalability potential.
Rackspace faced a now familiar problem. Lots and lots of data streaming in. Where do you store all that data? How do you do anything useful with it? In the first version of their system logs were stored in flat text files and had to be manually searched by engineers logging into each individual machine. Then came a scripted version of the same process. The next big evolution was a single machine MySQL version. Inserts quickly became the bottleneck as the huge torrents of data flooding caused a lot of index churn. Perdiodic bulk loading was the remedy to this problem, but the shear size of the indexes slowed it down. Data was then broken into Merge Tables based on time so index updates weren't a problem. As more and more data this solution broke down with a combination of load and operational problems.
Facing exponential growth they spent about 3 months building a new log processing system using Hadoop (an open-source implementation of Google File System and MapReduce), Lucene and Solr. Moving to a partitioned MySQL data set was an option, but they thought it would only buy time until and a more scalable solution would need to be created in the future anyway. The future came a little early this year.
The advantage of their new system is that they can now look at their data in anyway they want:
This switch has changed how they run their business. Stu Hood nicely sums up the impact: "Now whenever we think of complex question about our customers’ usage patterns, we can pull the answer from our logs within hours via MapReduce. This is powerful stuff."
In the rest of this post Bill describes the evolution of their system and the forces that caused them to move from a relational database solution to a MapReduce system.
最近公司内很多人都看到和感受到一个词,那就是Team work。关于Teamwork,我有话要说。
什么是Teamwork
Teamwork的意思是团队合作,是指大家可以共同合作、相互支持、相互帮助、共同努力完成同一个任务。
teamwork反映的是人和人之间的合作和协助关系。teamwork很多时候表现为一种精神,或者一种境界,它不是一个可以明确界定和量化的东西。它是基于多人形成的团队之上的,脱离团队,单就一个人而言,不能说他有teamwork精神或没有teamwork精神。当一个团队内部的成员之间没有好的合作关系时,只能说这个团队没有teamwork精神,但不能说某一个人没有teamwork精神。
Teamwork的差异性
作为社会中的一个独立体,每一个都有自己独特的个性、脾气和为人处事风格,自然与周围的朋友和同事有着不同的远近亲疏的关系,而且这种关系还又可能会随着时间、心情、工作状态等各种因素的不同而变化。同一个人与能力相近的、或亲近的人之间合作关系自然较好,且相互之间能够有更多的沟通和协作。与能力相差较远、关系不好的人自然不会有说明好的合作关系。脱离了合作对象,脱离了合作环境,单纯地说这个人有teamwork精神或没有teamwork精神是一种非常无知的表现。这种做法完全忽略了人与人之间的差异性,忽略了不同团队中成员的差异性。用一个标准去要求不同的人是一个完全错误的做法。
Teamwork的形成
teamwork团队合作是一个需要很多时间相互磨合才可以形成的,它绝对不是一蹴而就或在短时间内就可以形成的。teamwork的形成要依靠团队内部所有人员共同和长期的努力和磨合。当然也需要团队外部各个部门的大力支持和协助,比如,公司的行政人事部在培养不同团队的teamwork过程中就负有重要的责任。没有行政人事部来创造更多的非工作之外的合作和交流机会,公司是很难形成一个好的teamwork精神。因此,如果一个公司内部没有形成好的teamwork,我觉得首先要批评的就是行政人事部。
一个团队能否形成teamwork精神的关键是这个团队中有没有一个好的领导者,甚至说有没有一个精神领袖。相信大家都可以看到,任何一个好的团队中都会有一个担当领导或领袖的人存在,其它的人员围绕在这个人周围,听从这个人的领导和指挥,大家想往一处想,力往一处使,共同努力来完成相同的任务。如果一个团队中处于领导地位的人不能最大程度地获得大家的认可,不同随时统一所有人的意见,每一次表决都有很多不同的声音,那这样的团队绝对不是具有teamwork精神的团队,甚至不是一个可以做出成绩的团队。这样的团队不如解散,把每个人的能力单独独都释放出来。
Teamwork不是大棒子
个人认为Teamwork团队合作不是一顶高帽子,不能想戴在谁的头上就戴在谁的头山,以此来表扬他。Teamwork团队合作更不是一个惩罚或打击某一个人的大棒子,想打谁就打谁,想什么时候打谁就什么时候打谁。
以前一直对写点什么和还能写点什么犹豫不决,再加上一月份忙了不少事情,所以虽然进入2008年了,但是还有很多事情仍然没有确定。
今天看到一个朋友的帖子,他说:
坚持Oracle DBA之路,今天拿到eygle的书《深入浅出Oracle--DBA入门、进阶与诊断案例》....
工作两年时间了,从刚开始的Java软件工程师,到技术支持工程师! 一直在想自己合适哪种职位,也看过很多所谓的职业规划.后来根据自己的性格,来确定我的Oracle DBA.....
从2007年的7月起下决心学习Oracle,决定做一名Oracle DBA,终于在2008年1月4日考过了OCA.现在都必须每天看Oracle 的书,一直就想看eygle的书《深入浅出Oracle--DBA入门、进阶与诊断案例》,在当当网上订购比较便宜,书钱51块,加2块的运费,共53块。刚收到很兴奋,刚想翻阅,领导过来了,让我写好文档,又有突发事情,去北京市政府处理事情.....
明天我将有两个小时的时间看eygle的书《深入浅出Oracle--DBA入门、进阶与诊断案例》。
这些话让我深受感动,虽然我的书有很多的缺点,但是很多朋友的确是拿着我的书在学习DBA、在准备成为一个DBA,这些期望让我感觉到压力也感觉到幸运,幸运的是我有这么多好的读者朋友。
所以,我要继续担负起对这本书的责任,在2008年1月份即将结束的日志,下定决心,先将这件事做起来,那就是修订《深入浅出Oracle》一书。
修订有很多工作要做,首先是一些结构上的调整,内容上的修正,还会补充一些Oracle11g的新特性,希望修订后的书能够对想要进入Oracle大门的朋友们有更多的指导作用。
我不能确定时间,但是我保证修订后的书比现在要好,对自己的作品负责,对我的读者负责,这是我可以说的话。
-The End-
相关文章|Related Articles
- 回顾成都的Oracle 11g发布会
- 在广州Oracle 11g发布会作主题演讲
- 在北京Oracle 11g发布会作主题演讲
- 《深入浅出Oracle》印刷万册纪念
- Oracle Database 11g中国Launch大会预告
评论数量(8)|Add Comments
本文网址:http://www.eygle.com/archives/2008/01/revise_head_first_oracle.html
農曆新年前,正是許多大師或老師頻頻高談闊論的季節,他們會對新的一年中名人、股市、甚至國家的運勢做出各種分析,這倒是讓我靈光乍現,想利用這個時間概略地分析一下2008編程語言的種種可能發展。
Java似乎會逐漸走下坡。J2ME受到Google Android、Adobe Flash Lite、.NET Compact Framework的衝擊;J2SE會受到.NET和AIR的衝擊;J2EE在中小型網站受到PHP、Ruby-on-Rails(RoR)很大的衝擊。幸好,目前大型企業好像還是買J2EE的帳。
在J2ME和J2SE方面,未來似乎JavaFX可以奮力一搏。而在J2EE方面,也有Groovy/Grails可以抵擋RoR。尤其目前大家懷疑PHP和RoR只適合用在中小型網站,大型企業網站似乎還是用J2EE比較安心。Groovy/Grails可以保障大家在J2EE上既有的投資。如果你是Java愛好者,最近有點想改用RoR,那麼你可以去看看Grails,或許你會因此想繼續留在Java陣營。
因為PHP對初學者相當友善,所以過去這幾年使用者數量增加快速,但是似乎已經到達了瓶頸,這可能是RoR造成的。隨著RoR推出新版,PHP會受到更大的挑戰。連主流開發工具廠商CodeGear都於2007年推出Ruby和PHP的開發工具,顯見這兩個語言似乎都會漸漸走入企業市場。
Python早就移植到.NET和Java,2008會持續推出修訂版本,而且也會推出全新的Python 3000。Python 3000不以相容於2.x版為目的,而是要運用過去培養出來的經驗,徹底翻新Python。目前Python編程員的需求已經超越Perl。
目標遠大是一件好事,但目標遠大卻沒有足夠的資源可以完成目標,就會陷入絕境。Perl 6就是這樣的例子,比.NET更早提出,但這幾年下來,.NET已經從1.0進入到3.5,Perl 6卻連1.0都還沒誕生。Perl原本最擅長文字資料處理,但是在大部分的語言都支援Regular Expression,且文字資料大量XML化之後,Perl的優勢已經消失了許多。在Perl論壇上有人揚言:「再不推出Perl 6,我們全都去改用Ruby算了!」目前,已經很少人使用Perl當開發語言,而是只用它當作系統管理的工具語言。
Ruby可能會在2008年推出2.0,加上2007年底已經推出的RoR 2.0,在2005~2010年之間,整個就是一股擋不住的氣勢。可能2008年底之前,Ruby在Tiobe的排行榜上就會超越Perl,只剩下Python和PHP這兩個對手了。
Web應用蔚為主流,而JavaScript又是瀏覽器的標準語言,所以這幾年來相當受到重視。2008年,在Adobe推出AIR,Mozilla推出Prism之後,JavaScript也可以開發出「某些種類」的桌面應用, JavaScript的用途變得更廣。JavaScript的兄弟ActionScript,會隨著AIR的推出稍微更受歡迎一些,但是Silverlight的推出,又會抵銷ActionScript成長的力道。
C#身為.NET平台最重要的語言,隨著.NET越來越普及,C#的重要性也跟著提升。
系統語言方面,C還是維持重要的地位,C++慢慢走下坡;D語言崛起,接收相當多C++的使用者,而Delphi則是一蹶不振,持續探底,當年Kylix/Delphi可以跨Windows/Linux的美夢已然遠颺。
多年來D語言平均一個月推出兩個版本,改版速度相當快,終於在2007年1月推出1.0版。而不出幾個月之後,又推出2.0版。1.0版持續做bug修訂,但盡量不加新特色,而2.0版則繼續進行實驗性的翻修。雖然D語言1.0正式才推出一年,但已經成為相當受歡迎的系統語言了,可惜至今沒有很好用的IDE。
未來幾年竄升力道最強的語言包括了Lua、PowerShell、Erlang,但是都還不至於成為主流語言。Lua是相當小的語言,適合嵌入其他的環境中,和其他語言一同使用;這幾年下來,Lua越來越受到大家的重視,尤其2007更是Lua大有斬獲的一年。隨著Vista系統的出貨,未來幾年PowerShell會成為相當重要的系統管理語言。多核心環境、網路分散式運算、容錯的需求,讓Erlang受到重視。
Vista的失誤,導致Mac OS市佔率在2008年初已經超過7 %,預計在2008年底會超過8%。但是大中華地區,MacOS市佔率仍相當低。2007/Q3的數據顯示,Apple iPhone在Smartphone的美國市場佔有率已經到達27%,超過Windows Mobile。繼美洲和歐洲之後,2008年iPhone會在亞洲開始販售,並推出第二代,也預計在2008年推出SDK,讓我們可以為iPhone寫原生(native)程式。
所以,如果你需要為Smartphone開發應用,除了考慮Windows Mobile之外,你也必須認真考慮MacOS了(iPhone使用精簡版的MacOS X)。MacOS X使用的語言是Objective-C。
這篇文章把標題定為「2008編程語言解盤」,其實是有一點誇張的。轉換語言的成本通常很高,所以一年之內,每個語言通常不會有太大的興衰變化,所以這篇文章其實是描述以2008為中心的數年期間整體狀況;把時間拉長,走勢會比較明顯,不受到短期震盪的影像,預測未來就不至於太離譜。這篇文章可以讓大家當作未來選擇語言的參考。
2008-01-29 Tue
2008-01-28 Mon
AnySQL.net
DBA notes
Oracle & Starcraft
eagle's home
给你点color see see
AnySQL.net English
Oracle Scratchpad
Oracle Life
Photos from dbanotes
Chanel [K]
xzh2000的博客
Oracle Security Blog
ERN空间
Eddie Awad's Blog
MySQL Performance Blog
The Tom Kyte Blog
del.icio.us/fenng/oracle
AIXpert
O'Reilly Databases
Red Hat Magazine
DBASupport
DB2 Magazine 中文版
developerWorks : AIX 专区的文章,教程
Pythian Group Blog » Log Buffer
车东[Blog^2]
blue_prince
玉面飞龙的BLOG
此生 今世
人生就是如此
Orange Tiger 木匠 的 移民生活
生活帮-LifeBang
Hey!! Sky!
dba on unix
Oracle Notes Wiki
Welcome to brotherxiao's Home
柔嘉维则@life.oracle.eng
Fenng's shared items in Google Reader
jametong's shared items in Google Reader
缥缈游侠-logzgh
Tanel Poder's blog: Core IT for geeks and pros
DBA Tools
ilonng
yangtingkun
NinGoo@Net
Oracle & Unix
Inside the Oracle Optimizer - Removing the black magic
Ricky's Test Blog
DBA@Taobao
存储部落
Think in 88
Alibaba DBA Team



