123
 123

Tip: 看不到本站引用 Flickr 的图片? 下载 Firefox Access Flickr 插件 | AD: 订阅 DBA notes --

2008-07-15 Tue

19:32 MySQL命令行的几个用法(续二) (3650 Bytes) » NinGoo@Net

Author:NinGoo posted on NinGoo.net

前面两篇(看这里,看这里)介绍了MySQL命令行的一些技巧,这里再介绍下通过配置文件来设置MySQL命令行的这些参数。

通过/etc/my.cnf配置文件的[mysql]部分,可以设置MySQL命令行的一些运行参数。例如:

[mysql]
prompt=\\u@\\d \\r:\\m:\\s>
pager='less -S'
tee='/tmp/mysql.log'

通过prompt设置显示用户名,当前数据库和当前时间,注意在配置文件里最好使用双斜杠:

root@poster 10:26:35>

通过pager设置使用less来显示查询结果,-S表示截断超过屏幕宽度的行,一行太长MySQL的显示格式就显得很乱,如果要看完整的行,建议使用\G将行垂直输出。当然,你也可以添加更多less的参数来控制输出。

tee则将MySQL执行的所有输出保存到一个日志文件中,即使使用less -S截断了超长行,在日志中还是会记录整个的结果,另外,前面通过prompt设置了当前时间显示,这样也便于在日志文件中查看每次操作的时间。由于tee的结果是附加到文件中的,日志文件需要定期清除。


Related Articles

PermLink: http://www.ningoo.net/html/2008/mysql_cmdline_configuration.html

Add Comments(0) | Follow NinGoo@Twitter | Google Reader

bookmark

18:59 估低了P590的CPU利用率 (3951 Bytes) » AnySQL.net

作者:AnySQL, 订阅AnySQL, Oracle数据库恢复及服务, Sybase恢复, 磁盘及RAID恢复

    在oramon程序的AIX版本中, 增加了CPU利用率的显示, 以便更好地观察数据库服务器的运行情况, 如下所示:

www.alipay.com  Load SY/WT/US  Rq
07/16-08:45:51  1.64  8/21/15  18
07/16-08:46:01  1.78  5/20/12  20
07/16-08:46:11  1.90  7/22/16  23
07/16-08:46:21  1.91  6/21/13  23
07/16-08:46:31  1.92  5/22/12  14
07/16-08:46:41  1.78  4/21/11  10
07/16-08:46:51  2.05  5/21/14  19
07/16-08:47:01  2.28  4/21/11  12

    一直都相信通过libperfstat接口计算出来的值, 并且一直以为CPU利用率很低, 我们的P590够强大. 直到有一天, 用topas看时, 突然间注意到SYS和USER这两个值总是比我程序中输出的高一倍左右, 也就是oramon程序中显示的CPU利用率偏低了, 只有WIO是正常的. 问题在哪儿呢?

    原来设置SMP支持选项后, 在操作系统中一个物理的CPU被看成了两个逻辑CPU了, 相当于超线程的概念了. 这样做可以提升CPU的处理能力, 查网上资料, 有人分析说, 在Power 5的芯片上可以提升30%, 在Power 6的芯片上可以提升40%的性能. 而oramon程序中, 就是取了按逻辑CPU算的值, 而不是按物理CPU算的值, 因此利用率大约相差了一倍.

    在perfstat_cpu_total_t结构中, 我原来取的是下面四个值:

sys, user, idle, waits

    改成取另外四个值来计算就行了:

psys, puser, pidle, pwaits

    IBM的东西太不懂, 有人要自已编写AIX上的性能监控程序的话, 可以去搜索一下libperfstat, 或参考这个网页.

相关文章 | Related Artiles

我要留言(当前0)

18:39 Save 15 mins downtime by tuning the sequence. (3130 Bytes) » DBA Tools

Author: AnySQL, published on dbatools.net

    I were doing some Oracle tuning jobs in last two weeks, and got a SQL like following :

INSERT /*+ APPEND */ INTO B
  SELECT /*+ PARALLEL(A,4) FULL(A) */
        SEQ_B.NEXTVAL, A.*
FROM A;

    The table size of A is 25GB, contains 100m rows. We are running Oracle on IBM P590, the stroage is EMC DMX4, but it still take us 26 mins. Of cause we cannot afford the long duration. The problem is about the sequence, getting the next value is too slow. The original sequence cache is 20. Then I change the script as following :

ALTER SEQUENCE SEQ_B CACHE 2000;
INSERT /*+ APPEND */ INTO B
  SELECT /*+ PARALLEL(A,4) FULL(A) */
        SEQ_B.NEXTVAL, A.*
FROM A;
ALTER SEQUENCE SEQ_B CACHE 20;

    Now it takes 10 mins, which is acceptable for us. Tuning the sequence saves us 15 mins.

Related Posts

Leave New Comment(Current: 0)

Link: http://www.dbatools.net/experience/oracle_tuning_sequence.html

16:23 2-for-1: Interviews with Zmanda and Linux Foundation execs and an explanation of the Firestar settlement (1987 Bytes) » Red Hat Magazine

Remember Barton George? If you kept up with our Summit posts, then you’re familiar with Sun’s Linux guy, who was all over Boston blogging, podcasting, and interviewing. He’s back home now, but still putting together podcasts from his trip. Catch the two newest ones: Talking with Zmanda’s CEO, Chander Kant and Chattin’ with The Linux Foundation’s Executive Director, Jim “Led” Zemlin.

Also just in from the Red Hat News blog: One of our legal counsel penned a reader’s guide to the Firestar settlement. Totally worth reading if you’re at all interested in IP, licensing, and–in particular–the defensibility of the GPL.

15:34 软件测试基础-Alpha和Beta (3097 Bytes) » Ricky's Test Blog

软件产品的生命周期,我们经常说到Alpha测试,Beta测试(其实还有Gamma, Delta测试),软件发布的时候经常看到RC, RTM,这些究竟是如何界定的,发布阶段到底怎么划分的,我们今天就看看wiki的解释

A software release is the distribution, whether public or private, of an initial or new and upgraded version of a computer software product. Each time a software program or system is changed, the software engineers and company doing the work decide on how to distribute the program or system, or changes to that program or system. Software patches are one method of distributing the changes, as are downloads and compact discs.
Software release stages

Software release stages

The software release life cycle is composed of different stages that describe the stability of a piece of software and the amount of development it requires before final release. Each major version of a product usually goes through a stage when new features are added, or the alpha stage; a stage when it is being actively debugged, or the beta stage; and finally a stage when all important bugs have been removed, or the stable stage. Intermediate stages may also be recognized. The stages may be formally announced and regulated by the project’s developers, but sometimes the terms are used informally to describe the state of a product. Conventionally, code names are often used by many companies for versions prior to the release of the product, though the actual product and features are rarely secret.
(more…)


12:21 咚咚咚咚 (1218 Bytes) » Chanel [K]

留言破万,这个世界上一定没有几个人吧?
你应该感到自豪啦,不是吗?
要快乐哦。

11:10 VISA的次优选择 (220 Bytes) » Fenng's shared items in Google Reader
Visa未能如愿入股银联,或通过组建合资公司进入中国市场,MasterCard也面临同样选择
09:33 一个树形聚集SQL问题(二) (699 Bytes) » yangtingkun
看到ITPUB上一个帖子,感觉楼主的需要比较有意思,于是尝试了一下。问题源自:http://www.itpub.net/thread-1020586-1-1.html上一篇给出了一个SQL实现,不过由于不是很清楚楼主的含义,加上测试数据过于简单,没有将问题完全展现,因此第一篇给出的SQL并不能完全满足需要。这篇根据新的测试数据来构造求解的SQL。一个树形聚集SQL问题(一):http://yangtingkun.itpub.net/post/468/466388虽然上一篇给出的SQL能得到正确的结果,但是真正的情况比测试中要复杂很多,树形的分叉并非只可能存在于第一层,而是在任一层都可能包括多个叶节点。...
07:30 Oracle: MOVE vs SHRINK Commands (176 Bytes) » DBASupport
This article discusses re-organizing a table using the move and shrink commands, then compares how the rows are compacted within Oracle blocks and how row chaining is resolved.
02:07 SNS网站的用户流失率怎么会高得如此惊人? (18403 Bytes) » Fenng's shared items in Google Reader

作者: robbin  链接:http://robbin.javaeye.com/blog/215054  发表时间: 2008年07月15日

声明:本文系JavaEye网站发布的原创博客文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!

平生第一次博客转载别人的文章,原文作者是51.com的高管黄绍麟
---------------------------------------------------------

作者:黄绍麟


◎用户典型的SNS体验

甲先生是个普通白领,白天工作使用互联网找资料连络客户,下班后回家偶而会上网闲逛。互联网是他日常接触的媒介,但是在他生命中这个东西并不显得特别重要,至少他不是天天泡在网上的人。然而最近几个月来,他老是收到一堆电子邮件,标题大部分写著「某某人加你为好友」之类的。顺著连接过去看,是自己MSN 上面的朋友。既然是朋友的邀请,总是不怎么好意思拒绝,想想也就注册加入。于是,甲先生先后加入Facebook,MySpace ,Friendster,LinkedIn ,还有一堆中文的本地网站。而注册这些网站总是十分痛苦,每个网站都叫他填写过去经历,上传照片,还要贡献MSN 上的好友清单。

刚开始他担心这些朋友是不是会常来拜访他的个人空间,而他如果不知情,没回访,是很不礼貌的。这种来自人际关系的压力颇大,搞得他有段时间下班后天天上网回覆这些朋友的消息,一耗就是两小时。(妙的是,他其实不知道这些朋友也是碍于类似压力而耗在上面)
一开始是熟人,后来一堆陌生人也把他加为好友。天天跟这些人在网上「搞关系」,刚开始还颇觉得有些意思。看看好友又更新了照片,又写了新的Blog,彼此间留留言打招呼,似乎也颇惬意。

然而大约三个月后,甲先生开始觉得乏味。跟一堆人在网上Social来 Social去,实在挺无聊。随著朋友越来越多,不得不耗在上面更多时间。更痛苦的是,每个网站他都得去照顾,每天两小时已然不够。终于,他决定戒掉。这类让他一度上瘾到无可自拔的互联网服务,在精神压力达到临界点后,终于被他废弃。花大量时间搞这些关系到底什么意思?生活不该是如此的,他要拿回主控权。


◎SNS经营者的典型经验

所有的SNS网站经营者都困惑,用户流失率怎么会高得如此惊人,而且找不到方法可以根治问题,似乎这本来就是SNS网站的天性。靠著人际网络的压力而驱动的事业,也因压力解除而退散。过去的SNS网站像一个大筛子一样,一瓢子捞下去,看似捞到大量用户,然而经过三个月的时间,总是仅剩下不到一半的有效用户,其馀的用户根本不再来了。用户量看似很大,其实很虚。而一个SNS网站之所以能够急速成长,主因是透过人际关系鍊拉动的增长,其速度远大于用户的流失速度。当增加多而流失少,看起来整体就是增加的。然而,当用户的增长慢下来的时候呢?

MySpace ,Facebook如日中天。若以全世界为市场范围,这些网站确实还没碰触到天花板。因此,向其他国家扩张看似是维持增长的解决方案。然而,本质的问题没有解决。SNS网站还有一个也是很奇特的惊人现象。就是一旦成为网站的活跃用户,这个用户就会非常活跃,而且维持非常长的存活周期。几乎可以说是以此为家,天天报到,赖著不走。

从注册用户到有效用户到活跃用户,这条路上有大量的人脱队。这个现象是不正常的吗?非也,这完全是网络社区的正常现象。笔者多年前就说过,网络社区是「性质相同的一群人,聚在一起互相取暖」。这群人的名字,叫Heavy User。简言之,活跃的Blogger 属于这群人。SNS的特性是高度互动,而互动本来就很累人。愿意跟别人大量互动天天写博客的当然不是常人。他们的表现欲,成就动机,都高于一般人,并且最终在某个社区网站里找到舞台与归属感。问题是当这群人玩得很开心的时候,一般网民在干什么?


◎SNS是会玩腻的

那些抛弃某个SNS网站而去的人,是不是跑去玩其他竞争网站的同类型服务了?有小部分人是的(嗯,就是Heavy User),但大部分离开的人不是,他们是从此不玩这类型服务了。玩腻了Facebook之后转而去玩MySpace 的人是少数人,大部分的人是从此离开SNS 这类型服务。写博客也是一样的,从某大博客平台换到另一个博客平台继续写作的是少数人,大部分的人是停笔。

离开一个网站跟离开一个服务,完全是两种概念。举个例子来说,「看厌了新浪新闻而转看搜狐新闻」,跟「从此不看网络新闻」,我们很明白的知道差异在哪。真糟糕!原来SNS服务是一种会玩腻的服务!真糟糕!当所有网民都已成为我SNS网站用户,再来该怎么办?如果把市场发展比喻成下棋,那么过去几年红透半边天的SNS概念网站,已经走入了残局阶段。网站经营者表面看似风光,心底下却打鼓。摆脱这些本质上的宿命,成为不得不然的工作。令人意外的是,解决之道居然在于Web 1.0 。

SNS网站的用户数多寡,完全看它占领那个社会阶层(或者文化阶层)而定。


◎社会阶层决定网站用户数


SNS发展至今吸引了大批创业者加入,然而时局已经不再大好,很多网站走入关门边缘,在求发展与求获利中挣扎。想要再融资是不太可能,因为亚洲地区的创投界已经不像以前这么看好这个领域。市场局面大势底定。在中国大陆,用户达到数千万级别的,可期望藉第三轮融资发展,但面对大型 1.0网站也进入市场的挑战;用户数仅数百万级别的,用户数也不会再快速增加,必须自己想办法营利。

在台湾,由于有雅虎台湾这个市场独大的门户网站,再加上原本就狭小的市场,小型SNS网站积弱不振,距离营利之路很远。但与此同时却有一些老牌社区网站存活很好,获利颇佳。为什么会造成这种市场局面?笔者以前说过,SNS的发展基础是社会学,因此一个SNS网站的用户数多寡,完全看它占领了那个社会阶层(或者文化阶层)而定,那个阶层直接决定了用户数的上限。

因为SNS网站几乎是靠著人拉人发展起来。每个用户会拉动的人都是他生活上熟悉的圈子,不管陌生人或熟人。当同一种阶层的人在这个网站越积越多的时候,其他阶层的人也越难以加入到这里。等到网站有第一批用户,为了牢牢抓住他们,及利用他们带更多用户进来,必须更加揣摩他们的心思甚或社交习惯。结果更深化了这样的发展,更加走向某一种文化氛围或者社会阶层,再也无法回头。


◎经营团队本身的社会阶层决定用户多寡

要观察一个SNS网站发展,看它第一批用户是甚么人就知道了。 Google的 SNS网站Orkut 一开始无心插柳在巴西大受欢迎,其他国家用户从此很难加入。我们身旁几乎没人用Orkut ,尽管我们用Google。韩国最大社区网站Cyworld 先前进军美国,当然想吸引欧系美国人来用,没想到却吸引到一堆亚裔小男生小女生。为什么?因为网站功能设计甚至文化氛围始终比较接近亚洲人户习惯。而交友网站Friendster自从积累大量菲律宾用户后,其他国家的人也很难融入那个圈子。这就是文化界线。纵然跨国SNS网站能吸引到全世界用户,仔细观察这些人,会发现都是性质靠近的一群。

反观国内,51.com的用户一开始从二线城市网吧发展起来,现在很难拓展用户群到一线城市的白领。反之其它SNS网站也打不进二线城市市场。文化的氛围以及实体世界的社会阶层,就是这么影响著。占有「上层社会」(指白领)的SNS网站,用户数发展注定受限。特别在中国大陆,白领是占总人口比例极少的一群,大部分生活在沿海。以这个群体为目标的SNS网站用户数很难上到千万。

至于台湾的共享书签网站黑米与推推王,使用族群的文化氛围便明显不同。前者要更加精英一些,后者要更加普罗大众一些。然而两者都不脱白领的社会阶层,因此不如老牌的草根社区高流量或赚钱。

再往前一点看,要观察一个SNS网站发展,看它的创业团队是属于甚么样的社会阶层就知道了。因为这群人会把自己的思维放进到社群的经营上,而这些思维绝对受到这些人本身所处社会阶层的制约。


◎有文化的东西做不大

有的SNS网站或者社区网站并不是占领某一种社会阶层,而是占领某种文化团体或者兴趣团体,例如以动漫为主题,以运动为主题,以文学为主题,以书评为主题,或者以美食为主题的社区。这些社区一定都受到社会群体的大小制约。例如,喜欢动漫的人在中国大陆市场有多少?喜欢美食的人在台湾市场有多少?在中国大陆这样的市场可能让网站经营者足以养活自己,在台湾可能就很艰难。

SNS网站或者社区网站为什么做不大?除了社会阶层的制约外,也因为「有文化的东西本来就做不大」。只要一个社区网站你能清楚说出它是属于一种甚么样的文化氛围,他就是做不大的。难道「没文化」就能做大?要弄清楚这里的「没文化」不是指低俗文化,而是指「讲不出来是什么文化」。只要能讲出这个网站属于哪种文化,就一定有人讨厌这种文化。无法讨好所有人的结果就是做不大。

然而这太强人所难了!社区正因其文化氛围吸引兴趣相投的人靠近并留下,怎么可能没有文化?然而也正是如此,不喜欢这种氛围的人也都不来。很多老牌社区网站多少年过去了,也就那个样子没有大发展。令人意外的是,解决之道居然在于Web 1.0 。


◎SNS就是直销

在传统商务世界里,创业者要创新或生产好产品或许不难,但是要寻找渠道让商品到达终端用户却困难得多。或许寻找渠道也不难,但可能因此付出高昂代价。拥有渠道的资本家,并不是容易被扳倒的对象。10年前互联网兴起,第一次打破这个现象。对创业者来说,商品就是网站,提供的服务可直达终端用户,不再经过其他渠道。过去资本密集的报业所拥有的渠道优势被瓦解,成就了 1.0的网络世界。这种新渠道除了冲击传统媒体也冲击传统商务,当然更冲击传统的通信方式。总结来说,过去 1.0之所以能有这么多小本创业的人,可看成是创业家们找到了低成本的营销渠道,避开了传统资本家的封锁。

然而,Yahoo!之类的创业者,10年后却成了新资本家,他们掌握渠道让新兴互联网创业者难以出头。创业家必须花钱到传统渠道(也就是 1.0网站)买所费不赀的广告,否则自己的网站就一个访客都没有。在传统商务世界里,许多年前有人发明一种新的渠道,透过人际网络可以避开传统渠道的困局而达到销售目的,称为直销。而当互联网上已经有这么多巨头存在的时候,要怎么样避开而进行低成本推广?答案就是人际网络。SNS创业家精巧的利用人际网络达成「以人带人」的低成本营销。如果不是这玩意儿,这些新网站的用户数和流量都不会起来的。我们应当对透过人际网络的推广手段予以高度肯定。


◎回归基本才能做大

很多人买过直销商品,却觉得从这管道买东西很不牢靠。参与直销体系的人流动率高,本身就不是稳定的销售体系,SNS靠关系链吸收新用户也一样。况且,推广方式再厉害也解决不了产品的本质问题。

本系列第一篇文章提到,SNS网站的用户流失率极高,这是第一个问题;用户流失后不是流向竞争对手,而是不再玩同类型的网站,这是第二个问题。对经营者来说,这延伸出两个思考:首先,别人流失的用户也不会是你的用户,结论是必须抢夺用户的第一次。想想还有哪些用户没被染指过的,产品就往哪里做。

其次,用户终归要流失,因此最重要的是抢夺活跃用户。只有活跃用户可能会在同类型的SNS网站之间到处迁移,也会尝试新的网站。牢牢抓住这群用户,网站经营至少就先立于不败之地。

掌握某一个层面的活跃用户,网站大概就可以开始谈营利,也能小而美活得过去,以往成功的社区网站莫不如此。但是对于那些怀抱大企图想把用户群体扩增到没那么活跃的用户去,又该怎么办?摆脱掉太过强烈的社区气息吧!摆脱掉太过强烈的文化氛围吧!越是接近人们基本需求的东西,越是不带有上述的气息。这样的东西有三个,存储(Storage ),工具(Tools ),以及内容(Content )。简单来说,就是 1.0时代的产物。


◎下一步:存储,工具,与内容

Facebook创办人Mark Zuckerbery 说,Facebook不是一个社交网络,而是一个社交工具。由于其开放 API的关系,外界对于这句话的解读是朝向「Facebook变成一个操作系统或平台的可能性」上去讨论。这句话之所以经典,正在于他精要的点出一个道理:只有做「平台」才能大。笔者的解读是,只有工具才能够维持一个人的使用习惯,而且最重要的是,平台与工具本身都是跟文化无关的东西,人人能用。

你用Gmail 写信用MSN 发讯息,这些工具跟文化的关系并不大(至少不像社区网站那样强烈)。过去做惯了炒热社区气氛以巩固活跃用户的经营者,现在要开始来想想有哪些工具是比较冷的,人人都能用的。

也正因此,与社交高度相关的工具,实时通讯软件IM,看似在过去10 年已经定型的市场,台面下却翻滚著一股暗潮。拥有几亿用户的 SNS 社交网络服务经营者,推出来的新IM工具有可能扰动一池春水。

此外,人人都有不想社交的时候。 SNS网站可不可以只要简单的让我存放自己的照片,文件,收藏的网址就好,我的个人首页最好都没人知道,也不要老拿别人最近的活动来烦我?
存储(Storage )就是这种最底层的需求。相较于活跃用户一天到晚四处Social,更多人是只需要这样子的服务就好。当用户玩腻了社交,还有什么会让他还常来?或许就是放放照片而已。活跃用户来,是因为关系在这里;其他用户来,是因为家当在这里。


◎SNS进化即将完成

第三样东西是内容,这个部分比较容易理解,也很多SNS网站在做。对于Social不那么热衷的人,弄一些内容给他看看。当然,使用标签等功能进行内容的聚合是常见的方法。
谈到这里,会发现SNS走到头来,还是没离开笔者多年以前说过的,互联网的四根柱子:内容(Content ),社区(Community ),通讯(Communication ),商务(Commerce)。

只是 1.0时代我们从内容起步开始经营网站,逐步让网站具有社区,通讯及商务功能。SNS时代,我们从社区开始起步,逐渐往内容以及通讯工具走,最后必然也走进商务。我们终于看清SNS的时代意义,他是全球网站的大进化。所造成的结果并非新的取代旧的,而是新的逐渐混入旧的,而旧的逐渐融入新的。因为不管是几点零,都是人在用。而人,使用习惯没有改变。
本文的讨论也很精彩,浏览讨论>>


JavaEye推荐



01:30 IBM的Power 7芯片——8核,4GHz (806 Bytes) » Fenng's shared items in Google Reader
IBM的下一代Power 7芯片的细节正逐渐浮出水面。The Register观看到的内部文档显示Power7的每个处理器有8个核心,每核心4线程,每个模块由2块Power 7芯片组成,即每个模块有16个核心,64线程。每个核心的性能是32 gigaflops,是Power6的两倍,合起来每芯片的性能是256 gigaflops。但Power7的实际时钟频率低于Power6的5GHz。IBM将在2010年推出45nm工艺的4.0GHz Power7芯片。根据文档显示,伊利诺斯大学将在2011年投资2.08亿美元,用Power7搭建有史以来最强大的超级电脑,由38,900个8核Power7组成,峰值计算能力高达 10 petaflops,内存620 TB,内存带宽5 PB/s。
00:59 Maybe Normalizing Isn't Normal (9771 Bytes) » Fenng's shared items in Google Reader

One of the items we're struggling with now on Stack Overflow is how to maintain near-instantaneous performance levels in a relational database as the amount of data increases. More specifically, how to scale our tagging system. Traditional database design principles tell you that well-designed databases are always normalized, but I'm not so sure.

Dare Obasanjo had an excellent post When Not to Normalize your SQL Database wherein he helpfully provides a sample database schema for a generic social networking site. Here's what it would look like if we designed it in the accepted normalized fashion:

social network database example, normalized

Normalization certainly delivers in terms of limiting duplication. Every entity is represented once, and only once -- so there's almost no risk of inconsistencies in the data. But this design also requires a whopping six joins to retrieve a single user's information.

select * from Users u
inner join UserPhoneNumbers upn
on u.user_id = upn.user_id
inner join UserScreenNames usn
on u.user_id = usn.user_id
inner join UserAffiliations ua
on u.user_id = ua.user_id
inner join Affiliations a
on a.affiliation_id = ua.affiliation_id
inner join UserWorkHistory uwh
on u.user_id = uwh.user_id
inner join Affiliations wa
on uwh.affiliation_id = wa.affiliation_id

(Update: this isn't intended as a real query; it's only here to visually illustrate the fact that you need six joins -- or six individual queries, if that's your cup of tea -- to get all the information back about the user.)

Those six joins aren't doing anything to help your system's performance, either. Full-blown normalization isn't merely difficult to understand and hard to work with -- it can also be quite slow.

As Dare points out, the obvious solution is to denormalize -- to collapse a lot of the data into a single Users table.

Social database example, denormalized

This works -- queries are now blindingly simple (select * from users), and probably blindingly fast, as well. But you'll have a bunch of gaping blank holes in your data, along with a slew of awkwardly named field arrays. And all those pesky data integrity problems the database used to enforce for you? Those are all your job now. Congratulations on your demotion!

Both solutions have their pros and cons. So let me put the question to you: which is better -- a normalized database, or a denormalized database?

Trick question! The answer is that it doesn't matter! Until you have millions and millions of rows of data, that is. Everything is fast for small n. Even a modest PC by today's standards -- let's say a dual-core box with 4 gigabytes of memory -- will give you near-identical performance in either case for anything but the very largest of databases. Assuming your team can write reasonably well-tuned queries, of course.

There's no shortage of fascinating database war stories from companies that made it big. I do worry that these war stories carry an implied tone of "I lost 200 pounds and so could you!"; please assume the tiny-asterisk disclaimer results may not be typical is in full effect while reading them. Here's a series that Tim O'Reilly compiled:

There's also the High Scalability blog, which has its own set of database war stories:

First, a reality check. It's partially an act of hubris to imagine your app as the next Flickr, YouTube, or Twitter. As Ted Dziuba so aptly said, scalability is not your problem, getting people to give a shit is. So when it comes to database design, do measure performance, but try to err heavily on the side of sane, simple design. Pick whatever database schema you feel is easiest to understand and work with on a daily basis. It doesn't have to be all or nothing as I've pictured above; you can partially denormalize where it makes sense to do so, and stay fully normalized in other areas where it doesn't.

Despite copious evidence that normalization rarely scales, I find that many software engineers will zealously hold on to total database normalization on principle alone, long after it has ceased to make sense.

When growing Cofax at Knight Ridder, we hit a nasty bump in the road after adding our 17th newspaper to the system. Performance wasn't what it used to be and there were times when services were unresponsive.

A project was started to resolve the issue, to look for 'the smoking gun'. The thought being that the database, being as well designed as it was, could not be of issue, even with our classic symptom being rapidly growing numbers of db connections right before a crash. So we concentrated on optimizing the application stack.

I disagreed and waged a number of arguments that it was our database that needed attention. We first needed to tune queries and indexes, and be willing to, if required, pre-calculate data upon writes and avoid joins by developing a set of denormalized tables. It was a hard pill for me to swallow since I was the original database designer. Turned out it was harder for everyone else! Consultants were called in. They declared the db design to be just right - that the problem must have been the application.

After two months of the team pushing numerous releases thought to resolve the issue, to no avail, we came back to my original arguments.

Pat Helland notes that people normalize because their professors told them to. I'm a bit more pragmatic; I think you should normalize when the data tells you to:

  1. Normalization makes sense to your team.
  2. Normalization provides better performance. (You're automatically measuring all the queries that flow through your software, right?)
  3. Normalization prevents an onerous amount of duplication or avoids risk of synchronization problems that your problem domain or users are particularly sensitive to.
  4. Normalization allows you to write simpler queries and code.

Never, never should you normalize a database out of some vague sense of duty to the ghosts of Boyce-Codd. Normalization is not magical fairy dust you sprinkle over your database to cure all ills; it often creates as many problems as it solves. Fear not the specter of denormalization. Duplicated data and synchronization problems are often overstated and relatively easy to work around with cron jobs. Disks and memory are cheap and getting cheaper every nanosecond. Measure performance on your system and decide for yourself what works, free of predispositions and bias.

As the old adage goes, normalize until it hurts, denormalize until it works.

[advertisement] Peer code review without meetings, paperwork, or stopwatches? No wonder Code Collaborator won the Jolt Award.

00:08 从业务上优化系统 (3465 Bytes) » DBA@Taobao

某些时候,如果从语句的本身上来说,已经很难优化了。如我们电子客票系统中有一个查询语句就是如此。我不便写出语句,但是我可以还原场景给大家看看。
我们的电子客票系统中,在首页有个特价机票展示区域,如下所示:

特价机票首页表示区
当我们点击“更多单程特价票”/“更多往返特价票”的时候,会转到如下的结果list分页页面:
所有特价机票结果显示分页页面首页
这个里面就显示了所有的单程特价票或者是往返特价票,默认根据特价票最近被修改时间来排序。
我们现在来分析一下这个业务的合理性,或者说这种展示方式存在的必要性。
用户从首页的特价展示区中点击更多进入此list页面,看到的是所有的特价机票,通常来说,这对用户是没有必要的。因为,一般来说用户不会去关心整个中国的所有的特价机票,他们一般只会关心自己所在的城市的特价机票,或者是自己要去的某个城市的特价机票。比方说我人在杭州,要去北京,我想要看的肯定是从杭州出发的特价机票,最好是直接能看到从杭州出发到北京的特价机票,或者是想看从北京出发到杭州的特价机票,因为我要回来。我根本不会去关心从合肥到香港的特价机票,因为这对我来说没有意义。基于以上推理中的大部分用户行为,全部特价机票的首页信息几乎没用,更不会去点第二页,第三页,而是去重新从输入框中输入相关的起飞城市等信息后查询。
从以上的分析中,我与开发人员以及产品经理等讨论,最终说服他们。在用户点击“更多……”时的行为上,增加一个判断,根据用户的IP判断用户所在城市(或离其最近的有机场的城市),然后默认显示这个城市的特价机票,即把原来的“所有城市”变成“所在城市”,在美化上,开发做了些变更,最终特价机票显示页变成了如下这种形式:
改造后的特价票默认显示页
这种从业务角度的优化,带来了如下的好处:
1、用户点击“更多……”时刻,所执行的sql语句得到了大大的优化,逻辑读从3w左右降至300以内甚至几十。
2、本来显示所有特价机票的无用信息,被更换成显示用户所在城市的特价机票信息,绝大多数情况下,恰好提供了用户所需的有用信息,提高了用户体验。
3、以前,用户进入所有特价机票首页后,一般情况下要自己重新输入条件搜索自己所在城市特价机票信息,浪费了大量的用户劳动力;优化后,这批劳动力亦节省下来。
另,欢迎大家来淘宝网预定机票和酒店 :)

2008-07-14 Mon

23:06 历史文化古城,西安 » OracleBlog.cn
23:02 北京欢迎你 » Chanel [K]
22:44 佛山行 » Fenng's shared items in Google Reader
22:04 只盼坟前有屏幕 » Chanel [K]
22:01 STATSPACK数据清除(二) » yangtingkun
22:00 Scribd and Lulu Join Forces » Fenng's shared items in Google Reader
21:38 【转载】公路上我的车见谁灭谁! » Fenng's shared items in Google Reader
20:53 独臂小贴士 » Chanel [K]
18:53 Google Code 好用的 Code Review 功能 » Fenng's shared items in Google Reader
18:53 Radiohead Partners With Google For Music Video Launch » Fenng's shared items in Google Reader
18:26 和该死的spammer作斗争 » Fenng's shared items in Google Reader
08:52 发现北京 - 段祺瑞执政府 » Fenng's shared items in Google Reader
08:01 想购买wiki工具吗? » Fenng's shared items in Google Reader
07:49 网银已经或正在改变什么 » Fenng's shared items in Google Reader
07:01 为 AIX 配置 Infiniband » developerWorks 中国 : 技术文章 , 教程 AIX
05:18 SOS,救救我们吧! » Fenng's shared items in Google Reader
04:17 Closed database and WITH subquery » Tanel Poder's blog: Core IT for geeks and pros
03:11 小伤 » 柔嘉维则@life.oracle.eng
01:35 支付宝 公司文化 » Uploads from dbanotes
01:30 culture_new2 [Flickr] » DBA notes

2008-07-13 Sun

23:25 《赤壁》-诸葛亮帮牛接过生 » Uploads from dbanotes
17:15 如何挑选太阳镜? » 生活帮-LifeBang
16:21 现代古典之美 编辑传授建筑摄影技巧 » Fenng's shared items in Google Reader
14:25 Sorted Hash Clusters » Oracle Scratchpad