CharlieShen

新人,大家多关照啦@_@

  博客中心 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 登录 ::
  3994 随笔 :: 0 文章 :: 20 评论 :: 0 Trackbacks
Cached @ 2025/4/26 14:35:59Control ASP.skins_cogitation_controls_blogstats_ascx
<2007年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

留言簿(14)

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜

Cached @ 2025/4/26 14:35:59Control ASP.skins_cogitation_controls_singlecolumn_ascx

2007年8月27日 #

43
43.我走来走去,为中国的命运苦苦思索
posted @ 2007-08-27 22:02 CharlieShen| 编辑 收藏

 44.破题,肯定是倪萍参与了出题。
posted @ 2007-08-27 22:02 CharlieShen| 编辑 收藏

40
40.把有限的马屁集中火力拍到一个人的屁股上。
posted @ 2007-08-27 22:01 CharlieShen| 编辑 收藏

41
41.愚蠢本能发作了
posted @ 2007-08-27 22:01 CharlieShen| 编辑 收藏

42
42.雷锋一生扶过六千个老太太过马路
posted @ 2007-08-27 22:01 CharlieShen| 编辑 收藏

37.最土最庸俗最家常便饭的就是孔子。所以得到广泛流传。象老子庄子那都太酷拉。从远处骑个小毛驴戴个墨镜。走过你身边。然后消失在远方,可是你还觉得那墨镜在他背后。巨酷无比。语言所不能表达的就是禅,最酷。不能渐悟,只能顿悟。师傅拿个棍子。你问∶“什么是禅啊,我怎么还没悟到啊?”师傅上去就一棍子打在头上∶接着悟!当时有多少徒弟被打傻打死啊。有的徒弟聪明,被打了一下,就“啊,我懂了!”于是下山收徒弟,手里也拿个棍儿,徒弟说悟不出,上去就打∶接着悟!聪明的徒弟怎么样啊?也不用接着悟,也不用挨打,直接拿个棍就下山收徒弟。办起住宿班、冲刺班、12周班、15周班… ……
posted @ 2007-08-27 22:00 CharlieShen| 编辑 收藏

 38.当年我上住宿班的时候老俞还不象现在这么忙。上山给每期学员作一次动员演讲。那时老俞在我们心中就是神啊。一天听说晚上老俞来作演讲。于是都早早跑到演讲处集合。老俞吃过饭来了,拿起话筒,什么都没说呢,就是一个响亮的饱嗝。要多不合时宜有多不合时宜。我们当时听了都傻了,互相看了看,脸上都洋溢着痴呆幸福的光芒说∶多么平易近人的饱嗝啊!!!!
posted @ 2007-08-27 22:00 CharlieShen| 编辑 收藏

 39.Ezra Pound 是美国20世纪文学界的泰斗。在美国写诗得不到认可,就去英国混。在英国混出头了。然后肆无忌惮。大骂美国,还写道∶资本主义排斥诗人。美国是资本主义,英国不是么?!头脑极度混乱,诗人的标志。后来E.P开始研究政治。一个诗人研究什么政治?!而且他居然拥护墨索里尼,参与了一个反美电台。他酷爱中国文化,对中国文化病态痴迷。把孔子的着作都翻译成英文。狂迷中国饮食,在整个意大利没找到中餐馆,于是大怒∶居然没有中餐馆,这个国家完蛋了!
posted @ 2007-08-27 22:00 CharlieShen| 编辑 收藏

34. 我家离新东方远,每天在家门口打车。家太偏僻了,到处是比夏利还破的车。根本不愿意坐。有一天我发现了一个黑色桑塔那---在我们那算是高档车拉。可我一看那司机就不想坐了。他又黑又瘦,干瘪小个,一副欠扁的窝囊相。不得以为了车还是坐上去了。坐上去后才发现这司机不一般啊。上了车他立即象个男子汉了-- --一个劲踩油门,只分轻踩和重踩,根本不见踩刹车。我惊喜地发现“北京不堵拉!”不论红灯绿灯一路过,别的车都让路。充满了罪恶的快感。太爽拉。那干瘪身形高大起来.但是一下车,他的眼神又变的窝囊起来了。
posted @ 2007-08-27 21:54 CharlieShen| 编辑 收藏

35.人最他妈虚伪。你去跳崖自杀,看见了一个人你看他就来气,上去就扁了一顿,然后心情就爽了,不想死了,抱住人家大叫“恩人!”,结果他跳下去了。对动物也一样∶把人类折磨的对象叫恩人。什么救命恩狗的。比如小蜜蜂。人家一年辛辛苦苦酿蜜。是给你酿的?!你上去抢过来咕咚咚喝完,一抹嘴,说∶“啊,小蜜蜂,你真是辛勤的小精灵啊!”靠,你欺负也就欺负了,还要恶心它。它是不知道。如果知道了,肯定气吐血。
posted @ 2007-08-27 21:54 CharlieShen| 编辑 收藏

 36 36.家里穷那会儿,屋里坐四个人,只有一袋半方便面。还没吃呢,又来一个人。我们四个这个后悔啊----怎么不早吃呢?那人兴高采烈地说今天感恩节啊!他妈的,吃的都没有,感什么恩?!他说我们去教堂吧!我们又不信教上什么教堂?他说哎呀感恩节,教堂有吃的。我们一听乐疯了。于是五个人骑着三辆自行车直奔教堂。到那一看果真有糖果饼干什么的,而且随便进。我们就上去疯吃一顿。没人管啊。于是留下了美好的回忆。第二年感恩节,我们又去了,一看是自助餐!!!都精神崩溃了。上去疯狗一样吃。 ,屋里坐四个人,只有一袋半方便面。还没吃呢,又来一个人。我们四个这个后悔啊----怎么不早吃呢?那人兴高采烈地说今天感恩节啊!他妈的,吃的都没有,感什么恩?!他说我们去教堂吧!我们又不信教上什么教堂?他说哎呀感恩节,教堂有吃的。我们一听乐疯了。于是五个人骑着三辆自行车直奔教堂。到那一看果真有糖果饼干什么的,而且随便进。我们就上去疯吃一顿。没人管啊。于是留下了美好的回忆。第二年感恩节,我们又去了,一看是自助餐!!!都精神崩溃了。上去疯狗一样吃。
posted @ 2007-08-27 21:54 CharlieShen| 编辑 收藏

 31.遇到误会解不解释呢?绝不解释!只有两种情况我才解释∶1亲人误会我。如果我不解释,他们会难过。2法院误会我。除了这两种,绝不解释。真正硬朗彪悍,不解释!妈的,连我这种人你都误会,你还能干啥?
posted @ 2007-08-27 21:53 CharlieShen| 编辑 收藏

32.Caculus 一看我就头发麻。听说马克思当年写资本论时累了就做两道微积分休息休息。当年我就因此埋下了对马克思的深仇大恨。但后来经证实是算术题不是微积分。原来是算术题啊,嘿嘿。我是中国大陆唯一考gre不答数学部分的人。当年我答到数学section的时候,第一题我花了7分钟读题,咦?没读懂。不做了。按下一题。没想到机器提示我必须选一个答案。我当时汗就下来。我来考试是想得到自己的真实成绩啊。它这蒙错了还好,蒙对了怎么办啊!ETS怎么也没想到,还有这样的奇男子,蒙对了会很伤心的。我一想,都不做了。于是把整个数学section全放掉。直接做下面的section。考了几次GRE全没答数学 section。后来ETS给我寄成绩时问我∶By the way,能问问你为什么每次都不答数学部分呢?你有什么目的么?嘿嘿,我不告诉你。我给 ETS写信∶如果你给我退数学部分的考试费我就告诉你。他们没理我,于是我也就没理他们。
posted @ 2007-08-27 21:53 CharlieShen| 编辑 收藏

33.杀虫剂是干什么的啊?就是帮助昆虫搞优生学的。越来越好的杀虫剂把一个个小虫子搞得象小泰森似的。遇到不怎么样的杀虫剂就象下场毛毛雨,好点呢,就是洗个澡.而且这些小虫子洗澡时也不闲着,一边洗一边唱∶“我们是害虫,我们是害虫!”
posted @ 2007-08-27 21:53 CharlieShen| 编辑 收藏

30.痴呆型精神病患者最幸福。已经达到一个高深的境界,每天都处于非常high的状态。而且干啥随便∶你是傻子你怕什么!?可以被养得白白胖胖,永远处于放风状态。
posted @ 2007-08-27 21:52 CharlieShen| 编辑 收藏

27
27. 你数学不好,还可以去当英国首相嘛(邱及耳),不行也可以去当台湾作家嘛(李敖),还可以去英国做诗嘛(徐只摸),当然以上的都需要签证。那不行你可以在国内当作家嘛(钱钟书),最次你也可以当个老师嘛(罗永浩),如果你连课都讲不了,你也可以去当个校长吧(俞敏洪)。
posted @ 2007-08-27 21:51 CharlieShen| 编辑 收藏

28
8.不能这样,否则他们会认为你很活泼。
posted @ 2007-08-27 21:51 CharlieShen| 编辑 收藏

29
 29.你们都看不看中 央电视台的春节晚会啊?啊,怎么还保持着这个恶习啊?! 中央电视台的联欢晚会不是给正常人看的.但是爸妈要看, 作儿子的总不能回屋吧, 先吃几个维生素B6(孕妇用来防止呕吐的),再硬着头皮坐在电视机前. 有一年竟然发生这样的事: 倪萍满面假春风地说:”今天的联欢会突出了联欢的主题.”对得让人面红耳赤! 思路与ETS高度一致! 她去考GRE如果不得2400, 那基本是词汇不过关!
posted @ 2007-08-27 21:51 CharlieShen| 编辑 收藏

24
24.小孩打架是比发育。
posted @ 2007-08-27 21:50 CharlieShen| 编辑 收藏

25
25.过了3年,我发育了!!!
posted @ 2007-08-27 21:50 CharlieShen| 编辑 收藏

26
26.我跟他们比人品!!
posted @ 2007-08-27 21:50 CharlieShen| 编辑 收藏

21
21.眼睛血丝密布,脑门上青筋暴露,脚上出现了汗毛。
posted @ 2007-08-27 21:49 CharlieShen| 编辑 收藏

22
22.-------老罗呢?

  -------不知道,也别问,反正是没了。

posted @ 2007-08-27 21:49 CharlieShen| 编辑 收藏

23
23.老子一天不做上1000个俯卧撑还真TMD不爽!
posted @ 2007-08-27 21:49 CharlieShen| 编辑 收藏

17
17.我到新东方后劝退了不少老教师
posted @ 2007-08-27 21:48 CharlieShen| 编辑 收藏

18
18.镖悍的人生不需要解释。
posted @ 2007-08-27 21:48 CharlieShen| 编辑 收藏

20
20.风。

  冷风。

  冷风吹。--------------古龙这样写是为了赚稿费(按行计费)

posted @ 2007-08-27 21:48 CharlieShen| 编辑 收藏

16
 16.女生就这点不好,你吵不过可以打嘛,打不过可以不打嘛!干什么去打小报告呢?
posted @ 2007-08-27 21:47 CharlieShen| 编辑 收藏

12
 13.幸福的直哆嗦。

  14.啊,该睡觉了,喝两杯咖啡。

posted @ 2007-08-27 21:44 CharlieShen| 编辑 收藏

15.中国教育的两大悲哀∶一. 每个学校都有一个变态的中年妇女当教导主任.

  二.每个学校都有一个好色的男体育老师一上课就让男生玩球,自己领女生做游戏。

posted @ 2007-08-27 21:44 CharlieShen| 编辑 收藏

16
一. 每个学校都有一个变态的中年妇女当教导主任.

  二.每个学校都有一个好色的男体育老师一上课就让男生玩球,自己领女生做游戏。

posted @ 2007-08-27 21:44 CharlieShen| 编辑 收藏

7
 7.13岁的少年罗永浩,有生以来第一次近距离目击活的黑人!
posted @ 2007-08-27 21:43 CharlieShen| 编辑 收藏

8
8.这时我赶紧掏出记事本,写遗嘱。

  9.令人愉悦的忧伤

  10.我真嫉妒你们能遇到这么牛的老师!

  11.真正的猛男,敢于直视惨淡的人生。

posted @ 2007-08-27 21:43 CharlieShen| 编辑 收藏

12
12.猛男的另一个特征,哭的时候要躲起来。 1
posted @ 2007-08-27 21:43 CharlieShen| 编辑 收藏

4
4.这道题多年来在新东方一直讲不明白,直到你们罗老师加盟了新东方。老教师都对我说∶老罗,你可真牛!我赶紧说∶快别这么说,我只是站在了巨人的肩膀上!
posted @ 2007-08-27 21:42 CharlieShen| 编辑 收藏

5
.我外婆出生于光绪年间,改个屁嫁。
posted @ 2007-08-27 21:42 CharlieShen| 编辑 收藏

6
6.当学生向老俞提问时,老俞会给他讲个他自己奋斗的小故事,把学生都感动坏了,就忘了刚才的问题了。
posted @ 2007-08-27 21:42 CharlieShen| 编辑 收藏

1.老罗在课上问∶“日本女人有什么爱好?” 下面有人回答∶“拍片!!”老罗暗笑,说∶“你们就不能想点好的东西啊~那么,日本男人有什么爱好?”下面异口同声∶“看片!!!”
posted @ 2007-08-27 21:41 CharlieShen| 编辑 收藏

2
2.背过词典的我只见过老俞和那个广东疯子。
posted @ 2007-08-27 21:41 CharlieShen| 编辑 收藏

3
3.什么是梨型的身材?恩?你们看我干什么??我老罗是标准的桶型身材!!
posted @ 2007-08-27 21:41 CharlieShen| 编辑 收藏

乔生 , 评论(1)

我统计了一下前八轮的进球和失球总数,惊奇的发现一个巧合,那就是它们刚好一样多。

posted @ 2007-08-27 21:40 CharlieShen| 编辑 收藏

队员就像桃源三结义的赵云一样勇猛,不愧为长胜将军。

posted @ 2007-08-27 21:39 CharlieShen| 编辑 收藏

眼睛里看着球员A,脑子里想起了球员B,嘴里说着球员C,实际指的是球员D,观众听以为是球员E。

posted @ 2007-08-27 21:39 CharlieShen| 编辑 收藏

只见AC米兰的巴蒂斯图塔突破马尔蒂尼,一脚凌空抽射,被裁判扑了出来。

posted @ 2007-08-27 21:38 CharlieShen| 编辑 收藏

双方球迷入场热身做准备活动,比赛马上就要开始。
posted @ 2007-08-27 21:38 CharlieShen| 编辑 收藏

你看这一对选手很有意思吗,一高一矮,一大一小。唉奇怪呀,按说应该大的选手,身体重,应该先入水呀,怎么反倒是小选手先入水呢?”旁边的解说顾问就只好这么解释了:“小选手,起跳没有力量,所以不如大选手跳的高,因此就先入水了。” 

posted @ 2007-08-27 21:37 CharlieShen| 编辑 收藏

以迅雷不及掩耳盗铃之势。

posted @ 2007-08-27 21:37 CharlieShen| 编辑 收藏

可能有的观众刚刚打开电梯,我们再把比分报一遍。

posted @ 2007-08-27 21:37 CharlieShen| 编辑 收藏

    1."杜威给巴西队的德尼尔森出示了一张黄牌"(德尼尔森正在场下热身)

    2"西班牙在和南斯拉夫的比赛中2:0领先,后南斯拉夫连拌两球,最后以3:2货胜"

    3"瑞典队的德尼尔森被黄牌警告"

    4"看了这场比赛,让我想起了一则法国谚语齐达内不是万能的,但是没有齐达内却是(停顿N秒)什么也不能"

    5"1992年丹麦队代表南斯拉夫参加了欧洲国家杯"

    6"利物浦招入迪乌夫,是为了在亨利受伤时,和海斯基配合。"

    7"这个梅楚啊,娶了一妇女为妻。"

    8"我们按照阿拉伯序号,把他们称为大卡马拉,小卡马拉。"

    9"塞内加尔队凭实力说话 用脚来发言! "

    10"卡马乔很肥胖,但进球后高兴的强大势能让他跳起来"

    12"西班牙最好的成绩是第四名,连第三都没得过"

    13"乌拉圭队教练对米卢和一些大牌球星都很尊重,他说:"他们都是我的老师,因此我要想照顾孩子一样照顾他们!""

    14"两年前99年的时候带领乌拉圭国家队......"

    15"丹麦是斯堪的纳维亚半岛上的一个国家"

    16"这个是雷科巴,他效力于意甲的国际米兰部队!"

    17"。。。书写了新安徒生神话"

    18"这个队员的身材不算高,才1米76,相对的体重比较大......"

    19韩:"手球!肯定是手球!!裁判没有判点球??张路,你看见是手球吗??"

    张:"是手球"

    韩:"让我门看看慢镜头~~~好象没有手球~~~"

    20"虽然脱夫丁长的比较凶悍......他长得象个屠夫......但是据说还是很有爱心的,很有爱心的。~~~"

    21"。。。正好跳起来!一个低空俯冲"

    22"乌拉圭小组赛打败澳大利亚,登上了吉尼斯世界杯的最后一班列车"

    23"头球,进了~~~这个头球太漂亮了,让我们看看慢动作~哦~~~是用脚踢的............"

    24"双方对员都奔跑得贼快......"

    25"南非队开出角球--,这个球被巴拉圭队的替补门将得到了!"

    26"下半场进行了88分钟!"

    27"也不能说10个1加起来就一定大于10"

    28"西班牙守门员XXXX先用右眼望了一下球门柱"

    29"西班牙某队员XXXX带球突破对方前列腺"

 

    

    1"劳儿是属于打脑子的球员"

    2"西班牙在世界杯之外的其他世界杯比赛上。。。"

    3"优秀的足球运动员都有三只脚...左脚...右脚...还有头"

    4"斯洛文尼亚13号队员非常能跑,一个人能当两个人用。对,就是白头发的那个。

    "(此时镜头拉近,给了个特写,13号是个光头!)

    5"西班牙队的卡犀利亚司是一个年仅21岁的门将,今年19岁。。啊。。。21岁。"

    6"这个任意球很有质量,直接打到门楣上,门的眉毛呀"

    7"尽管主教练卡马乔的体重很沉,但是由于他十分兴奋......这种兴奋,使他产生了很大的势能,足以托起了他沉重的体重......"

    8"这个球员身高一米三七"(巴拉圭对南非的比赛时)

    9"这一记射门 力量快 速度大"

    10"XXX30公里外一脚射门"

posted @ 2007-08-27 21:36 CharlieShen| 编辑 收藏

乔丹又习惯性的舔舔自己的舌头。

posted @ 2007-08-27 21:36 CharlieShen| 编辑 收藏

14
 14.鸭子和螃蟹赛跑,同时到达终点,难分胜负,裁判说:你俩来石头剪子布吧!鸭子大怒:他妈的!黑哨 啊!算计我,我一出就是布,他一出总是剪。
posted @ 2007-08-27 21:33 CharlieShen| 编辑 收藏

12
 12.猪找上帝要求投胎做人。帝问曰:耕种?答太苦。曰:做工?答太累。曰:耍猴?答太难。帝问何求? 答:能吃能喝还能嫖!帝大惊:狗日的还想当国家干部!
posted @ 2007-08-27 21:32 CharlieShen| 编辑 收藏

13
13.产房里一小孩出生后 哈哈大笑,接生护士都非常奇怪,围拢观察发现小孩拳头紧握,掰开后发现是一粒 堕胎药,只听小孩说:他妈的!想干掉我?没那么容易!!!
posted @ 2007-08-27 21:32 CharlieShen| 编辑 收藏

13
13.产房里一小孩出生后 哈哈大笑,接生护士都非常奇怪,围拢观察发现小孩拳头紧握,掰开后发现是一粒 堕胎药,只听小孩说:他妈的!想干掉我?没那么容易!!!
posted @ 2007-08-27 21:32 CharlieShen| 编辑 收藏

10
10. 20年前妈抱着你在 等车,人都笑话孩子长的难看,妈哭了,一个卖香蕉的老大爷拍拍妈妈说:大妹子 别哭啦!把香蕉给你家猴吃吧!真可怜都饿的没毛了。。。
posted @ 2007-08-27 21:31 CharlieShen| 编辑 收藏

11
11.农民赶驴进城,遇到 无赖,无赖:吃饭没?农民说:吃了。无赖:我问的是驴。农民一听,转身对 驴扇两耳光:妈的,城里有亲戚也不说一声。
posted @ 2007-08-27 21:31 CharlieShen| 编辑 收藏

6
 6.京九铁路通车,沿线 农民路边观看,车上一女客换卫生巾后扔出窗外,迎面贴一农民脸上,农民拿下后 说:X他妈火车就是快,飘张纸都能把鼻子打出血来!!!
posted @ 2007-08-27 21:30 CharlieShen| 编辑 收藏

7
 7.你听过吗?前世500次 回眸才换得今生的擦肩一过,1000次回眸才有缘今生相视一笑,像咱们这样的朋友 ,上辈子没干别的,光他妈的回头了。。。
posted @ 2007-08-27 21:30 CharlieShen| 编辑 收藏

8
8.一女在厕所小便,一 醉鬼酒后误入,听到哗哗尿声,忙说:别倒了,我真的不喝了 !女吓坏了,不敢在 尿,憋不住放了个屁,酒鬼说:********么又启了一瓶!
posted @ 2007-08-27 21:30 CharlieShen| 编辑 收藏

9
 9.清早起来,公鸡把母 鸡好顿揍别人为其拉开,问母鸡:公鸡为何打你?母鸡说我也不知道便问公鸡,公 鸡说:操它亲娘的,它今天早晨起来下了个鸭蛋!!!
posted @ 2007-08-27 21:30 CharlieShen| 编辑 收藏

3
3. 某饭店养只鹦鹉挂在 门口,有客到就说:你好欢迎光临!一常客想:我快点进看你有何反应。一天他 蹭就跑进去了,鹦鹉说:x你妈!吓我一跳!!!
posted @ 2007-08-27 21:29 CharlieShen| 编辑 收藏

4
4.一次军事演习中,一 颗炮弹偏离很远,派去查看的士兵发现:炮弹落在农田里,田中正站着你,你 衣衫破碎满面漆黑饱含热泪地说:偷颗白菜犯得着用炮弹轰???
posted @ 2007-08-27 21:29 CharlieShen| 编辑 收藏

5
5.餐厅苍蝇对厕所苍蝇 说:你整天追腥逐臭,我整天吃香喝辣,过来吧!厕所苍蝇:道不同不相为谋, 吃在好有啥用,光屁屁美女你见过几个???
posted @ 2007-08-27 21:29 CharlieShen| 编辑 收藏

  1. 猎人打猎,看树上有 两只鸟,举枪打下一只,发现是只没毛的,正纳闷,另一只鸟飞下来大骂猎人:他 妈的,老子刚哄她把衣服脱光,你就把她打下来了。。。
posted @ 2007-08-27 21:28 CharlieShen| 编辑 收藏

2
 2.农夫要杀公鸡却逮不着,于是抓起母鸡对公鸡说:再不下来让你当光棍儿!公鸡:你他妈以为我傻呀 ,我下去她就成寡妇了。。。
posted @ 2007-08-27 21:28 CharlieShen| 编辑 收藏

一位30多岁的男旅客扶着一位老太太要进“母子候车室”。车站服务员拦住他,“对不起!这里是母子候车室。”男旅客指着老太太一本正经地说:“是啊!她是我母亲。”
posted @ 2007-08-27 21:27 CharlieShen| 编辑 收藏

 旅客:“同志,今天你们餐车熬的大米稀饭咋这么稀?价格反而贵了一毛?”
    服务员:“俗话说得好,物以稀为贵嘛。”
posted @ 2007-08-27 21:27 CharlieShen| 编辑 收藏

 列车即将进入白城,维特教授问旁边的导游:“您经常到这儿来吗?”
    “对,一年好几次。”
    “您能告诉我,哪个旅店最好?”
    “波格饭店。”
    “您总是住在那儿?”教授又问。
    “不,别的店我都住过了,只有波格饭店没住过。”
posted @ 2007-08-27 21:27 CharlieShen| 编辑 收藏

一个欧洲游客在东京的商店里想买运动服的拉链。
    他用手势向一位女售货员比划了好一阵子,终于,女售货员明白了,拿出一把用于剖腹的剑放到了柜台上。
posted @ 2007-08-27 21:26 CharlieShen| 编辑 收藏


    他在车厢里很有礼貌地问坐在旁边的女士:“我抽烟妨碍你吗?”
    “不,你就像在家里一样好了。”他只能将烟盒重新放回衣袋,叹口气道:“照样不能抽。”
posted @ 2007-08-27 21:26 CharlieShen| 编辑 收藏

 一个人到山区旅行,他看中了山中猎户家中的一顶兔皮帽子,对猎户说:“这顶帽子我很喜欢,不知兔皮是否怕水?
    猎户说:“当然不怕,你什么时候见过兔子打伞。”
posted @ 2007-08-27 21:25 CharlieShen| 编辑 收藏

    一个人外出旅游,在宾馆楼下的饮食店里,他指着刚给他端来的面包,抱怨老板说:“我昨天吃的有这个两倍大、三倍厚,为什么同样价钱今天却变得这么小?”
    老板解释:“因为你昨天坐在靠窗的位子,街上来往行人对你桌上的东西看得一清二楚,所以,坐那个位子的顾客,我们店总是端出用作宣传的大面包。”
posted @ 2007-08-27 21:25 CharlieShen| 编辑 收藏

一女子听说,遇到事情慌张的时候,只要喝口冷水就会镇静下来。一天,她和丈夫乘船出去游玩,不料丈夫失足落水。她见丈夫慌张,便喊:“别慌!快喝口水!”
posted @ 2007-08-27 21:24 CharlieShen| 编辑 收藏

 一个人到外地旅行,他带着一大堆行李要了一辆出租车。司机告诉他需要7元钱,行李免费。他急忙说:“那请你把这些行李送到火车站,我自己步行赶来。”
posted @ 2007-08-27 21:24 CharlieShen| 编辑 收藏

25、青蛙和袋鼠去嫖鸡,袋鼠三俩下完事,听见隔壁整夜一二三嘿!一二三嘿!袋鼠好羡慕!次日早上,袋鼠说:“蛙兄你好棒哦!”青蛙:“操!老子一夜都没跳上床

26、阴道与肛门为邻,引导对肛门说:独眼龙进进出出的你也不出来帮忙,肛门说:每次它来,两颗手雷都挂在我家门口,吓都吓死我了,哪还敢出来?

27、皇帝见妃子愁容满面,急召御医,御医诊后开出处方:壮汉八条!帝外巡,回宫见妃容光焕发,殿前跪着八名瘦汉。帝:下跪何人?御医:药渣!

28、一女兵冒充男兵上前线,光荣负伤后,送到手术室进行抢救,手术医生出来后激动地对首长说:太惨烈了!他的下身都炸没了,只剩下一条缝,我给缝上了。

29、老师带学生去游泳,换好游泳衣,老师的游泳裤边露出一根阴毛,一个学生问:"老师, 那是什么? 老师低头一看大窘,啪的一下把阴毛拔下说:"那是一根线头"

30、夫欲远行,欲与妻欢好,妻曰:经期至。夫又欲采后庭,妻又曰:痔疮破。夫大怒,曰:若再言口腔溃疡者,必杀之!

31、二子他妈,你这是干嘛去呀
上法院打官司去
原告被告
原告
原告,够牛比呀
牛比嘛呀,被强靠了

32、女郎买了香蕉,上公车后放后口袋,不时伸手往后抓。过了一阵,有位年青人拍拍她肩膀:小姐,请松手,我要下车了

33、计划生育部长下乡普查,问老农:您知道近亲为什么不能结婚吗?l老农憨厚的笑答 :亲戚嘛,呵呵呵呵呵呵……呵呵,太熟,不好下手!

34、> 认识你至今,你在我心中的地位,你应该很清楚。除了你之外,其他人在我眼中根本 是一堆屎,可是你不一样,因为你是。。。两堆屎

35、录取通知:恭喜你已经被美国牛津大学野蛮系没文化班正式录取。请带齐你的痴呆症等各种疑难杂症到北京文盲路弱智街白日梦号美国大屎馆报到

36、十六大绝密文件:为提高国民素质,国务院决定扫除一批相貌丑陋的低能青年,你马上收拾东西出去避避,不要谢我,赶快走,注意安全!

37、你来我往发短信叫做信交往,频繁互发短信叫做信高潮,向别人发无聊短信叫做信骚扰,只收不发叫做信冷淡,只打电话不写短信叫做信无能。

38、甲与乙吵架,甲骂道:"当初一生下来,你妈就应把你掐死. 乙反击道:"当初你爸就应把你射在墙上!

39、一美国人向一中国人吹嘘:我们国内吃口香糖不乱吐,回收后制成避孕套出口中国。中国人:这算什么,我们用完避孕套也不乱扔,回收后制成口香糖出口美国。

40、跟你当这么久的朋友,你一直都很关心我,
  > 我却时常给你添麻烦,真不知该怎么报答你...
  > 所以...下辈子作牛作马....我一定会拔草给你吃的...
由明天开始,市政府决定清除所有长相丑陋,有损市容的弱智青年!
  > 你快快收拾东西,出去避避风头,别跟人说是我通知你的,切记!

41、两只海龟在海滩上靠靠后相约一年后再见,第二年公海龟早早来到海滩,发现母海龟已经等在那里,甚喜,急欲上前,母海龟大骂;你他妈爽完也不把我翻过来,我都在这晒了一年了!

42、那天遇见上帝,他说答应我一个愿望,我说希望世界和平,他说太难不好办。我拿出你的相片希望他把你变漂亮点,上帝接过你的相片说:“拿地球仪我再看看”

43、老婆是cao作系统,一旦安装卸载十分麻烦,二奶是互联网,风光无限花钱不断,小蜜是桌布,只要你有兴趣天天可以更换

44、我谨代表党中央,国务院,全国人大,中央军委,港澳台办公室向你提出强烈抗议:你昨晚尿床留下的中国地图为啥没有台湾!!!今晚记得补上!!!

45、蚂蚁娶了蜈蚣为妻,洞房之夜后,问蚂蚁有何感想,蚂蚁愤枫的说:扳开一条腿不是,又扳开一条腿也不是......妈的扳了一晚上的腿!

posted @ 2007-08-27 21:16 CharlieShen| 编辑 收藏

、一个赌徒的名字在每个国家都不一样,在日本叫倒光银子,俄罗斯叫苏斯里娃,韩国叫金德苏,在美国叫约翰约森,在中国叫苏安逸,在德国叫里瓦尔贝斯.

47、某男入厕便秘,忽见一人飞奔而入,顷刻风雨交加。“哥们,真羡慕你,那么快!”“羡慕啥?!还没脱裤子呢!!”

48、下?介铰一下本次100米添的??啉手的名字:1?啉手是中??的必孕?,2?啉手是蒙古?的插哩猛甘;3?啉手是俄吝斯啉手不?汆不爽斯基,4?啉手是?自美??的?巴插逼哩,5?啉手是?自眍??的?道肉,6?啉手是?自日本?的?钷正剪!

49、顶!上联:想当初,红米饭南瓜汤,老婆一个孩子一班。下联:看今天,白米饭王八汤,孩子一个老婆一班。横批:与时俱进

50、公牛出差,恐母牛无人照顾.便寻思:猴子狡猾,老虎凶残,唯大象可靠.不日公牛归来从象处领回夫人.次日公牛怒斥:牛B大了

51、一夫妇带吃奶的孩子去餐厅用餐,孩子哭闹,女人赶紧掀衣,服务生制止,女大怒:难道这也不行吗?服务生说:露胸可以但不能自带饮料

52、计生办的工作人员到一个山村去检查工作,发现超生很严重,就问老乡:“你们这儿怎么超生这么严重呢?”老乡答道:“没电”。“没电就超生呀!”当官的生气地说。“没电没事干”。“没事干咋了?”当官的一脸困惑。“没事干,就干那事 呗。”

53、那英洗澡-雾里看花。毛宁撒尿-淘声依旧。董文华初夜-血染的风采。陈红捉靠-常回家看看。彭丽媛大便-在希望的田野上。杨玉莹放屁-轻轻的告诉你

54、有两个傻子想开鞋店,听说鳄鱼的鞋值钱,他们就去河里抓鳄鱼了,还真没少抓,都40多只了。一个傻子说:“大哥,抓到第50只鳄鱼它要是再没穿鞋咱就别抓了!!!”

55、你拉着一头z逛街,很幸福的样子,我经过满怀同情的说:“看一个人的档次,就看他跟谁在一起。”话未说完,就看那z很鄙夷的弃你而去!

56、一男未娶,一女未嫁,经媒人介绍两人结合,男的自我介绍:一杆枪,两颗蛋,38年没抗战。女的:一扇窗,两扇门,26年没进人。媒人曰:傻比傻蛋。

57、油田,一对新人刚完婚。对长送来一副对联,上联:新人新井新钻头。下联:越钻越深越出油。横批:月明松。(明字分开读即可)

58、一个男生很喜欢一个女孩,,一直都紧追不舍,女孩对男生又不感冒,由于男生死缠烂打,终于有一天女生在上课的时候转身大力的拍了桌子,大声对男生说 :你到底喜欢我什么阿!!我改还不行么???

59、瘸子和瞎子同骑一辆车外出.瞎子骑,瘸子看路.突然瘸子发现前面有一条深沟,急呼:"沟 沟沟!"瞎子回唱到:噢嘞 噢嘞 噢嘞!二人一起掉入沟中.

60、山东扫盲,老师在黑板上写“日”和“天”说:一日就是一天,一天一日。下边一 老农说:老师你说的不对,一天一日行,一日一天可不行。 某人在老婆怀孕9个月还同房,一月后生下个男孩,一出生就问:我爸爸是谁?他说:是我啊!于是男孩用手指狂戳他爸的头说:这样戳你疼不疼?疼不疼?

61、好朋友就象胸罩舒服贴心永远支撑着你,象内裤就算你大起大落他永远包容着你,还象卫生巾你伤心流血他帮你擦,更象避孕套你捅了多大的娄子他都帮你兜着!

62、一老农为试伟哥之效,拿来喂公鸡,次日老农发现全村母鸡都被干死。抬头见公鸡立于树梢,问其故,鸡曰:“想日老鹰”

63、我真的好累,你让我不停的换体位,换了前位换后位,你让我射了还不让我睡,最后还让我谈体会,哎/踢球真的好累.

64、绿油油的牧畜芽,大姑娘小媳妇地里爬,谁要在来偷牧畜,种一地大肌八.稀奇稀奇真稀奇,哪有地里种刁的,要是你家的刁丰收了,你要预备多少大闺女.

65、和绅考纪晓岚,出上联:树上有只鸟,鸟摇树也摇,鸟都飞走了,树还摇三摇.纪晓岚对下联:和绅去尿尿,鸟摇尿也摇,尿都尿完了,鸟还摇三摇.

66、白天停水,晚上停电,发不出工资,买不了面,打开邓选找到了答案,原来是社会主义初级阶段.往后一翻,我操/一百年不变/这可咋办?

67、和总统睡觉叫国睡,和乞丐睡觉叫地睡,和老婆睡觉叫所得睡,和小姨子睡觉叫增值睡,和情人睡觉叫偷睡,和小姐睡觉叫印花睡。

68、丈夫开灯时不小心把手印留在刚刷过油漆的墙壁上。次日,妻子叫来油漆工:我想让你看看昨晚我丈夫摸过的地方。油漆工晕倒……

69、小明:爸爸,古时候,皇帝自称寡人,那皇后该自称什么?父亲:傻孩子,那皇后当然称寡妇啦!

70、护士看到病人在病房喝酒,就走过去小声叮嘱说:“小心肝!”病人微笑道: “小 宝贝。”

71、生活美好多幸福,朋友很多不孤独。勇敢向前不服输,幽默短信发给z,z接短信就笑了,回信我也不要了,就当给z上料了,效果我也知道了。

72、机密档案:姓名:董全瑞;绰号四虎子;死亡原因:连长说:炸药包一面有强力胶,单手托起粘在碉堡下就行了;临终遗言:连长我靠靠靠!两面都有胶。

posted @ 2007-08-27 21:16 CharlieShen| 编辑 收藏

1、你开会呢吧?对,说话不方便吧?啊,那我说你听,行,我想你了,噢,你想我吗?嗯,昨天你真坏,嗨。

2、算命先生与小姐对白:“你命不好。”“ 为什么?”“ 因为你身上带有凶兆。 ” “那我把胸罩脱了行吗?”“ 不行,你一脱了凶兆,就会出现人生的两个大波。”
3、一精神病躺在床上唱歌,唱着唱着翻了个身,趴在枕头上继续唱.主治医生问他为啥. 神经病:傻瓜,A面唱完当然要唱B面

4、醉汉:亲爱的,咱家闹鬼,我刚才上厕所一开门灯自动就亮了.尿完关门灯自己灭了.妻大骂:你又把尿撒到冰箱里了    

5、一游泳教练靠直爽而嗓门大.一日,他在商场看到一个女学员.他大声说:你穿上衣服,还真认不出!

6、讲课时女老师裤子拉链开了,一女生站起来提醒:老师,你门没关!老师一摆手:不管它 ,一会儿教导主任要来参观

7、现代美女誓言:把60岁的男人思想搞乱,50岁的财产霸占,40岁的妻离子散,30岁的腰杆搞断,20岁的围着我转!

8、新婚次日一大早,新娘痛苦地从洞房走出,一手扶着墙壁,一手捂着下身,大骂:骗子!真是个骗子!结婚前说有三十年的积蓄,我还以为是钱呢!

9、男女朋友睡一个房间,女的划了条线:过线的是禽兽。醒来发现男的真的没过线 ,女的狠狠打了男的一耳光:你连禽兽都不如!次日,两男女又同睡一床,女照旧画线警告,男有了上次教训,深夜过线动作,结果因为紧张而未果.天亮后,女又煽男一巴掌,说到:没想到你不如禽兽!

10、医院的树阴下,一对情人在拥抱接吻。一个医生看见了,过去对那男的说:“你真 糊涂,施行人工呼吸,应该把她平放在地上才行,走开让我来。”

11、某晚,一裸男叫了一辆出租车,女司机目不转睛盯着看他,裸男大怒,吼道:你他妈没见过裸男呀!女司机也大怒:我看你他妈从哪儿掏钱!

12、问:谁是世界上最可怜的人?答:炮兵连炊事班战士!问:为什么?答:戴绿帽背黑锅看别人打炮。

13、一对苍蝇母子正在进餐,儿子皱着眉头问母亲:“妈妈,我们为什么要每天吃大便 啊?”妈妈说:“不要在吃饭的时候说这么恶心的话,快趁热吃!”

14、一天0跟8,6跟9在街上相遇,0不屑地看了8一眼说:胖就胖呗,还系什么裤腰带! 6看都不看9便说:酷就酷呗,玩什么倒立!

15、领导工作搞不好的原因:一是没关系,象寡妇睡觉,上面没人;二是不稳定,象妓女睡觉,上面老换人;三是不团结,象和老婆睡觉,自已人老搞自已人。

16、有一对夫妇,第一胎生了个女孩取名招弟,第二胎又是一个女孩,取名“又招”,第三胎还是女孩取名“再招,第四胎仍旧是女孩,父亲火了,给她取名“绝招”。
  

17、东八沟很穷:穿衣基本靠纺;吃饭基本靠党;致富基本靠抢;娶媳妇基本靠想。西八沟更穷:通讯基本靠吼;交通基本靠走;治安基本靠狗;靠生活基本靠手。

19、一个新的生命降临 在人们高兴之余 大夫却发现他的一只手里好像攥着什么东西 待掰开他的手时却发现是一粒避孕药 这时小孩开口说:一个小时前你们还想把我灭掉让你们看看这是没门的..

20、一对男女在亲热,男的十分卖力,女的却毫无反映,男的生气的问道:“你就不能有点反映吗?连床也不会叫!”女的听后连忙大叫:“床!!床!!”

21、世界组织太空探险,有英国人、美国人、苏联人,每人允许带60公斤的东西,英国人带了老婆,美国人带了锻炼器械,苏联人带了60公斤烟草,1年后,在机场迎接的时候记者发现,英国人和老婆带着孩子下来,美国人更加强壮了,苏联人背着60公斤烟草。记者很奇怪,就问苏联人,他们都有变化,怎么你还带着60公斤烟草啊?苏联人说了一句:他靠的!忘带火了!

posted @ 2007-08-27 21:15 CharlieShen| 编辑 收藏

60 TB 案例展示 - 大型数据仓库实施经验谈 完整展示图:企业服务提供和使用
ABAP新资讯 - 强化开发能力的ABAP新概念 企业 SOA 与组合应用之路
在ABAP中使用Web Dynpro技术综述 实施组合应用:方法和技能要求
在SAP NetWeaver上使用开源架构 组合SAP NetWeaver应用实施:方法和技能要求
SAP NetWeaver开发基础架构深入探讨 SAP NetWeaver 组合环境对Java 标准与开源的支持
用SAP NetWeaver保证应用程序的高可用性 SAP GRC (管理、风险和监督) 步入身份管理时代
虚拟环境中的SAP应用程序 SAP 身份管理- 今日与未来
升级到 SAP NetWeaver 7.0 BI 的最佳实践 企业 SOA 安全
SAP NetWeaver主数据管理的最新信息 SAP NetWeaver 企业搜索介绍
保证关键业务流程持续运作 SAP NetWeaver Mobile 7.1: SAP 移动平台新生代
BPMN 协同商务流程管理 - 演示会 SAP NetWeaver Portal:未来 12 个月的产品路图
SAP NetWeaver Process Integration 7.1 - 综述 SAP 的用户界面(UI)策略

posted @ 2007-08-27 21:12 CharlieShen| 编辑 收藏

演示讲座

SAP TechEd 将邀请 SAP 在各个技术领域的专家包括开发者,产品开发经理以及实施顾问和大家分享他们的专业知识和丰富经验。

您可以通过以下演讲和实践操作主题了解今年 SAP TechEd 向您提供的丰富内容,讲师以及每个主题的时间安排将在稍后公布,敬请留意。

演示讲座

60 TB 案例展示 - 大型数据仓库实施经验谈 完整展示图:企业服务提供和使用
ABAP新资讯 - 强化开发能力的ABAP新概念 企业 SOA 与组合应用之路
在ABAP中使用Web Dynpro技术综述 实施组合应用:方法和技能要求
在SAP NetWeaver上使用开源架构 组合SAP NetWeaver应用实施:方法和技能要求
SAP NetWeaver开发基础架构深入探讨 SAP NetWeaver 组合环境对Java 标准与开源的支持
用SAP NetWeaver保证应用程序的高可用性 SAP GRC (管理、风险和监督) 步入身份管理时代
虚拟环境中的SAP应用程序 SAP 身份管理- 今日与未来
升级到 SAP NetWeaver 7.0 BI 的最佳实践 企业 SOA 安全
SAP NetWeaver主数据管理的最新信息 SAP NetWeaver 企业搜索介绍
保证关键业务流程持续运作 SAP NetWeaver Mobile 7.1: SAP 移动平台新生代
BPMN 协同商务流程管理 - 演示会 SAP NetWeaver Portal:未来 12 个月的产品路图
SAP NetWeaver Process Integration 7.1 - 综述 SAP 的用户界面(UI)策略

实践操作

  • 商业智能的最新变革——增强的格式化报表和管理仪表板的多元化分析
  • ABAP开发,学习SAP NetWeaver 7.0新知
  • 异构环境(Microsoft.NET/Java)下的企业服务使用
  • 试驾SAP发现系统,抢先了解企业 SOA
  • 使用SAP组合应用框架 (CE 7.1) 进行服务组合

    * 想要了解更多演示讲座及实践操作详情,请访问 SAP TechEd'07 专题讲座


    讲座类型以及听讲规定

    演示讲座 1-Hour Lecture 

    每场演示讲座时间为 1 小时,包括 PPT讲演和连线示范。事先熟悉演讲内容将有助于您的现场听讲效果。我们的讲师将会留出提问和探讨的时间,以便您深入了解演讲内容。会议室大小视情况而定,各演讲座位先到先得,无需事先预定。

    实践操作  2-Hour Hands-on 

    每场实践操作时间为 2 小时,包括实践学习和操作练习。两人合用一台联机电脑,讲师将在最后留出提问和探讨的时间。

    实践操作报名

    实践操作报名程序将在 9 月开启,到时我们将事先以电子邮件的形式通知您,具体开始的日期和时间。

    本次大会共设 5 场实践操作,每场设 100 操作席位, 100 旁听席位,付费报名者限报一场实践操作,由于上机操作席位有限,请您尽早付款及时获得报名资格。

    关于实践操作座位的规定

    实践操作开场前,需进行注册核对,确认是否报名。我们将在开场时将空余位子开放给其他人员,所以请务必提前进场。对于任何迟到者,我们将不会为其保留位置。

    如实践操作开场时仍有空位,参会者可以进入。

    关于实践操作旁听的规定

    参会者可以进入实践操作会场进行旁听,旁听席遵从先到先得原则,如旁听席满,则不能进入。

    每场讲座最大容纳量

    每场讲座的听众数量必须严格遵照会场的最大容纳数量。

    关于大会讲义

    出于环保考虑, SAP TechEd 不会为参会者准备纸质讲义。出于实践操作练习的需要,我们只为参加实践操作的参会者提供相应场次的讲义。我们将用电子邮件通知所有参会者,在会议开始前一周,所有讲义都将以 PDF 的格式被上传到 SAP TechEd 的注册网站上。因此,您需要凭注册编号和电子邮件地址下载所有讲义或根据需要自行打印。

    基本须知

    整个会议将在上海国际会议中心举行。我们将根据演讲者的情况确定现场的语言环境。各讲座所使用的语言届时将会公布在大会官方网站上,敬请留意。

    SAP 有权对所有讲演主题进行修改。

    声明

    SAP TechEd '07 会议期间 SAP 对因会议资料误差所造成的损失不承担任何责任; SAP 对因使用会议资料或者其他信息所造成的损失不承担任何责任。

    SAP 特别声明:对于 SAP TechEd ‘07 会议中发生的 / 或与参会相关的人身伤害和财产损失, SAP 不承担任何责任。

    SAP 保留随时拒绝或者取消某些注册的权利。
  • posted @ 2007-08-27 21:11 CharlieShen| 编辑 收藏

    SAP TechEd 将邀请 SAP 在各个技术领域的专家包括开发者,产品开发经理以及实施顾问和大家分享他们的专业知识和丰富经验。

    您可以通过以下演讲和实践操作主题了解今年 SAP TechEd 向您提供的丰富内容,讲师以及每个主题的时间安排将在稍后公布,敬请留意。

    posted @ 2007-08-27 21:11 CharlieShen| 编辑 收藏

    作为亚太地区首家从事汽车设计开发的合资企业,泛亚的成立,标志着立足于中国新一代轿车设计开发的新纪元的开始。目前,泛亚汽车技术中心已经发展成国内领先的汽车工程和设计中心。从业务上来讲,PATAC 是SGM的产品工程中心,其主要大客户为SGM, 共设有设计、车身/ 外饰、内饰、空调、电子等11 个工程部门。泛亚将通用汽车的先进技术和专业管理能力同上汽对中国国内市场的了解和经验相结合,为通用汽车、上汽集团以及相关合资企业提供众多汽车工程服务.

    选择SAP,为泛亚的腾飞增添新动力
    企业发展了,企业更需要腾飞,企业的腾飞更需要先进的管理方法和手段。泛亚早已独立开发完成了PR-online/E-timesheet等管理系统,但是伴随着企业的发展,泛亚发现该系统间数据无法共享,同时由于缺乏完整的企业资源管理系统,企业与SGM的相关系统不能集成,造成了业务经营中不能准确的跟踪统计项目的实施情况和费用状态,不能准确的控制项目预算的使用。泛亚迫切的希望能通过一套完整的企业管理系统优化物料管理及财务管理的作业流程,提高日常作业效率。

    经过慎重的选择,泛亚选择了SAP。首先由于SGM采用的是SAP 的商务解决方案,这样泛亚就可以同SGM 的系统具有良好的集成,使信息的沟通更加顺畅;更重要的是SAP作为全球领先的商务解决方案提供商,在全球及中国汽车行业得到了广泛的应用,帮助这些企业获得了最大的回报,深入了解汽车行业的需求,并在管理领域具有30年的业务实践经验。这些都是促使泛亚选择SAP 的原因所在。

    SAP解决方案在泛亚的使用,优化了企业的财务管理与物料管理流程,提高了企业日常管理的效率,为泛亚长期稳定的发展奠定了坚实的基础。

    专业的知识与经验使项目实施更加顺畅
    由于SAP中国咨询部业务咨询人员训练有素、专业背景丰富。在为众多汽车行业用户实施SAP项目的过程中积累了大量经验,泛亚也选择了SAP中国咨询部实施项目。SAP业务咨询人员根据泛亚自身的业务模式和特点,为项目的实施和成功上线做了详尽细致的准备工作。项目自2003 年7 月开始正式实施,在实施过程中正好遇到泛亚同SGM的业务整合期,由于在这一期间流程不稳定,出现了反复变更的状况,但是SAP 中国咨询部业务咨询人员克服困难,用自身的专业知识和长期积累的实施经验同泛亚的项目小组一起保证了泛亚SAP项目的顺利完成,并于2003 年9 月20 日正式上线。

    通过SAP 解决方案实现流程控制,提高日常工作效率SAP的解决方案覆盖泛亚的财务、采购和项目管理等部门,为泛亚提供了项目准确核算的工具。通过使用SAP内部订单子模块对项目的预算/ 实际费用/ 状态等进行实时监控,尤其引入的承诺费用概念加强了对预算的控制;使用SAP 作业类型的概念对项目实施过程中的人工/ 设备进行标准价格/ 使用数量的记录,从而实现项目间接费用的准确统计;使用SAP 销售模块实现销售价格的控制,实现按消耗成本开票,满足泛亚销售上的特殊性;针对泛亚以前的系统开发的PRonline/E-timesheet 与SAP 的双向数据接口,帮助泛亚实现数据完全共享;同时业务流程与系统设置参照GM的标准规范,与SGM的现有系统达到了有效集成。SAP解决方案在泛亚的使用,优化了企业的财务管理与物料管理流程,提高了企业日常管理的效率,为泛亚长期稳定的发展奠定了坚实的基础。

    SAP 业务咨询顾问—专业的服务是项目成功实施的有力保证
    SAP大中国区咨询服务部于1995年年底正式成立,分别设在北京、上海、广州、香港和台湾地区,拥有180 多位资深咨询顾问。
    SAP中国咨询队伍以其充足的人力资源、训练有素的咨询人员、专业的知识背景,利用科学的实施方法,通过现场业务/ 应用/ 技术咨询、远程应用/技术咨询、项目回顾程序、远程升级服务、远程归档服务、数据和结构转换服务、管理业务咨询、IT系统集成管理等途径为客户实施各项解决方案,向中国企业提供全面的企业管理和信息化的支持服务,全面优化和提高客户在SAP 行业解决方案上的投资价值。
    posted @ 2007-08-27 20:29 CharlieShen| 编辑 收藏

     在这系列三部分中,SearchSAP.com网站专家Jon Reed分析了来自Sapphire的信息,判断一些流行SAP技术的状态。

      SAP职业大牛Jon Reed分析来自Sapphire的新闻和消息,对于如何在未来SAP专业职业市场更有竞争力给出几个建议:

      在这系列三部分中,SearchSAP.com网站专家Jon Reed分析了来自Sapphire的信息,判断一些流行SAP技术的状态。在第一部分,他分析什么样的技术是未来需要的;在第二部分分析目前技术的地位,第三部分揭示哪些技术已经过了它们最好的时期。

      最基本的ABAP正在退出

      最基本的数据库转换/报表ABAP正在退出历史舞台。混合着Java工具的面向对象的ABAP是未来SAP开发技巧集。

      “和基本说再见。”基本正在给NetWeaver让路。从基本到NetWearver的技巧转换不像开发那么困难。

      EDI出局,XML入局

      对底层不易改变的公司来讲,仍有一些电子数据接口(Electronic Data Interface, EDI)工作需要做,但对其他任何人这是基于SOA/XML/Internet的B2B事务。EDI技术对大多数咨询师不再是技术所期望的部分。

      更多的SAP背景

      企业套装产品未来有隐患,特别是APO

      这可能是这一部分最有争议的陈述,假设企业套装仍然是SAP正在推广的主要部分。我们不知道再过几年企业套装的最终命运,当内核大量升级,公司更看重他们如何扩展它们的功能。

      最终企业软件的目标是什么?实现一个完全透明,需求驱动的将企业链接到所有客户和合作者的供应链。SAP将告诉你需要企业套装来实现这个目标。问题是是否能证明这些附加产品是实现目标的关键。我想企业可能会避免实现大附加套装的成本,取而代之的是他们能增加到他们期望的特定企业流程的xApps。

      我也希望SAP能将越来越多的称为企业套装的功能集成到内核中。这已经在数据仓库和战略企业管理中实现了,两个产品被完全集成到内核中。在SAP ERP2005上, SAP似乎也正在把一些客户关系管理和供应商关系管理功能集成到内核中。

      这是接受先进计划者和优化者(Advanced Planner and Optimizer,APO)不是技术上第四个企业套装产品的绝佳时间。第三个产品的正式名称是SCM。许多SCM功能已经潜入到企业版内核。APO仍然是SCM套装的旗舰产品,即使SAP已经很少提到它的名字。这些产品的功能是重要的,但我怀疑是否我们曾看到过基于这些应用的火爆的咨询市场。我看主要是企业服务和xApps对这些产品的市场产生冲击。

            最好的解决方案和第三方附加软件必须证明它们的价值否则就变成历史。

    一些第三方软件解决方案在SAP生态系统做的很好。但在更大的功能领域,最好的解决方案正在奋斗。最好的人力资源长期离去,最好的客户关系管理正在迅速退出。对大企业来说,跟随一个ERP销售商有着太多的经济意义。

      对于在植物养护和仓库管理领域适合的SAP咨询师是个好消息。我期望公司标准化SAP系统的这些关键逻辑组件。所以当最好的软件在目前紧张状态下努力保持时,SAP捕获的企业越多,对在附加SAP领域有技巧的咨询师就更容易。

      我没有考虑一些仍然没有定论的方面,比如对请求的解决办法,这对SAP可能或不可能取消。服务器信息块正在由3个SAP产品提供服务:Business One,All-in-one和A1S(SAP的新请求服务器信息块提供的)。在这一点上,只有All-in-one产品看起来似乎有一些咨询潜力,别的解决方案太不可能了。

      Web 2.0和Duet在Sapphire也引起了很多关注,虽然它们对SAP影响很大,但它们将如何影响SAP技术仍然不清楚。

      另一个野性的卡是RFID。RFID看起来是一个关键技术,没有很多技术上的壁垒,在这一点上采用RFID逐渐变多。最后随着更新浪潮,统一字符编码标准(unicode)在多语言SAP安装时需要考虑到。影响Unicode的因素是复杂的,但如果你的技术接触到它,这是另外一个需要关注的工具。

      当知道新的通用分类帐可能更立即有帮助时,SAP咨询师在跟上SAP重大前景和SOA培训投资上应当小心。同时将SAP的未来清晰地留在脑海对目前选择正确的项目是至关紧要的。SAP差不多总是到达它说它将要达到的地方,时间是困难的部分。

      解决SAP技术缺乏引起的轻易进入的最好方法是把它们看作是好消息但不要去假定“所有的事情都会变好”。市场变化迅速,公司应该谨慎行事,预算应有意识地采纳新技术。大多数项目都比较小,需要更多的时间获得允许,这使得技术需求的剧烈增加像过去一样高。因此我们应当继续当前技术和新兴技术相集成来达到我们的目的。

      Jon Reed是一位撰写SAP咨询趋势的独立的SAP咨询师。最近他担任SAPtips副总裁是SAPtips的创始编辑。他是SAP咨询师手册的作者。Jon Reed发表SAP职业和市场分析的文章已经超过10年了。他是SearchSAP.com的请教专家版面的职业专家。

    posted @ 2007-08-27 20:28 CharlieShen| 编辑 收藏

    “东邪西毒中神通”华山论“IT标准”

      2002年11月5日全球最大的企业管理和协同化电子商务解决方案供应商SAP公司的联合主席兼首席执行官孔翰宁博士(Prof.Dr.HenningKargermann)抵达了北京,在参加SAP举办的题为“创新无限,远见未来”的盛大30周年庆典活动的同时,也向媒体透露了SAP公司面向中小型业务的行业解决方案(SMB-SmallMediumBusiness),是SAP公司30年历史发展过程中又一个里程碑式的战略举措,当有媒体记者问道此项举措与1993年SAP推出具有划时代意义,基于客户服务器架构而风靡全球的主打产品R/3是否能够相提并论时,数学和物理学博士出身,略显内向的孔博士并没有正面回答。

      SAP公司为什么在利润丰厚的高端应用领域仍然独领风骚,财富500强超过80%的企业应用SAP企业管理解决方案时,如此大手笔推出面向中小型业务的解决方案SMB,SAP推出的SMB到底是什么?如果希望拨开迷雾,寻找真相,必须了解IT行业目前的竞争态势及将来的发展趋势。

      东邪西毒

      当今的IT世界,群雄争霸,但真正有资格能够华山论剑的不过区区几家,IBM可以比作IT界内的武当派,名门正宗、内功深厚,虽然也有兴衰交替的可能,但江山自有新人出,只要不断挑战自我,虽然是大象但也能跳舞。微软才华横溢,凭借当年在武当打小工时(IBM将PC操作系统的工作外包给微软)潜心研究的一套武林绝学MS-DOS,逐渐发展,不断壮大,利用Windows操作系统横扫天下,成为个人电脑PC的代名词,微软虽然武功极高,悟性极强,但树敌无数,只要是感兴趣的领域,必然设法将相关领域的各大门派斩尽杀绝,业界人称西毒。Oracle从武当闲置的秘笈中,得到关系数据库的相关宝典(关系数据库的理论是IBM首先提出的),很快统领一方,并且桀骜不驯,对武林鼻祖,名门正派不屑一顾,与西毒更是水火不容,业界号称东邪。SAP的五位创始人出身武当,但由于受到同门师兄的排挤,而且也不满清规戒律的束缚,自立门户。在高人指点下,20年磨一剑,练就降龙十八掌(1993年,SAP成立20年时,推出了R/3系统),从此江湖出现行事低调、武学精湛的大侠郭靖。

      “无论你的产品多么好,你距离彻底失败的时间总是只有18个月”,微软首席技术官纳森·迈克尔德这样评述,Oracle公司总裁拉里·埃里森说,“对于任何企业来说,容忍对手就注定要灭亡,安居老二最后就会被淘汰”。

      每一个业界巨头都有“一统”天下的梦想,在激烈竞争的IT世界中,谁能够成为最后的王者?

      华山论剑

      IT世界最终有资格指点江山、挥斥方遒的一定是“标准”的制订者。IBM、微软、Oracle、SAP这四大高手中,微软、IBM、Oracle都深谙此道,SAP虽然相对反应较慢,但毕竟资质清纯、心无杂念,一旦练到九重神功境界,也会审时度势,拳拳力道,汹涌而来。

      微软制订标准的方法是制作一张芸芸众生熟悉得不能再熟悉的脸———Windows界面,当绝大多数个人应用软件都基于这张脸进行开发时,微软就成为个人应用软件君临天下的王者,而一旦有人试图改变这张脸时,其结果必然是斩立决、杀无赦。微软不惜冒着触犯联邦垄断法案的风险利用捆绑战术,击垮了网景公司的互联网浏览器,利用Office套装软件击败了Lotus和WordPerfect.Oracle从关系数据库起家,敏锐地抓住了互联网技术不断发展带来的机遇,与Sun公司共同推出了网络计算的概念,目标直指微软对个人应用平台的垄断,网络计算和Java技术将使个人终端用户不再依赖某一特定平台,游戏规则将重新建立,一时间新的武林盟主似乎就要诞生。但微软不会善罢甘休,微软选择了和SAP紧密合作的方式,利用SAP在高端应用的品牌优势,通过让SAP的核心产品R/3运行在微软的WindowNT平台,使WindowsNT摆脱了低端系统的阴影,同时利用微软的SQLServer数据库向Oracle和IBM发起了攻击,利用Windows2000操作系统试图取代Sun公司基于Unix的企业和网络服务器产品。

      SAP是一家从德国小镇沃尔道夫走向世界的公司,一直以德国人的严谨和执着专注于企业管理应用软件的开发和应用,由于其产品的开发性和集成性,以及不断完善的行业管理实践,强大灵活可配置的功能,受到了越来越多企业客户的青睐,同时SAP充分让利给其合作伙伴(硬件、系统软件、咨询公司等),形成了围绕SAP产品的商业生态圈,使越来越多的合作伙伴愿意与之合作,SAP一度成为商业应用领域举足轻重的领袖人物。

      SAP曾经与Oracle关系密切,SAP的应用产品运行在Oracle的数据库上的百分比在Oracle推出自己的应用软件之前一直处于很高的位置,但Oracle的首席执行官拉里·埃里森不会只满足在数据库领域立腕扬名,随着Oracle在企业管理应用软件的推出,到了1999年Oracle已经成为SAP最大的竞争对手。

      SAP和微软的蜜月期也已结束,微软在全面扳回浏览器之战后,并成功地由“文件处理的领导者转变为套装办公软件的领导者后,微软的下一个领域就是企业应用领域,企业应用软件最终能确立和保证微软全线产品的持续增长。2000年初,微软以15亿美金收购制图软件制造商Vision;2000年12月,微软以11亿美金收购美国本土中型财务软件公司GreatPlains;2002年5月7日,微软以13亿美金收购欧洲小型企业应用软件供应商Navision;从长远来看,微软希望通过目前实施的.Net计划将所有的企业解决方案一揽门下。

      射雕英雄

      SAP需要重新定位自己的战略,管理应用软件本身面临着两难问题,如何在做到通用化的同时保证行业专业化,两者兼举必然导致系统的不断庞大,这同样是微软.Net战略当介入企业解决方案时必须面对的问题,如何化解?

      SAP推出了行业细分的中小型业务解决方案SMB-Allinone,这种解决方案的实质绝不是推出了轻型的SAP商务平台,相反它是一种SAP+的解决方案,它采用了有别于SAP传统的直销模式,利用合作伙伴在SAP的整体平台mySAP.BS(即mySAP.com)的基础上,开发面向不同行业的解决方案并采取渠道销售的经营模式,例如:某中国合作伙伴,利用SAP提供的行业开发工具IndustrySolutionMapComposer,开发了基于SAP整体平台的不同行业(汽车零部件、医药化工、高科技、零售分销等)解决方案-CSE(敏捷商务解决方案)系列产品,此产品通过了SAP公司的严格认证,SAP将不断致力于开发在数据库平台以上的业务模块组件(BuildingBlock),合作伙伴在此组件基础上,根据不同行业的具体需求不断开发面向行业的解决方案,如果能够有大量的合作伙伴基于SAP的模块组件开发应用软件,SAP实际上将从一个应用软件开发商转化为应用模块组件提供商,从而达到制订软件开发标准的目的。

      SAP推出的面向中小型业务的解决方案SMB-Allinone,是一个拥有SAP整体商务平台的解决方案,它利用合作伙伴进行行业定制开发,将以前在具体项目中解决的大部分问题,提前在产品中实现,大大缩短了实施周期和总体成本,使更多的客户,尤其是快速成长的中小型企业能够应用这样的管理平台提供自己的核心竞争能力。(完)

    posted @ 2007-08-27 20:25 CharlieShen| 编辑 收藏

    SAPBasis

    应该是从R/3开始(有待考证), SAP的底层已经形成基于ABAP的一个应用平台. 有统一的数据设计方案(DDIC), 界面设计方案, 开发流程, 版本控制, 数据库连接, 进程管理, 共享内存管理, 事务管理等等.它为商务的应用的编写提供了可靠的技术支持.

    简单的说R/3是一个基于ABAP虚机的,基于进程(进程间通过share memory通信)的, 基于数据库的, 提供事物特性的简单应用服务器。这在当时, 是极为先进的架构。也只有这种架构, 是的企业级的, 可灵活改造的, 可高效管理的应用成为可能。

    NetWeaver出现后, SAPBasis被改造为NetWeaver中的ABAP Application server.

    mySAPmySAP.com

    19999, CEO哈索.普拉特纳宣布以开放和集成为中心的mySAP.com的战略. 改造技术架构和方向, 统一和整合原有的系统, 推出mySAP协同化电子商务解决方案.

    当时的背景是Internet 技术趋向成熟和普及. 独立的应用之间的交流和灵活性扩展性的问题显得异常突出。业界技术的发展使得开放接口,整合产品成为共识。因此SAP决定提供可剪裁的, 高度集成和开放的系统。

    主要手段为:

    R/3上的业务系统划分的更细更合理, 提供不同功能的组建和系统。 数据类型是统一和跨系统的。SAP制定了一系列标准接口(如BAPI), 让各种应用之间可以互相通信。开发Single  Sign On 来简化Authentication等等。

    这张图是当时定义的mySAP.COM

    现在的mySAP Business Suit是一套协同化商务解决方案套件, 它包括:

    ²        mySAP CRM(Client Relationship  Management)

    ²        mySAP SCM(Supply Chain Management)

    ²        mySAP PLM(Product Lifecycle Management)

    ²        mySAP SRM(Supplier Relationship Management)

    ²        mySAP ERP(Enterprise Resource Planning).

    他们可以无缝的同其他系统集成.

    mySAP ERP 又提供4套单独的解决方案:

    ²        mySAP ERP Financial

    ²        mySAP ERP Capital Management

    ²        mySAP ERP Operation

    ²        mySAP ERP Corporate Service.

    下面这张图描绘了mySAP Business Suit的主要构件.

    NetWeaver出现之前, mySAP的技术平台应该是SAPBasis.

    如今的mySAP, 已经是基于NetWeaver, 因为SAPBasis已经被改造为NetWeaver的一部分.NetWeaverSAP的新一代技术平台.

    posted @ 2007-08-27 20:24 CharlieShen| 编辑 收藏

    SAP挑起ERP桌面厮杀 国内厂商紧紧跟上 2005.10.24  
    ●         “老虎伍兹不光打高尔夫球,也设计球道。”这是广泛流传在SAP员工中的一句名言。但10月17日,当这句话从蒋歆口中说出来的时候,格外意味深长。 

            蒋歆是SAP中国NetWeaver业务拓展总监。自今年7月初,NetWeaver平台在北京首届SAP创新技术论坛上正式亮相以来,有关NetWeaver的业务便骤然升温。 

            NetWeaver是一个大的开放式软件平台,以后SAP所有的应用都将构架在此平台上。最关键的是,NetWeaver还支持其他品牌的系统。 

            今年9月27日,SAP公司在波士顿举行的TechEd大会上宣布与惠普、戴尔、Novell、RSA安全公司、Avaya等RIM和Network Appliance等科技巨头建立合作关系,以进一步拓展其NetWeaver平台。 

    SAP的桌面争夺 

            随便查看一家企业CIO的电脑桌面,你至少能看到3个以上的企业级信息化系统。想要逐一查看,便要不停切换界面。 

            “因为我们的企业里有很多系统,我经常要从ERP(企业资源管理)切换到OA(办公自动化),再切换到CRM(客户关系管理),非常麻烦。”一位CIO这样说。 

            “所有IT软件提供商,都在思考如何解决这个问题。但是因为没有哪一家IT厂商能够垄断用户的所用应用系统。所以,最大范围地与其他厂商提供的应用兼容或有接口,才是出路。”蒋歆说。 

            而据他介绍,NetWeaver正是这样一个兼容NET、JAVA以及SAP自有开发语言的大平台,并且开放所有接口标准。这就意味着,如果所有IT厂商都能够基于NetWeaver平台去开发自己的软件系统,以后就不必担心相互之间的兼容问题。 

            据记者了解,早在2002年1月,SAP就推出了NetWeaver,但起初只是将SAP自己的所有系统由模块化进一步细分为流程。直到今年9月惠普等厂商的加入,才标志着此平台的正式对外开放。 

            “以前SAP将企业的每项业务都模块化,客户可以根据自己的需要,选择任意几个模块,然后搭积木一般组成自己需要的产品。但现在我们要将所有的企业运作细分为5000多个流程,客户可以按照自己的行业特性,在我们咨询师的帮助下,改善自己的流程。”SAP中国总裁西曼告诉记者。 

            据西曼介绍,当SAP去首钢做咨询时,发现首钢的业务共有600多个流程,但经过仔细分析,发现只需要几十个流程。 

            “按照中国企业的管理思路,每个流程都需要有专人负责。有一次去给一家公司做咨询时,发现他们有117个流程,结果开会的时候就要面对117张面孔,但分析过后觉得只需要二十几个流程。” 西曼说,这就是NetWeaver的流程整合。 

            随之而来的问题是,就算是SAP,也不可能通晓所有行业的所有流程,但客户却是不设限的,如何去保证NetWeaver平台拥有足够多的流程,去满足所有客户的需求? 

            “现在SAP正在调整战略,向平台提供商转换,并计划由第三方软件厂商(ISV)开发程序和附件,这其中包括中国。”西曼透露。 

            西曼解释说,任何一家ISV,只要你发现了一些特定行业的特定流程,然后基于NetWeaver平台开发出应用软件,SAP就可以在开拓该行业客户的同时,推荐这家ISV的流程,从而获得商业利益。 

            据悉,到今年底,SAP在NetWeaver平台上将拥有约1000个ISV。目前,中国已经通过SAP认证的企业有两家:一家是中软国际,正在开发用于卫生等公用事业的流程;另外一家是康而普(Comgroup),负责银行金融行业的某些流程。 

            “这些流程在全世界其他区域也都适用,因而一旦开发成功,就等于完善了NetWeaver平台,同时通过SAP的营销,也能实现自己的商业价值。”西曼说。 

            据西曼透露,明年初,SAP将会推出一款专门针对中国中型企业的软件,并首先在中国市场投入使用。 

    国产ERP紧追 

            正在SAP四处兜售NetWeaver时,它的老对手甲骨文在收购仁科、JD.E、Retek和Siebel等公司,通过技术整合后,于今年4月推出了一个类似的Fusion工程。 

            据介绍,Fusion可让用户更容易修改甲骨文程序,并与非甲骨文的软件系统分享信息,将来会成为所有甲骨文应用软件的支柱。 

            国产软件厂商也不甘示弱。9月13日,金蝶携手IBM等众多合作伙伴,在北京宣布正式推出其业务基础软件平台“金蝶BOS(5.0)”。 
      
            金蝶国际董事长徐少春说:“平台意味着DIY时代的来临。”这种DIY与装机相似,ERP平台就相当于主板,客户可以根据自己的需要将各种具体应用插件插到主板上,从而组装出自己需要的主机。 

            据称,基于这种平台下设计的ERP,将能快速、低成本地适应现在复杂商业环境所带来的种种变化,从而有效帮助用户降低管理软件的整体拥有成本(TCO)。 

            此外,用友带着UAP、金算盘带着VP…….也都以出人意料的激情加入到了这场“平台战役”当中。 

            然而业内人士评论,中国ERP厂商们目前的平台软件仅仅基于自己的技术,并不是真正意义上的“集成化”框架。 

            另一位不愿透露姓名的ERP业界知名人士也说:“现在国内的厂商们还都在各玩各的,但是缺乏数据对接可能性的平台,对于客户来说,仍然是一个相对独立存在的信息孤岛。” 

            相比之下,日本本土ERP厂商的互相联合却已经渐成趋势——几间拥有不同优势软件产品或模块的公司在各自的产品之间进行相互的集成,相互之间可以进行数据的导入导出厂商们相信,这种联合将给予客户更多的选择产品的自由度,有利于形成一个更集成、更全面的产品链来面向客户、同时与国外的ERP软件厂商竞争。 

            中国的学者对此大为赞赏,认为应该将这种单个国家ERP厂商间的联合,向亚洲各国之间推广,通过交流制定相对标准的行业规范,并以此为基础,进军国际市场。这也是反击SAP们的一条道路。 

            早在今年1月的亚洲ERP软件产业发展论坛上,日本与韩国ERP行业协会的领导建议,亚洲的软件联合起来,尽快制定亚洲的标准,以形成一个共同体来推动产业发展。 

            用友似乎看到了这个机会,该公司副总裁郑雨林曾表示,中日韩三方可以共同推动建立同一个标准,用友可以在技术与产品上来支持这个标准。 

            但金蝶看起来则是另有打算。在金蝶BOS(5.0)发布会上,徐少春反复强调金蝶并没有做“平台”的打算:“金蝶还是卖ERP软件的,不是卖平台的,当然我们欢迎合作伙伴以及其他厂商使用BOS平台来开发软件。”


    posted @ 2007-08-27 20:24 CharlieShen| 编辑 收藏

    很早就想写一点关于SAP的技术方面的文章, 但是一直不得闲, 也不知道该从哪里下手. SAP除了OS几乎生产了所有软件和solution, 并且不断在适应和加入业界的新技术, 调整自己原有的技术, 所以用一个大的概念来概括SAP的架构是很难的, 这也是为什么SAP的诸多概念, 比如mySAP, NetWeaver, ESA, AP, TP, BPP等等, 经常让人confuse的原因. 这些概念, 都有他的核心思想, 或者说核心动力, 但是, 他们不是一个产品, 而是一个概念, 所以他们的边界是无法弄的很清楚的, 不可避免, 他们之间会有Overlap. 比如DataArchiving, 它是一项负责保存应用数据的技术, 最早是在ABAP上实现的, 但是在SAP J2EE中也有实现, 所以, 它既属于NetWeaver, 也属于mySAP. 无论是mySAP, 还是NetWeaver, 他们都不是代表一项技术, 而都是代表以一组概念为核心的一整套概念.

    所以我想, 一个好的办法是从SAP的技术发展历史开始讲. 讲得不对请多指教.

    SAP发展历史

    1972, 五名IBM的经理人和consultant(看来工程师是永远写程序的命)离开了IBM, 在德国曼海母创建了他们自己的公司, 这就是SAP(是德文系统,应用和数据处理产品的缩写. 德国公司的名字永远这么朴素直接). (200241日是SAP 30周年纪念日)

    他们创建SAP的原因是, 当时他们发现自己的客户正在自行开发类似的程序来处理业务流程. 于是他们意识到他们可以提供可重用的标准化的系统, 来集成和实现用户的业务流程, 并且, 重要的一点是他们认为电脑现实器为普及作为业务流程的关键点. 当时没有微机, 计算机最多仅有500k内存. 有趣的是, 苹果公司于同年成立.

    SAP的第一个产品是一个自动化财务和交易程序.命名RF, 就是后来的R/1. (值得敬佩的是, 他们的产品是利用晚上和周末开发出来的, 而我用了6年证明, 这几乎是不可能的 :P )

    1976, SAP 迁到现在的总部所在地Walldorf.

    1979, SAP推出用于大型机的R/2.

    1988, SAP在德国上市.

    1992, SAP推出了著名的R/3. 基于C/S 模式, 统一的图形界面, 兼容关系数据库, 可以运行在WindowsNT等多种平台和计算上等先进的特性, 使SAP成为世界领先的系统提供商.

    但是, 至此SAP的所有应用都是独立的, 仅仅是client加上DataBase.

    1996, 随着互联网的迅猛发展, SAP推出了支持Internet的新版R/3 3.1

    1998, 退出全新CRMSCM解决方案.

    1999, SAP 推出所谓的mySAP Business Suit. 这其实又是新版的R/3, 但是它的应用已经不是孤立的, 它支持全面的协同的的电子商务和ERP解决方案.

    现在的SAP, 是员工超过30000, 实验室分布全球的世界第三大独立软件供应商. 提供超过21个行业,13个跨行业的解决方案, 拥有18000多家客户, 5000个系统安装点, 并已进入中小型企业市场. 技术上, SAP 有自己的商业开发语言(ABAP), 有自己的application Server, 自己的开发平台. SAP几乎可以提供除OS外所有基础软件和解决方案. 其实, netweavermySAP的概念对我们了解SAP的技术而言并不重要, 因为SAP的技术几乎概括一切, SAP的整个架构就是一个现代IT的领先技术架构的实现. 无论mySAP 还是NetWeaver, 还是AP/TP/BPP,  都是SAP为了适应更先进技术, 而发起的对SAP总体技术框架的改造运动.

    通过mySAP, SAP 实现了更方便, 更容易沟通的系统框架, 通过NetWeaver04, SAP成功的把它以前的所有技术和业务逻辑通过和J2EE平台集成而开放出来. 通过NetWeaver05 AP/BPP/TP/ESA, SAP实现更高程度的技术/业务分离(TP/AP), 更好的业务封装(AP), 更方便的顶层业务实现(BPP). R/3到底属于NetWeaver, 这个问题不重要, 可以属于也可以不属于, 你只要知道R/3的业务, 在新的web application 中可以依然被使用, 并且可以更好更漂亮更方便的被使用就可以了.

    领先的平台提供者

    SAP其实并不是现在才想做业务平台的领导者, 自他的ABAP出世, SAP一直就是世界最先进最主流的电子商务平台提供者. 只是现在, 特别是J2EE普及之后, 人们更多的认识到平台的重要性. SAP将围绕电子商业提供三种平台:

    1.       技术平台 TP(Technical Platform)也就是所谓的NetWeaver.

    它提供了所以技术基础设施. 他是J2EE的扩展, 它提供的内容远远超过J2EE的范畴. 他的架构同时也包括了基于ABAP vm 的应用服务器.

    2.       应用平台 (AP)

    NetWeaver虽然提供了技术平台, 但是, 要用他来实现一个企业的业务流程, 根本还是件极其复杂的事. 因此必须有离应用更近的平台, 提供基础业务设施的封装. 这就是所谓的AP (Application platform). 他是由SAPESA(Enterprise server architecture)来实现的. 简单的说, NetWeaver加上ESA, 就是AP, 他提供了一个实现基础业务逻辑的平台.

    3. 业务流程平台(BPP)

    这是一个面向业务流程的平台. 基础业务逻辑可以用AP实现, 通常SAP已经提供大量基于SAP系统的业务逻辑. 同时, 第三方也可能提供业务逻辑. BPP的开发人员只需要使用BPP的开发环境(Visual composure)去组装这些业务逻辑.

    现在

    下面我们分别来看每个概念

    posted @ 2007-08-27 20:23 CharlieShen| 编辑 收藏

    为一个世界知名大公司,SAP的的确确为这次研发者大会作了大量而充分的准备,无论是场地(上海这边是在东方明珠对面的香格里拉),还是参加演讲的人员(张侠、Simon Dale等),甚至是开场的那段宣传动画(商业气氛暴露的淋漓尽致,但是很专业)都能够说明这一点。         在致欢迎辞的环节,SAP的发言人一上来就提到使用Net Weaver意味着什么:"Bring you money",似乎一下子就把这次研发者大会定为到了一场纯粹的商业发布会,让我本来期望看到其技术思想的希望破灭了一半。也就是这句"Bring you money"在整个欢迎辞中反复出现了若干次,看来SAP是一定要把Net Wveaver的产品和理念推销给大家不可了。         接下来是SAP亚太区副总裁及首席技术官Simon Dale的主题演讲,据开场时SAP大中华区首席技术官张侠先生介绍,此人是IT行业内将工作与娱乐很好平衡的少有的典范,在工作之余喜欢网球,跑步,游泳还擅长拉丁热舞,早先在IBM做过数据仓库后来到一个创业公司负责Net Weaver前身的研发,当该公司被SAP收购一段时间后开始
    posted @ 2007-08-27 20:22 CharlieShen| 编辑 收藏

      2007年11月6日-11月7日,SAP将在上海国际会议中心举办“SAP全球研发者大会”。到目前为止,8月份的4折门票还有最后7天时间!大会组委会在这里提醒您,如果您想拥有超值的培训机会,请您务必在8月31日前缴纳您的费用。我们的折扣是以汇款日期为准,9月1日起,所有的门票将6折起售。

            此外,在此给准备交费的朋友几点提醒:
            1、如果您使用招行的一卡通交费,请您在交费后把您的交费回执传真给我们,同时在传真上标注您的注册号和名字。以便我们收到您的汇款后跟您确认。
            2、如果您使用企业转账的方式交费,请您在交费后把您的交费回执传真给我们,同时在传真上标注您的注册号和名字。以便我们收到您的汇款后跟您确认。
            3、本次大会的实践操作课选课权限将在9月份统一开通。实践操作课共五门,每门课限100人上机操作。因为人数有限,为了保证您参会的品质,请您尽量在8月底报名,以便在第一时间获得选课的权限。

            大会注册页面:http://sap.csdn.net/TechEd2007/registrationcn.aspx
            大会付费方式:http://sap.csdn.net/TechEd2007/reg_paymentcn.htm
            大会折扣信息:http://sap.csdn.net/TechEd2007/reg_feescn.htm
            大会咨询电话:010-64351456      联系人:程永莉

    posted @ 2007-08-27 20:21 CharlieShen| 编辑 收藏

    SAP职业生涯咨询会8.18深圳 8.25北京 8.26上海 9.1在线咨询
    SAP职业生涯咨询会8.18深圳 8.25北京 8.26上海 9.1在线咨询
    SAP职业生涯咨询会
    2007年8月18日9:00-11:30 深圳,大庆大厦九层
    2007年8月25日9:00-11:30 北京,海淀科技大厦
    2007年8月26日9:00-11:30 上海,扬子饭店
    2007年9月1日9:00-11:30 其他城市,在线咨询,www.ubase.cn
    即刻注册,与SAP和UBase专家直面交流!
    如何通过UBase进入SAP领域?SAP顾问发展前景如何?如何通过UBase人才服务找工作?
    携成功举办"SAP职业生涯日"的经验和心得,UBase和SAP将在2007年8月18日-9月1日,在全国范围
    内,面向全国的广大SAP人才和希望进入SAP领域的人才举办“SAP职业生涯咨询会”,指导人才通
    过UBase和SAP培训进入SAP领域,并通过UBase人才服务找工作,帮助业界吸收和培养优秀人才,
    帮助人才在SAP行业开始职业生涯。
    作为SAP培训合作伙伴,UBase努力让更多的人了解SAP咨询顾问和就业环境,帮助有识之士进行职
    业规划,通过培训进入SAP行业。在本次“SAP职业生涯咨询会”上,经验丰富的UBase和SAP负责
    人将与您进行交流,将与您分享SAP顾问学院和最新的SAP认证考试体系、SAP咨询顾问发展前景和
    如何通过UBase进入SAP领域,以及分享SAP职业生涯日活动的情况和面试技巧,并现场解答您的各
    种疑问,直指在您职业规划和面试中的问题和弊病,指导您在SAP行业中走的更加顺利。
    本次活动为了照顾到更多城市的朋友,特别在深圳、北京、上海的现场活动结束后,举办在线咨
    询,让更多的朋友能够参与。
    时间和地点:
    2007年8月18日9:00-11:30 深圳,大庆大厦九层
    2007年8月25日9:00-11:30 北京,海淀科技大厦
    2007年8月26日9:00-11:30 上海,扬子饭店
    2007年9月1日9:00-11:30 面向其他城市,在线咨询,www.ubase.cn

    日程表:
    8:30-9:00 签到
    9:00-9:30 SAP顾问学院和新的SAP认证考试体系
    9:30-10:00 SAP咨询顾问发展前景和如何通过UBase进入SAP领域
    10:00-10:10 休息
    10:10-10:30 如何通过UBase人才服务在SAP行业找工作(包含SAP职业生涯日情况和面试技巧)
    10:30-11:30 问答

    我们正在寻找从事财务、人力资源、物流、商业智能等领域的专业人士投身SAP咨询顾问这个崇高
    的行业。我们同样欢迎具有IT、ERP和商业智能背景的人士踊跃报名。
    成为一名SAP顾问,获得更好的职位、更高的收入、更多的发展机会!在SAP的世界里开始你的职
    业生涯!
    相关链接:
    注册参加本次“SAP职业生涯咨询会”,http://www.ubase.cn/200708career/register.htm
    UBase人才服务,http://www.ubase.cn/hr-login.html
    SAP职业生涯日(2007Q3),http://www.sapcareerday.com/2007q3cn/
    posted @ 2007-08-27 20:10 CharlieShen| 编辑 收藏

    [post] 

    SAP NetWeaver 主数据管理(MDM)解决方案路演


    2007年8月30日,下午13:00-17:00
    北京,国贸饭店

    2007年8月31日,下午13:00-17:00
    上海,锦沧文华大酒店

    即刻注册,与SAP专家直面交流!
    了解 SAP NetWeaver 主数据管理(MDM)解决方案,如何帮助您在整个企业范围内和贸易合作伙伴一同整合、同步、分配、集中管理或发布任一类型的主数据对象,提供一个涵盖所有战略数据的中央视图,有效改善您的业务流程,大副降低整体成本。

       [/post]
    posted @ 2007-08-27 20:08 CharlieShen| 编辑 收藏

    可惜没人组团一块报名
    posted @ 2007-08-27 19:53 CharlieShen| 编辑 收藏

    诚邀您参加2007年8月28日SAP All-in-One在线视频讲座

    诚邀您参加8月31日SAP ERP在线视频讲座

    posted @ 2007-08-27 19:52 CharlieShen| 编辑 收藏

    我们有许多方法可以实现面向服务的架构,无论最终目标是消除大型机还是简单地重用软件资产。匹兹堡大学医疗中心 (UPMC)和Starwood Hotels & Resorts Worldwide公司都有正在进行中的SOA项目,这无疑表明了SOA实施过程的多样性。对于这两种不同方向的工作,他们在本质上都是要建立集中的用于存储和编制软件资产的仓库。

      对于匹兹堡大学医疗中心(UPMC)而言,一个目标就是在组织内部充分利用单个SOA 开发项目的价值,这同时也涉及到了管理问题。“我们已经做了很有价值的工作,但是在其他的领域却不能被普遍使用的。”UPMC企业中间件小组的主任 Duane Falk说。“我们朝着SOA的方向发展不仅仅是为了使用它的一些技术来帮助我们解决问题,我们也在努力朝着使资源重用性更高的方向发展。”

      Falk 说我们选出了一些高级开发人员和架构师来讨论开始的最佳地点。“普遍的意见是把某些资产聚集在一起放进图书馆,在那里人们可以识别、存储、读取这些可以重用的代码和其他资源。”他说。

      匹兹堡大学医疗中心(UPMC)正在使用匹兹堡市LogicLibrary公司提供的Logidex原数据仓库来小规模的实验一个项目。Falk 说一个研发小组正与一个海外开发人员联合重构程序来管理医疗器械资产。

      “我们已经感觉到这样做是有优势的:确保在最后阶段我们把全部的代码和对象放在保存完好的中心位置,虽然开发中我们只用到了其中的一部分,但是放在这里我们以后可以继续重用。”

      这个项目组使用Logidex来对系统设计、架构还有开发的其他服务进行分类。“其他小组,如企业中间件组,他们在写用于不同领域的Web服务和核心组件的代码,而且我们希望把那些代码也放到仓库中来。”Falk说。这个仓库也可能会帮助UMPC管理一致性问题,如Sarbanes-Oxley Act。

      “我们这个小实验的一个主要目的就是:我们所有的开发人员都能够应用  LogicLibrary,不仅仅是我们的项目可以访问,而且要做到其他组同样可以访问。即使他们只有一个或者两个服务,但是他们可以获得文档记录和发表方面的经验,并且这样做将会帮助我们决定是否继续朝着SOA的方向前进。”

      记录和管理服务在Starwood Hotels & Resorts Worldwide公司也是中心论题,这里正在进行的SOA项目的目标是最大限度的消除大型机。

      Starwood公司是通过一系列的合并和收购建立的,其中最大的是Sheraton子公司。

      “那个时候,管理层做出决定:继续保留Sheraton系统并且作为主要的预订系统。我们终止了基于IBM技术、客户端控制系统(CICS)以及Cobol应用程序的大型机遗留系统,” srael del Rio说,Starwood公司的技术方案和架构高级副总裁。

      大约三年以前,Starwood公司决定朝着SOA的方向发展,并且对LinuxJ2EE和IBM WebSphere实现标准化。他说。“最开始的时候,我们通过在这些平台上开发新的应用程序,之后逐渐开始卸载一些大型机应用程序放到开放系统上来。这时我们也开始发展一些XML服务,但那并不是我们现在所见到的Web服务,”他说。

      Del Rio说:一年半之前,Starwood 公司为消除大型机给出了致命一击。“一切都围绕着SOA的概念,”他说。并且没有移植的应用程序,他补充道。“所有的一切都是通过服务从零开始编写代码、进行设计。那是巨大的工作任务。”

      为了管理不同的小组开发的服务,Starwood公司使用Systinet公司提供的Systinet注册信息表,这个公司位于麻省的伯灵顿。 “我们在注册信息表中(Registry)定义了80%到90%的服务。我们将结束数以百计的服务,” del Rio说。Starwood公司目前使用Systinet来进行支配和策略管理,同时使用Actional 公司的Looking Glass产品用于服务管理,Actional 公司位于加州的Mountain View市。

      现在,服务都必须和内部系统绑定在一起,del Rio说,因此Starwood公司不再使用Systinet公司统一描述、发现和集成(UDDI)的功能。“但是知道他们公司有这个功能还是很好的。我们已经打算把一些服务做成公共服务。”

      2006年的第一季度,Starwood公司将开始在新系统上实现一些独立属性,然后做集成测试。“我们研究的范围是建立在能够消除大型机的基础之上,”他说。这就是到2006年底实现的目标。

      对于Starwood公司,SOA的道路是正确的,但是del Rio说这条路又是充满艰险的。“SOA是一个好的概念。我们应该朝着SOA的方向发展,尽管实现的过程是艰辛的。这就是成熟的历程。”

    posted @ 2007-08-27 13:45 CharlieShen| 编辑 收藏

      在这篇文章里,我们略过SOA的一些基础性介绍,主要关注SOA的应用场景。

      SOA有哪些基本原则? 

      了解SOA是为了解决什么样的问题,我们先来了解一下SOA有哪些基本原则。

      粗粒度

      在SOA中服务粒度有两种相关的意思,即服务是如何实现的,服务使用和返回了多少数据或多少消息。细粒度服务执行了最小的功能,发送和接收少量的数据。粗粒度服务执行了较大的业务功能,并交换了更多的数据。

      原则:细粒度服务是供粗粒度服务或组合服务使用的,而不是由终端应用直接使用的。如果应用是使用细粒度服务建立的,则应用将不得不调用网络上多个服务,并且发生在每个服务上的数据量较少,因而会对对系统整体性带来影响。所以,粗粒度服务的用户不能直接调用他所使用的细粒度服务。同时,由于粗粒度服务可能使用多个细粒度服务,因此它们不能提供粒度级的安全和访问控制。

      松散耦合

      松耦合的系统特点是灵活,而应用到SOA中的目的就是将服务使用者和服务提供者在服务实现和客户如何使用服务方面隔离开来。服务提供者和服务使用者间松散耦合背后的关键点是服务接口作为与服务实现分离的实体而存在。这是服务实现能够在完全不影响服务使用者的情况下进行修改。

      大多数松散耦合方法都依靠基于服务接口的消息。基于消息的接口能够兼容多种传输方式(如HTTP、JMS、TCP/IP、MOM等)。基于消息的接口可以采用同步和异步协议实现。

      可重用部件/服务

      如果完全按照可重用的原则设计服务,SOA将可以使应用变得更为灵活。可重用服务采用通用格式提供重要的业务功能,为开发人员节约了大量时间。

      设计可重用服务应该是与数据库设计或通用数据建模类似的最有价值的工作。

      基于标准

      Web Service是目前实现SOA应用的一项基本的,适用的技术,它为服务的访问提供了一个被广泛接受的开放标准。

      JBI(JSR208)是SUN推出的基于Java的SOA标准,随着在JSR 208中被定义,它也成为了把服务容器组装为合成应用的标准。

      Service Component Architecture (SCA)和Service Data Objects (SDOs)标准是IBM和BEA所推出的SOA标准,并在Apache Group建立了Apache Tuscany项目。

      在我看来,标准之争并不是关键所在,但就JBI和SCA/SDO标准而言,JBI的应用范围更严格,可能最终会成为更大的标准中的一部分Java实现。

      SOA面临什么样的问题?

      繁杂的应用和协议
      频繁变化的服务需求
      管理
      监控
      网络瓶颈
      标准的缺失
      困难的跨团队变更管理
      这些问题都比较好理解,也不是只有采用SOA才能解决问题的。但是作为典型的SOA应用,以上的情况都是必须面对的,也是SOA系统函待解决的。

      SOA的应用场景是怎样的?

      适用场景
      集成成本持续增长,而并未因为可提供真正投资回报 (ROI) 的新业务机会而得到缓解。
      兼并和收购是企业扩大市场份额和获得新发展机会的业务模式的核心。
      解决方案要求对来自异构系统和编程模型的业务功能进行集成。
      业务的生存依赖于根据市场变化快速调整或即时响应竞争威胁的能力。
      全球经济的影响要求企业事半功倍地开展业务,而且有必要依赖业务合作伙伴提供非核心业务功能。
      就提高收益而言,与业务合作伙伴协作的效率对企业十分关键。
      企业业务资产的价值在减少,因为不能对其进行评估,以在最初用途之外的其他地方使用。
      企业员工的效率出现了问题,因为他们的大部分时间并没有花在提供公司业务模型的核心功能和服务上。
      企业的业务充满了机会型的业务工作。
      企业从头开始开发新应用程序。(SOA应当作为定位将来的新应用程序的缺省架构模式,当然,业务条件有其他限制时除外。)

      不适用场景

      企业只将小部分 IT 预算用于集成项目。
      企业的大部分流程都是手动的或以文档为中心的,自动化的机会几乎为零。
      企业的大部分应用程序开发都使用相同的编程模型。
      企业的操作由一个或两个客户关系管理 (CRM) 和企业资源规划 (ERP) 应用程序管理,几乎没有集成要求。
      企业的现有技能库与实现支持 SOA 的基础结构所需的技能库之间存在重大差异。
      未发现可从 SOA 提供的功能受益的业务需求或机会。
      新业务服务的可用性将对现有的收益流带来负面影响。
      企业依赖的业务合作伙伴对公司间流程的自动化采用了不同的优先级。
      企业的主要业务的开展涉及到海量且同步性和实时性要求非常高的事务。

    posted @ 2007-08-27 13:44 CharlieShen| 编辑 收藏

      来自微软的DeVadoss在访谈中指出SOA并不仅仅只是一种IT技术,人们思考SOA,思考服务。有意义的服务应该拥有数据。而对数据在互联系统中的影响,人们还缺乏了解

      在所有Web服务标准中,我听说最让人沮丧的是WS-Policy的难产。它会影响2006年的标准体吗?它的领导者微软和IBM能够让它出台吗?

      John DeVadoss: 我希望在标准组织中看到它,但是有很多变数所以很难预期。因此,我还是希望它能有好运。我的看法是策略是委员会还没有达成一致看法的抽象层。我想这会花费我们一段时间。如果你看看协议栈的低一些的层,它只花了不长时间就达成了一致。策略转移到了更高的层次。所以,不匆忙完成什么或许是对的,这样可以不必在以后返工。我希望我们一起很好的完成这项工作。

      Web服务是否大体上提高了创建SOA的开放基础设施的难度?

      DeVadoss: 对此我没有什么特别要说的,但如果我是一名架构师,我会相信简单性和一致性,以及能够使用你需要的东西。一些关注是在乎其广泛的范畴。但不要关注你需要的是什么以及什么会给你价值,也不要指望你会使用所有的特性和所有这些说明书。

      你觉得在明年微软会有任何开源的机会吗?

      DeVadoss: 广义的开源包含很多领域。有开发模型、有哲学思想、有侦听模式,还有商业模型。首先,我认为开源是围绕社区思想的一种开发模型。如果你看看我们VS.NET 2003的工作,你会看到我们已经从社区中学习深度合作的好处。甚至社区技术的概念与我们社区外的一些概念相同,于是我们也给他们一些反馈,我们正在好好利用这些做法。

      我也会负责一个Shared Source Initiative项目,用以显示我们对开源社区的兴趣以及回应。

      你对Service Component Architecture的看法是什么?

      DeVadoss: 我把SCA看作是对J2EE重量级性质的一种回应和一种容器模型。我也把它看作类似Spring的一种轻量级模型。当然,如果你回来看看我们的容器模型,会发现该容器模型的轻量级性质是我们很久之前所做的事情。我认为从概念级的观点来看,SCA不仅是从J2EE和复杂性中走出的一个社区,它还会更加融入我们对世界的看法。

      基于XML的部署的关键是降低复杂性吗?

      DeVadoss: 我信奉松藕合。我也相信简单性。我认为XML给予我们的是连接和通信的能力,而这是面向服务的关键。尽管服务是抽象的东西,我们依然谈论它,但我想我们都赞同面向服务的成功主要要应该归功于XML和SOAP这类东西,所以我当然会赞同这样的观点。

      你认为,有特殊的工具来驱动更多的用户使用松藕合的结构吗?

      DeVadoss: 我认为关键是应用模型。此外,不要使用UML这样的单语言模型,而是使用特定领域的模型,包括开发人员的模型、明确业务需求的架构师的模型、用于映射和设计操作基础设施的架构师的模型。我相信,这会成为我们真正实现从业务需求映射到操作的必由之路。还会发生其它的事情,但在我看来,那些都没有它有趣和重要。

      关于SOA对很多用户的用途,我们谈到了点子上吗?

      DeVadoss: 我想是的。确实有在面向服务上取得出色成功的客户。但是,成功的都是那些重视商业价值的客户。我看到的在面向服务中遇到困难的客户是那些把IT放在首位或者把架构放在首位的。我在微软领导架构团队,但我第一个告诉你架构不是终极目标。客户不想要SOA,他们要的是商业价值。对于面向服务创造商业价值,它必须发掘新的商业机会才行。更灵活,这才是价值。当客户告诉我他们有SOA的成熟度模型时,我觉得很难办,因为目标不是你的架构有多么复杂多么成熟多么优雅,而是你创造了什么商业价值。

      你认为在2006年中会发生的很多人现在还没预计到的事情是什么?

      DeVadoss: 一件事是面向服务的概念会深入人心。我想这是我们要承认的事情。我希望人们从SOA是终极目标的想法中走出来,但对我而言,更重要的事情是服务消费的观点要提升到更高的档次。我想这就是2006年会发生的事情。

      对你来说,SOA中XML硬件的重要性是什么?

      DeVadoss: 我相信有XML硬件的一席之地。如果你记得90年代末的.com岁月,在那些Web推动者中就有着这种热情,那时人们都在谈论如何应用硬件,其本质就是对事务的处理。我认为它不是高层次的事情。我觉得软件才是更高层次的事。

      采用者需要避免的SOA缺陷是什么?

      DeVadoss: 人们思考SOA,思考服务。有意义的服务应该拥有数据。而对数据在互联系统中的影响,人们还缺乏了解。我希望他们对服务背后的数据多多思考。其次,我想说的是分解的服务对成功非常关键。在我曾经和一个ISV交谈时,他们已经有集成的系统并把它重新设计成面向服务的。他们有19个服务,而在中间层,他们把所有的请求混合在一起或者用于每个业务交易的服务中,结果中间层处理所有的编组和数据混合。实际上,他们的系统非常缺乏可管理性、可用性。我希望架构师和开发人员好好思考服务分解。一个服务并不是一个业务对象。也不是一个业务组件。一个服务是一个拥有数据的更大的抽象概念。

    posted @ 2007-08-27 13:43 CharlieShen| 编辑 收藏

      在全球范围内,服务导向架构(SOA)正成为未来企业软件架构的趋势。《信息周刊》和埃森哲公司通过对中国上千家企业机构的问卷调查,了解在商业科技推动企业竞争力及商业创新的背景下,中国企业部署SOA的现状和未来的趋势。在对所有参与调查企业的数据进行分析的基础上,我们根据参与调研企业的规模,将调研数据分为两部分,即大中型企业(雇员人数在500人以上且年营业收入在5000万人民币以上)和小型企业(雇员人数小于500人或年营业收入小于5000万人民币),分别针对这两类企业进行了分析。

      基于调研数据分析,我们发现:
     
      基础应用
     
      被调查企业中,拥有SOA应用的企业占8.8%,在大中型企业中,这个比例是10%。四分之三的被调查企业未对SOA采取任何行动。然而在较早开始SOA部署的企业中,60%的大中型企业和超过一半的小型企业都表示他们将增加在SOA上的投入。数据表明尽管SOA在中国尚处于应用启蒙阶段,但企业在SOA上的投入却在快速增加。

      91.2%的被调查小企业与76.9%的大中型企业缺乏有效的应用系统管理制度,所有被调查企业中,仅有15.5%企业拥有比较完善的应用管理制度。

      在已经或计划部署SOA的企业中,四分之一已经开始有限部署EDI、XML、Ws*、SOAP、UDDI、BPEL、BPMN等SOA基础技术,但主要集中在大中型企业。
      
      SOA部署
     
      在了解SOA的被调查企业中, 有80.9%的企业表示将采取积极态度部署SOA。

      已经或计划部署SOA的被调查企业,既包括大中型企业也涉及规模较小的企业,这反映出是否部署SOA与企业规模的联系不大,同时也表明通过部署SOA,小企业可以缩小和大型企业之间的差距。

      商业智能(8.1%)、客户关系管理(7.6%)、供应链管理(7.4%)等系统是基于SOA开发新应用的优先选择。以上数据都表明SOA的部署主要集中在渠道管理,特别是客户管理。
      
      预算和投资回报
     
      在已经或计划部署SOA的被调查企业中,三分之二的被调查企业的SOA预算在100万元RMB以下。数据表示较早开始SOA部署的这些企业已经意识到部署SOA并不是简单的购买产品,而是通过一定的投入进行组织的深刻变革以获得最大的利益。54.3%的企业的SOA预算在50万元RMB以下,这些投入较小的企业主要集中在基于SOA的测试项目。

      对于部署SOA不能达到预期的原因,调查的反馈显示了企业对此的不同看法。56.3%的被调查企业认为,技术/产品不成熟是导致SOA应用达不到预期的主要因素。而同时大多数企业并不认为技术问题是部署SOA的最大障碍,业务流程没有完全准备好才是关键。这种认识上的差异可能与不同企业扮演的角色不同有关。

      在对SOA感兴趣的被调查企业中,73.7%的企业计划在未来两年内部署SOA。数据证明企业已经意识到开始部署SOA的必要性,同时可以预计未来1-2年,SOA在中国将进入快速发展期。
      
      价值和障碍
     
      88.8%的被调查企业优先认可SOA的商业价值。参与调查的大中型企业中,分别有43.1%和44.6%期望通过部署SOA促进企业的业务发展及流程优化。只有12.3%的大中型企业认为SOA的价值主要是技术创新。以上数据表明部署SOA是一项业务驱动的组织变革,而不是技术驱动成本削减。

      整合现有应用系统(40.6%)以及整合业务流程(38.2%)是企业部署SOA的首要驱动因素。小企业对商业创新比较关注,15.8%的小企业认为,部署SOA是建立新的业务能力的基础。同时,38%的大中型企业也表示,建立新的业务能力是企业部署SOA在未来最重要的驱动因素。调查显示90%可以支持现有业务需求的应用无法满足企业未来的业务发展,这对于未来的变化是一个巨大的推动力量,而SOA,由于其能有效加强现有应用的能力,被视为在这方面投入的优先选择。

      中国企业部署SOA的主要困难除了在于流程再造的准备不充分(42%)以及无法明确SOA的商业价值(41.9%),44%的大中型企业还强调了与管理层沟通的困难。
     
      策略
     
      在SOA实施的不同着手点中,28.7%的被调查企业选择测试单个SOA应用、33.8%选择基于SOA的系统及信息集成、19.3%选择基于SOA的部门内部自动化、13.4%选择跨部门的SOA应用、4.8%选择基于SOA的合作伙伴产业链。对于如何部署SOA的分歧意见显示SOA的部署并没有统一的方法,有些企业可能通过业务流程的驱动来实现,而另一些企业则可能通过对技术的集中变革实现。因此,一张清晰的,为企业量身订制的SOA部署路

    posted @ 2007-08-27 13:42 CharlieShen| 编辑 收藏

    两端对齐

           对于我们这些晚辈可能对很多最新的技术知道的不是很多,比如SOA,我最近才对它感冒,虽然大家都说可能世界上还没有一个人真正清楚什么是SOA,但是关于SOA的评论早已铺天盖地。以下是对各种观点的总结:

          1、SOA 很难,很重要——Jason Weisser:在这个SOA 框架的支持下,软件系统的开发是从业务流程分析开始的,使用组件化业务建模的方法识别和分析各种业务模型,并将各种最佳实践融入其中,在这个基础上我们建立一组用例,用例直接产生BPEL,这些BPEL则可以被融入一个服务整合框架中。在这个框架中有可能有一至几条企业服务总线(ESB),所有的服务都通过ESB提供,甚至包括一些管理协议,也通过XML格式的消息在这条ESB上传输。遗留的数据库、CRM、各种既有系统等等都连接在ESB 上。而在这个框架里有一个用WSDL 编写的metadata库,这个metadata库描述了关于各种服务的信息,从而把ESB上的各个模块统一起来,形成一个巨大的服务仓库(s e r v i c e repository),所有与业务流程直接相关的服务都可以在这个服务仓库中找到。所有的服务都是100% 可复用的。

      企业希望复用的是业务,这一点构件化的方法做不到。一旦SOA成为主流,那么就意味着你用传统方法作出来的系统,一落地就是“遗留系统”。而如果你们大胆地迈向SOA,直接进入SOA时代,整个情况就反过来了,你们将领先世界!

      2、SOA 企业应用昨日重现:其实SOA在技术上解决企业应用集成(EAI)问题的标准化的时候,背后更深层次的原因在于当前的业务管理与流程需要融合,以应对快速变化的市场,降低业务实现的成本。

            要搞清楚应用的建设分为开发和集成,开发比集成更在应用内部、更紧耦合、效率更高;而集成则比开发更在应用之间、更灵活、效率更低。在现实之中,开发与集成并不可分,可能有所偏重,他们需要的是不同的技术。

        3、SOA:思想与技术的统一:SOAP/Web Service的流行实际上是基于消息传递的分布式计算模式的复兴。  

            这种新的模式,将会构成对当今主流的以Application Server 为核心的系统架构的一种挑战,促进系统从基于多层次的,服务端紧耦合的模式,向网状的、均衡分布功能的计算模式演变。

           SOA是新一代的分布式计算体系结构,它通过以数据描述和传输协议为核心的标准技术体系,将基于组件/RPC和基于消息传递的分布式计算模式统一成为基于服务的计算模式,并在此基础上从服务提供者和使用者的角度对分布式计算节点的功能进行了重新划分。

      4、SOA 就在身边:无论是早期带有SOA部分特征的传统软件,还是完全基于SOA研发的新一代软件,都在试图解决的问题主要是:快速构建与应用集成。

             SOA将带来程序员一种全新的思想,也是现在大部分程序员未知的领域,如果消极等待甚至对抗,只会使程序员被新的SOA时代所抛弃;如果积极地去学习,以正确的心态面对,SOA不过是一种在原有软件架构上的延续,了解这一思想并予以采用,比掌握一种开发语言来得更容易。

            5、我的一些认识:网上盛行的这些关于SOA的评论不同主要是因为他们处于不同的角色和不同的观察角度,其实SOA本身是一种架构模式,而架构单纯从某些角度是无法说清楚的。事实上,SOA就是那么一种指导思想,它在不断地发生变化,也在不断地成熟。它是一种分析问题,解决问题的策略(不是战术)。它比OO处于更高的层次上。

          

    posted @ 2007-08-27 13:41 CharlieShen| 编辑 收藏

    SOA领域动荡变化的时期,其发展变幻莫测,而这仅仅只是开始。由于服务设计、服务总线、服务治理甚至服务本身都处于不断变化中,而且各大公司仍在重审这一舞台,因此,人们的立场通常很复杂。对于IT产业中SOA的成熟度和整体状态,许多人还非常迷惑,但是,可以确定的是,SOA在结合商业和技术方面的潜力的确非凡。

      今年,发布了许多SOA的新方案,每一个方案都有其特定的一套目标和期望。很可惜,其中一些方案与成功相距甚远,一些方案距成功仅仅是一步之遥。但是,对于大多数方案而言,它们都实现了最初的目标,其成功的决定因素是——借鉴那些经历过失败项目的人们的宝贵经验。这些前辈讲述他们的经验教训,告诉人们在通往SOA道路上所要警惕的重重障碍。

      在我们的日常工作中,我们被卷入进度不同、状态不同的多个项目中。而现在,我们已经看到,很好的SOA变得越来越差,甚至更糟。虽然,问题能够被解决,错误能够被避免,但是,总是有一种强大的力量把事情拖回到原来的轨道上。很明显,最佳做法就是:第一时间避免问题和错误。

      在SOA的使用中存在着隐患,很多人已经被这些错误的概念或者做法误导,那么,理解这些隐患,能够帮助你达到深谋远虑的程度,从而使你在SOA的道路上更加安全的前行。为了使你有一个好的开端,我们已经收集了五种最为常见的、SOA使用中的隐患。

      ☆5 没有理解SOA的性能需求

      松散耦合是需要代价的。当使用Web服务实现松散耦合时,SOA引入了数据处理层,同时也带来了由这些层所影响到的上层的相关性能。当SOA项目刚开始时,规模较小,因此,构建符合功能和响应要求的、面向服务的解决方案并不复杂。但是,随着规模的增加,需要添加更多的功能,由此可以预见到,基于信息的通讯量将会大幅度增长。如果事先没有考虑这一情况,没有准备好构建环境的话,那么,就需要对前一阶段所做的小规模系统进行必要的遗留处理。

      要构建一个成功的面向服务的解决方案,其关键是:尽快理解你的解决方案的性能需求、以及基础架构的性能瓶颈。这意味着测试(如果需要的话,增强)你的构建环境的消息处理能力,并且密切关注服务设计,从而达到传输率、传输规模以及与其他服务特性之间的一个可接受的平衡点——这一平衡点会影响解决方案的性能。

      ☆4 没有从XML基础架构开始

      在今天的SOA世界中,每件事情都开始于Web服务。这似乎已经成为公司内部的既成标准,但是它并不完全正确。事实上,在今天的SOA世界中,所有的事情都开始于XML。这才是真正的标准,依据这一标准,许多补充的标准都已经逐渐发展起来,并且形成了实际的数据表示架构。这一标准的核心,奠定了许多Web服务规则的形成基础,并且促进着SOA的发展。

      因此,人们更多地关注于数据在服务之间是如何传输的,而经常忽略在服务背后,数据构造和验证的方式。这一疏忽可能导致无法合理实现SOA的持久化XML数据表示层。对于SOA而言,这一层是基础,如果它存在着弱点,那么,所有基于这一层的解决方案都会受到不利影响。

      ☆3 没有创建一个过渡计划

      如果没有使用一个详尽的过渡计划,那么,成功迁移的机会将会降低很多。因为,在一个企业内部,服务终端所处位置的范围将导致环境基础架构的重新确定,一次差强人意的迁移有可能带来重大影响。使用过渡计划,你就能够控制面向服务和SOA特性,并且进行相应的协调,如此一来,迁移就能够在技术、架构以及组织层面上,按照计划进行。

      对于一个SOA过渡计划而言,其典型的组件包括:一个具有重大影响的分析结果(预测SOA的改变程度将如何影响已有资源处理、用户标准和技术)、过渡架构(目标是SOA,勾画出一系列通向这一目标的中间过渡状态)以及推测分析(考虑Web服务和支持技术的未来发展)。

      ☆2 没有标准化SOA

      与其他的架构相同,SOA也需要创建并且执行内部设计标准,以便能够使人们真正地认识到它的优势。举例说明,如果一个项目采用构建面向服务的解决方案,与其他项目不同,那么,该项目的解决方案的关键点将不再是与相关的应用程序保持一致,它可能是需要互操作或者分享某些不可预知的服务。

      这可能引发很多问题,包括不匹配的数据表示、含有不规则接口特性和语义的服务契约,以及使用非互补的Web服务扩展(或者是用不同方式实现的扩展)。

      SOA的出现,促进了分离后端处理这一开发环境的发展,因此,在每个应用程序内部,SOA都能够独立执行。然而,标准化仍然要求——服务需要封装这一后端逻辑,并且在设计和交互上确保一致性。

      ☆1 将SOA构建成传统分布式架构

      在实现SOA的过程中,企业一直面对的诱惑是:自称SOA已经实现了,但是在构建面向服务的解决方案时,采用与构建传统分布式解决方案相同的构建方式。

      SOA既不是CORBA + XML,也不是 ASP.NET + WSE。同样,面向服务既不是面向对象,也不是“足够接近”面向对象。虽然,通常情况下,构建面向对象组建逻辑总是“非常适合”于面向服务解决方案的环境。但是,SOA是基于面向服务的、与众不同的架构模型,以及截然不同的设计模式。对于构建自动化逻辑——纯粹的面向服务,与SOA产业向全球规模发展保持一致——理解上述这些不同之处,是非常关键的。

    posted @ 2007-08-27 13:40 CharlieShen| 编辑 收藏

    从商业系统起家的SAP,将从众竞争者最弱的一块来争取企业客户的青睐:应用。

      相较于IBM、BEA与微软大谈如何在中介软件基础架构上开发软件组件,以便建构服务导向架构(service- oriented architecture, SOA)的环境,企业资源规划(Enterprise Resources Management, ERP)巨人SAP则认为更节省成本的方法是直接提供软件服务。

      和中介软件厂商叫你自己开发(软件服务)不同,我们已经帮你做好大半,SAP亚太区技术长Simon Dale指出。这样可以帮助企业省下许多建置成本和工夫。

      这也是SAP与其它IT软件大厂切入SOA市场的策略不同处。BEA、IBM及微软,都拥有强大的中介软件及基础架构,同时强调简易、弹性、可协作的开发工具提供企业在软件平台上自行开发程序组件。另一方面,从应用层来实践SOA的则只有甲骨文及SAP; 两家商用软件大厂自数年前一改旧式大型软件的架构,朝向组件化、模块化的软件服务组成的松散耦合(loosely coupled)系统。

      其中,甲骨文原已有中介软件及ERP、CRM等应用系统,而ERP应用出身的SAP更是于2005年推出基础架构软件NetWeaver。

      在这种系统上,企业可以在必要时订阅特定或原已存在的服务,如银行推出线上刷信用卡,则订阅身分认证及支付两种服务,并把数据更新到客户关系管理系统。则银行就不用重新开发,可以节省成本及加速服务上线时间。

      SAP业务发展协理陈平佳强调,SOA不只是技术的玩意,而必须和商业行为结合。应用层上的服务组件及商业流程才是重点,他说。

      在SAP的ESOA(Enterprise SOA)愿景下,企业以NetWeaver为基础的ERP软件配合SAP提供的软件组件,可以满足企业80%的需求。相较之下,没有导入应用,而只有中介软件的企业,则必须自行开发所有的组件,Dale表示。

      SAP自2005年起,改变旗舰级软件以版本别命名方式,统一为SAP ERP 6.0,将沿用到2010年下一重大改版。期间并免费推出Enhancement Package的方式,不断增加新的服务组件。从2006年第四季,以一年二季的速度释出。到目前为止已推出一个,包括人力资源及电子发票等模块,未来五年将在推出五个,Dale表示。

      随着组件的增加,未来我们可帮助企业节省85%、甚至90%的投资。他说。

      而个别企业的特殊需求,则仰赖经过SAP认证的第三方软件公司推出的服务来补充。SAP自2005年大举招募ISV,目前全球有约600家取得认证,亚太区则有140家,SAP指出。

      甲骨文也是循同样策略。在并购Siebel、PeopleSoft、J.D.Edwards及垂直产业的软件后,甲骨文也进行软件的重新改造,企业可在预定2008年推出的Fusion软件平台上使用软件服务。

      目前SAP相较于竞争者,最大的问题或许在于客户的认识仅及于其ERP的品牌,并不熟悉NetWeaver及其新的营运模式。不过陈平佳表示,目前国内新导入SAP ERP系统均已包含NetWeaver,像是乔山科技,而也有国巨等导入NetWeaver,使用其中的模式作为应用整合或商业智能(Business Intelligence, BI)项目。

      同时,SAP更自豪于产品已经上市。别人说哪一年预定推出并不重要,重要的是我们已经推出了,而且有人用了,Dale说。
    posted @ 2007-08-27 13:39 CharlieShen| 编辑 收藏

    各位媒体界的朋友们大家早上好,再次向大家问好。非常感谢大家今天有空到现场来参加我们的技术研发者大会。我花一点时间给大家做个开场介绍,然后把时间留给大家提问题。希望我们利用这个时间做一个很好的互动。
     
    在座的各位媒体朋友有的已经跟踪报道我们很久了,有的是新参与报道SAP的。我为大家先简单的介绍一下SAP NetWeaver和企业级的面向服务的架构(Enterprise SOA)。
     
    NetWeaver是SAP的产品,它本身是SAP现在的企业应用软件的底层技术平台,即SAP所有新的应用跑在一个相当于在系统之上的、类似于中间件的支持平台。 SAP在2004年正式推出NetWeaver这个产品。 在此之后SAP所有的新的产品都是跑在NetWeaver这个平台之上的, 这个平台也可单独采购。
    NetWeaver为SAP所有的企业应用提供了一个公共的、基础的平台,包括提供了Web应用服务器的支持、数据的存取和各种系统之间的功能等。NetWeaver还提供了许多企业级功能,包括了在人员方面、信息方面、流程方面提供集成服务,这是由很多诸如交换架构XI、主数据管理MDM等组件组成的。 NetWeaver把企业应用最常用的IT需求都定制化成产品,提供相关的功能。NetWeaver还提供了各种相应的基于Java和ABAP的开放的软件开发环境和工具。
    这就是SAP NetWeaver这个产品,是目前支持所有SAP应用的基础产品,是最好的企业应用软件的开发平台、同时又为企业搭建一个基于NetWeaver的面向服务的IT架构。
     
    企业级的面向服务的架构(Enterprise SOA),又可简称作企业服务架构。 大家在主题演讲中已经听过介绍,我想再通过比较的方式讲一讲我们的Enterprise SOA是什么,和其他厂商谈的SOA区别在哪里。
    SOA这个概念大家听的比较熟了,是面向服务的架构,实际上它的背景是基于最新的互联网的技术,把各种应用都做成Web Service,做成网上服务。 这些服务可以分散在互联网的不同地方,调动这些服务来实现IT的功能。 SOA这个概念虽然推出一段时间了,不过其他厂商通常谈的是IT底层基础架构,是一个网络的技术名词。
    SAP企业服务架构增加了丰富的、实质性的内容。SAP把我们从1972年开始34年在企业应用方面的全部积累和丰富的业务知识,做成企业服务(Enterprise Service),成为企业服务架构的基础。 基于但不止于SOA, SAP在企业应用这个环境, 以NetWeaver为基础,加上企业服务库,加上复合应用组合成业务流程平台(Business Process Platform), 成为第一家和唯一一家实现了企业服务架构的软件供应商。SAP使SOA从理念性、技术性的东西变成在企业层面、在现实IT中确实被使用的东西。 它的背后体现在SAP将近上万名工程技术人员花了两三年的时间,把我们的在各个行业都占据领先地位的ERP、CRM、SRM等企业应用都在这企业服务架构基础上重新改写。与之相比,我们的竞争对手虽然随后也匆忙提出了类似的规划,但其实施和退出还需要约二年的时间。
    企业服务架构的推出在业界产生了广泛深远的影响,特别是在比较发达国家IT业形成一股旋风,大家对此刮目相看。分析家评论说据此企业应用将进入一个新的发展时期,企业服务架构将成为下一阶段主要软件公司竞争的焦点,谁要是在这上面占据领先地位就有可能成为下一代软件业的霸主。所以我才戏说用三国来形容SOA是软件业竞争的荆州。这是关于企业服务架构Enterprise SOA的概念。
    企业服务架构的意义是非常重要的。 现在我们把它推出来,一方面是SAP用它来搭建我们自己的软件,一方面是要建立一个生态圈,客户可以在这之上,在同一个平台上共享很多组件,灵活地搭建企业应用,独立软件开发商可以成为SAP的合作伙伴,也做同样的事情。这样可以形成非常高效、非常有活力的生态圈。 这样就解决了企业IT管理上的长期难题,到底是自主开发软件还是买现成的软件。 以前一旦选择朝东走就很难朝西走了, 而现在不需要做一个选择了,鱼和熊掌可以兼得了。现在在同样一个平台上有可能尽量采用各种商业用的软件,又同时为自己开发或者是采用其他独立软件商的软件。从这个意义来讲软件业确实进入了新的时代,这也是我们在今天向中国软件业隆重推介NetWeaver平台,进一步阐述企业服务架构的意义所在。
    我给大家讲一个我的观察。 大概在半年前,当我到国外出差收集一些有关资料时,发现在那个时候可能有几本SOA的书,在阐述在技术底层SOA是怎么回事、Web Service怎么用等等, 但是基本上没有人谈Enterprise SOA。 一个月之前我再去新加坡的书店,突然发现在国外已经有了五本书,它的名字里全都有Enterprise SOA。后来我发现有两本书在中国已经翻译准备出版了。从去年开始我们开始着重讲企业服务架构Enterprise SOA,其后迅速成为业界大家关注的焦点。这五本书里有两本是与SAP有关的人员写的,其他几本并不是SAP的人写的,而是其他软件从业人员看到了企业服务架构带来的冲击写了这些书, 我想很快会有更多的书问世。 我想用这个故事跟大家分享一下企业服务架构的快速发展以及可能带来的影响。
     
    最后我给大家介绍一下SAP产品进展的情况。
    首先按照我们的技术路线图,SAP各个方面的产品都在不断地前进,在过去半年中,我们推出了好几个新产品,我们推出了在线的客户关系管理(CRM On Demand),又和微软合作推出DUET(二重奏)产品。 二重奏是把SAP后台企业应用的数据通过微软的办公环境展现给业务用户,这个产品是今年5月份推出的。
    除此之外,SAP于8月份正式推出了基于企业服务架构复合应用的企业分析软件(xApp Analytics)。 这类软件的功能是把信息交给业务用户,让信息能够直接为企业的经营、运营、决策做支持的软件,传统上属于商务智能(BI)的范畴。但是我们提供的这类复合应用分析软件,它和别的传统商务智能软件不同点在于我们的分析软件是内嵌在业务流程内的,可以直接影响业务流程,不是说事后看一看这些数,而是这些数直接在过程中可以直接影响控制你的业务流程。这些都是相当有意义的发展。
     
    企业应用是软件类非常大的门类,对整个行业有深远的影响。最近SAP已包装了500个高端的企业服务Enterprises Service,如财务服务、人力资源的服务。以后客户可以直接调用这些包装好的服务,客户和其他厂商也可以调用这些服务。刚才我和祥麟在讲,一个非常恰当的比喻是将软件的企业服务架构化类比于电路的集成化。集成块(IC)本身也是功能模块化设计的,但它是更复杂电路的基本组件。集成电路的出现从根本上改变了电子行业。设计一个个的集成块,把他们组成电子设备,而不是再从电阻、电容、电感、晶体管等基本元件来组建电路。以后软件业的工作就是要设计这些“集成块”和利用这些“集成块”,这些“集成块”就是企业服务(Enterprise Service)。 老的软件行业正在合并和兼并中死去,一个基于企业服务架构的新的软件行业正在诞生中。
     
        其他的情况新闻发布稿里都有,下面我和祥麟会非常高兴跟大家进一步交流,欢迎大家提出各种各样的问题。谢谢大家!
     
    posted @ 2007-08-27 13:38 CharlieShen| 编辑 收藏

    【InfoQ中文站报道】SAP正在为最新版的SAP NetWeaver过程集成平台的发布大造声势。产品经理Sindhu Gangadharan宣称SAP NWPI v7.1将于下月面世。该平台设计涵盖了SAP或非SAP用户的所有集成需求。

    SAP是第3家将业务过程平台建构于ESB,或具有ESB相似能力的平台(就SAP的情况而言)之上的主要软件厂商,前两家分别是IBM和Oracle。在与Paul Read的访谈中,Sindhu解释SAP并不打算提供一个单独的ESB产品。NWPI具有ESB提供的许多能力。有趣的
    posted @ 2007-08-27 13:37 CharlieShen| 编辑 收藏

    SOA以其让应用不受限于技术,让企业轻松应对商业服务变化和发展的需要,正成为最受关注的热点话题。然而,目前国内企业用户对SOA的很多价值还没有清晰的认知,而应用上的误区,更是影响SOA的推广应用。那么,如何走出误区,才能构筑一个面向服务的IT架构系统,使企业在未来的竞争取得优势呢?

    SOA的前景喜忧兼有

    在当今的业务环境中,变化是毫无疑问的,因此快速响应客户需求、市场机遇和外部威胁的敏捷性比以往任何时候都更显重要。适应这一新需求的发展,现在的IT系统正在经历着从客户机/服务器时代转向面向服务的架构(SOA)的转变。这一转变将使人们通过服务来沟通,开始各种新的应用,更多面向业务的应用,更快的创新速度。

    SOA的核心思想是让应用不受限于技术,让企业轻松应对商业服务变化和发展的需要,它着眼于日常的业务应用,并将它们划分为单独的业务功能和流程,即所谓的服务。这代表了IT业根本性的变革,已经成为IT市场的焦点和趋势。据Gartner Group预测,到2008年,SOA将成为占有绝对优势的软件工程实践方法,它将很可能结束传统的整体软件体系架构长达40年的统治地位,届时将有70%的企业在进行IT建设时会转向SOA

    正是看到了SOA广阔的市场前景以及发展空间,国际国内的众多厂商包括SAPIBMBEACA等在内的巨头们纷纷杀入了这个市场,或提供技术,或提供产品,或提供完整的解决方案,力图分得这个市场的一杯羹。SOA的概念从1996年被Gartner提出以来,众多主流厂商成为了主要推动者,包括IBMBEASAPOracleBEAIBMOracle的主要产品是以中间件为导向的,而SAP主张以应用层架构建立SOA体系。而最近SAP与Oracle在SOA领域之争更让人津津乐道。

    目前,在国外SOA正在成为企业的IT战略。只是随着2001Web服务的降生它才开始变得具有实用性,正以惊人的速度高速发展。 Forrester研究机构在2004年底的一项调查发现:70%的大公司都采用了SOA19%说公司正把SOA当作"战略性业务改造"手段使用。

    美国Infoworld20053月所做的调查显示,半数以上的企业都在计划部署SOA。而在那些未实施SOA的企业中,有14%的企业把SOA作为其一年内第一优先级的大事,而把SOA作为未来三年内第一优先级的企业则激增至30%

    相形之下,尽管SOA的概念进入中国已有23年的时间,但国内用户至今对SOA的认识仍不清晰,导致SOA市场需求并不明朗,就目前国内的现状来看,对于SOA,更多的企业仍在持观望的态度,仍然有很多的疑虑。据计世资讯调查:为数很少的企业用户表示出对SOA的关注,其中15.9%的流通行业关注SOA,而在制造行业仅有8.6%?

    应用误区——沉重的话题

    SOA从诞生之初,就是为了帮助企业实现更多的信息资产重用,更加方便地管理和更快地开发与部署这些资产。而在国内外的市场环境中,各种业务变化是周而复始的,在这种情况下,企业需要更加快速地响应客户需求、市场机遇和外部威胁,而SOA带来的信息系统敏捷性则凸显重要。而国内SOA应用的尴尬局面,很大一方面是由于认识上的误区,影响SOA的推广应用。应用的误区主要表现在三个方面:

    首先,认为SOA是万能的,可以应用于所有的场合。其实情况并非如此,SOA并不能代替已经在公司内部存在的那些被良好集成的应用系统。通过合理的部署,SOA系统可以改善原有的IT系统效率,使得原有的那些应用系统更具有柔性。通常情况下,复杂的IT构架对SOA的需求更加迫切,并且SOA需要与外部复杂的IT环境交互,并快速的应对频繁发生的业务变化。

    其次,认为构建了SOA架构,就不再需要应用整合技术。其实,SOA并非一蹴而就。虽然SOA使系统整合更容易,但是企业仍然需要核心的整合技术,例如转换、挖掘、流程整合、适配器等等,使它们成为架构和规划中的组成部分。先要对需求进行一次全面的评估——不仅仅局限于IT,而是面向整个企业。实现SOA可能需要耗费几年的时间。前不久,SAP公司宣布,随着mySAP ERP2007年的面市,它将把其ERP软件分解成以Web服务出现的更加粒状的自我描述构件。那样,用户就能够组合这些构件,以生成定制的松散耦联的复合应用,SAP公司称其为xApps?

    此外,认为构建了SOA,就不需要IT人员的参与,业务人员照样完全可以把服务连接成新的业务流程。这种想法没有考虑服务的实现仍得由人编写实施服务的软件,以及系统仍需要有经验的IT专业人员把业务工作流转换成顾及企业级性能、安全、资源使用和可靠性的具体实施方案。

    其实这种误区的产生是跟SOA 的三个应用层面理解的偏差所致。譬如开发者大多对如何建立SOA 应用感兴趣,因此他们关注的趋向更多是 SOA 中的应用程序的体系架构方面。而 Web Serivces 管理工具的卖主一般认为 SOA 主要是关于基础组件体系结构的,同样的,用户群体会认为 SOA 是用于企业业务应用结构的。

    对于国内的用户来讲,接受SOA,难的并不是技术,而是SOA理念的灌输,以及对企业文化的重新改造。SOA与传统的应用体系结构不同,SOA更多地是针对变化而设计的,基于SOA的系统具备更大的弹性,而且能够实时地根据企业的变化,调整自己的结构,以满足企业变化的需求。SOA的一个中心思想就是让企业应用能够彻底摆脱面向技术的解决方案的束缚,以轻松应对企业商业服务变化、发展的需要。

    构建面向未来的SOA

    走出应用的误区,无疑SOA的构建显得异常重要。因为通过以服务为中心而不是以应用为中心来组织企业ITSOA为企业提供了一系列关键的好处:提高生产力、对业务和IT的灵活性和响应速度、允许IT更快地提供服务并更好地适应业务的需求以及允许业务更快地响应并提供更好的用户体验。但怎样才能成功实施SOA?

    从用户的角度看,SOA?有助于企业实现资产重用、灵活的管理和更快的开发与部署。在当今的业务环境中,变化无时无刻不在,快速响应客户需求、市场机遇和外部威胁的敏捷性比以往任何时候都更显重要。SOA能帮助用户随需应变,代表了企业信息化的最高境界。

    当然,也会有很多人都认为SOA只是大型企业才会用到的一种架构和方法。其实不然,SAP认为:SOA不只是大企业独享的,中小企业也能拥有。因为中小企业也是生态中的一部分,所以他们并不需要整合自己,而是要把自己建立在一个开放的平台上,以帮助自己能参与到大的生态商业系统中。

    那么,企业应该如何构建SOA呢?其实,实施SOA需要企业改变以往对待IT系统的观念,从新的角度来看待IT系统。SOA不仅是技术问题,更是企业战略和业务方面的问题。

    因此,企业要将不同的系统、不同的应用统一到一个大的框架之内,企业基础平台的选择就显得尤为关键,平台选择的好,企业可以很方便的实现应用系统的集成,达到事半功倍的效果。企业在选择基础平台时,一定要关注平台所支持的标准以及所拥有的功能。

    值得一提的是,在世界500强企业中,有400名使用的是SAP的产品,更有人把SAP的产品称作“进入世界500强的准通行证”。在SOA领域,SAP也是走在行业的最前列。2005年底,SAP旗下所有产品都已经实现以NetWeaver 基础软件为核心来打造。在NetWeaver 中包含一个综合性的组件设置,包括接口软件、应用服务程序、集成工具、数据分析系统、工作流程序、标准数据管,另外还有一个开发平台,所有这些都是基于SOA框架的。

    NetWeaver是开放性的整合与应用平台,能让企业以SOA的方式建构组合式应用。 NetWeaver完全是建立在开放的平台上的,支持各种各样的标准,包括Web Spheare和微软.net都是兼容的。NetWeaver基本上覆盖了企业级应用的主要的全部功能,还包括各种移动的接入,提供了底层的技术平台,现在SAP所有的企业级软件就是在这个平台上跑的。

    因此,尽管SOA不是一剂灵丹妙药,也不适合解决所有的问题,而且SOA真正在国内大规模应用普及还需要克服众多障碍。但是,我们相信随着SOA的应用得到了正确的认识,SOA成为软件业的下一个大趋势已是不争的事实,而且正在步入发展的新阶段。

    posted @ 2007-08-27 13:36 CharlieShen| 编辑 收藏

    在即将过去的2006年,SAP发布了企业级SOA的应用产品——mySAP ERP 2005,每次同媒体、合作伙伴或者客户聊起这个产品,被问到最多的问题就是:SAP企业级SOA产品的特点是什么?其实,答案是显而易见的,SAP发布的不是一个单纯的技术平台,而是搭载了丰富企业级SOA应用的业务平台。
     
    谈到企业级架构,应该包含两层意思:首先是要理解如何最好地组织业务流程,从业务目标着手,贯穿整个复杂的相关业务流程设计;其次才是信息技术如何支持企业组织和相关业务流程。SAP拥有近三十多年的商业软件和业务流程经验,她的SOA产品不同于其他同类产品,是纯粹的技术台或者技术中间件,其特点和优势就是拥有丰富的业务内容(Business Content),面向应用和面向业务流程。
     
    回顾过去三年开发历程,SAP有清晰的SOA产品战略,一开始就是和应用共生的。在2004年,我们集中力量发展基于开放标准的NetWeaver技术平台,为SOA产品打造稳固的技术基础;到2005年,在技术平台上SAP凭借多年的业务经验,从原有的应用产品中识别、重新划分包装了许许多多服务,组成企业服务知识库(Enterprise Services Repository);进入2006年,发布的mySAP ERP 2005产品是在所有应用都转移到面向服务的架构后的成果,产品包含的所有应用都是以来自组成企业服务知识库中的服务构建而成,应用之间的集成也是依据其中定义的标准接口。
     
    也就是说SAP在帮助客户转移到面向服务的架构之前,首先把自己所有的产品转移到SOA,并且提供企业服务知识库作为服务重用的数据字典。因此客户拿到SOA产品的时候,不仅仅得到的是技术平台和工具,而是马上可以使用的应用产品,更重要的是他们能在由服务构成的应用产品上立刻做业务流程创新,按照业务流程实践的需要对流程进行重构建模。打个比方说,SAP发布了一个乐高(Lego)积木搭建的房子,这个房子好比是企业的业务流程,而每一块乐高积木好比是企业服务知识库中的服务,客户拿到这个房子以后,或者马上可以使用,或者是做一些改造,例如:把车库部分重新构造;甚至可以用这些积木对整个房子进行重新构造。这种改造随同企业运营环境和业务需求的变化,会常常发生,可靠的积木模块保证了能够迅速可靠地完成改造,而且业务用户是这样的改造中的主体,不用涉及太多技术细节,不用了解乐高积木是如何铸造的。
     
    假设客户只是得到一个技术平台和工具,那么客户首先要自己完成企业应用的SOA重构,这可不是一件容易的事情,从应用上讲,如何去划分服务,识别什么是必需的服务,抽象出通用的服务,决定合适的服务颗粒度,定义稳定的服务接口,这些都是SOA重构的难点。30多年积累的业务流程经验,让SAP在这方面占有很大的优势,通过企业服务知识库,我们解决了一大部分这样的难点,共享给客户,希望为客户带来一个比较高的SOA实施起点,减少变革的阵痛,迅速从SOA获得效益。业界许多公司在部署SOA时倾向于选择SAP,主要就是看中了SAPSOA在应用层上的表现,SAP关注应用,并且一直致力于把自己的SOA应用做得更加灵活和更可用,特别是把关注点放到业务处理模型以及业务流程定制上。
     
    posted @ 2007-08-27 13:34 CharlieShen| 编辑 收藏

      SOA(Service-oriented architecture,面向服务的架构)是这两年在ERP圈子里出现频率最高的词汇之一,有些厂商和顾问言必称SOA,否则就会让人觉得跟不上ERP技术潮流了。SOA是一种软件架构,它就像计算机的总线一样,构成了企业信息化的主线,除了ERP以外,企业其它以ERP为核心的外围信息化模块应用如CRM、SCM、SRM、PLM等若符合SOA的技术规范,即使不是同一个公司的产品,实施和接口将比以前更加容易。根据IBM 对SOA的定义,SOA使一个应用程序的业务逻辑(Business Logic)或单独的功能被模块化并作为服务呈现给消费者(Customer)或客户端(Client),这源于SOA的松耦合性。SOA凭借松耦合的特性,使企业可以按模块化的方式来添加新服务或更新现有服务,从而可以最大限度的保护现有IT基础投入。

      以前的ERP就像使用大规模集成电路(IC)的电视机(主要功能都在一个IC里面,业内称之为“单片机”)。如果在使用过程中,我们发现电视机的某项功能失去了(比如无声),恰好就是因为IC里面负责声音处理的部分坏掉了,这时我们只有更换整个IC来修复故障。SOA对于电视机而言,就像是把实现所有功能的大规模IC根据声音、图像、色彩、行场扫描等分为多个规模稍小的IC(模块),每个模块可以单独更换。而且,符合模块要求的IC可以由多个生产厂提供,可以完全互换或经过很少的外围元件更改就可以互换。当然,电视机制造技术的趋势是从分立到集中,便于降低制造人工成本;ERP的技术趋势是从集中到分立,籍SOA技术,使这样的架构实现成本更低。

      在SOA技术出现之前,因为各业务模块之间非松耦合的关系,某块业务功能升级将引发整个ERP产品的升级,对于业务和信息部门都带来很大的压力。某一业务模块的调整将对整个公司或集团的信息处理工作带来影响,比如因为升级需要频繁的停机安装和备份,甚至带来相关模块操作界面和流程的改变。在SOA技术出现之后,各ERP产商都在SOA的技术规范下建立了自己的SOA开发环境,比如SAP的NetWeaver、Oracle的Fusion、金蝶 的BOS等。通过SOA开发平台的迁移,ERP厂商们逐渐把原来紧密结合的业务模块进行重新定义,作为单独的产品来发布和升级。还是以SAP为例,R/3过渡为ECC作为ERP的核心,SD的功能逐渐在CRM中得到继承和扩展,MM则过渡为SCM(供应链管理)和SRM(供应商关系管理),R/3的主数据管独立为MDM(主数据管理系统)为SOA整合打下了数据基础……

      SOA的技术思想无疑是先进的,众多软件开发商(当然ERP厂商更是主力)也推出了自己的SOA产品线。它们都符合SOA的基础定义,但又往往加入了开发商自己的一些东西,特别是以IBM、Oracle、SAP、BEA等国际软件巨头为代表的SOA技术规范参与者,它们都想通过自己的软件产品对SOA标准的定义和扩充,成为SOA标准的事实领袖。据Gartner的研究预测,2007年全球50%的核心业务系统将会使用SOA架构,到2010年将达到80%,同时80%企业的现有应用系统将于2011年前完全融入到SOA架构中。虽然根据笔者的观察,大多数国内企业的CIO/CTO对于SOA还在观望,但从引领IT技术潮流的美国SOA的发展态势看,SOA在企业应用将带来一场革命,其作用将一点不逊色于Web2.0对于互联网的影响。

      如果说SOA还有隐忧的话,那就是SOA标准的不统一性,虽然IBM、Oracle、SAP、BEA、SUN 等及国内的很多软件商都参与了SOA标准的制定,但W3C、OASIS、IETF、GGF、WS—l等多个标准组织和多种SOA标准描述使SOA标准乱战之势已形成。国际软件大鳄们在参与SOA标准制定的同时,都努力推行自己对于SOA的定义和扩展,力图使自己的SOA产品和技术成为SOA事实的工业标准。在企业信息化甚至互联网应用中,对于SOA标准的统一有利于降低信息化建设和集成的成本,使CIO/CTO从关注信息化的TCO(总体拥有成本),过渡到关注信息化服务业务本身。同时,某些软件巨头对于SOA的标准的垄断虽然有利于标准统一,但同时也带来垄断对于技术进步的负面影响。

      是否内置符合SOA标准的,支持多语言的开发平台,并且ERP所有应用模块都在这个平台上构建,是区分ERP技术构架的分水岭。通过ERP内置开发平台,逐渐向企业其它应用渗透,可以算是ERP技术发展趋势之一。在这一点上面,SAP做得比较成功,目前推出的新版本CRM、PLM、SCM等已完全作到了和ERP从界面到后台技术的完美统一。Oracle已计划通过Fusion技术,将收购的Siebel CRM、Peoplesoft HR进行整合,以此和SAP的产品线进行全面抗衡。另外,通过Portal技术,ERP向企业门户渗透的脚步也没有停止,DELL、SONY、联想 的在线定制和网上商城可算是比较成功的案例之一。

      SOA的发展前景是肯定的,但最终是一枝独秀还是百花齐放还有待观察。它作为构架企业信息化平台的新技术,将对未来10年ERP市场的格局带来深远影响。

    posted @ 2007-08-27 13:33 CharlieShen| 编辑 收藏

    升级在企业IT的生命周期中是不可避免的,但是SOA的益处使得NetWeaver的实施令人信服。

      马克·吐温曾经说过,死亡和交税是人生之中不可避免的两件事。我想说的是,在应用软件的生命之中,升级一样不可避免。你可以推迟死亡和升级,但是却不能完全摆脱它们。

      在2002年末,SAP发布了SAP R/3 Enterprise (版本 4.7)。许多顾客考虑到某天他们必须升级到最新版本,直接提前完成了升级。

      但是,SAP R/3 Enterprise发布的尘埃尚未落定,一种被称为SAP NetWeaver 2004的新范式被提出了。常识告诉我们应该升级到最新版本,尤其是在新版本有多重价值的情况下, NetWeaver 2004就是这样的新版本。但是,上千记的客户却并没有打算升级其R/3 4.6C, R/3 Enterprise 4.7或者更早版本。所以,是应该保持不升级状态,还是应该下定决心立即升级到NetWeaver 2004,以便能够应用其新功能部件呢?

      如果只允许推荐一个使升级值得的新功能部件的话,我认为那将会是它能够以服务的形式构建应用程序的能力,这些服务对外开放并且能够被后继行业标准规程重新利用——即面向服务的架构(SOA)。

      随之而来的SOA和企业级SOA

      SAP并不是加入SOA潮流的第一家主要软件厂家,而且也绝不会是最后一家。但它是一直在提供配置企业级SOA方面非常成功的一家。大多数人对于SOA的概念都已经很熟悉了——基于服务的架构,将商业规则和流程封装从而能够向公众应用和再应用开放。如果这种架构处于企业级上,概念就扩展为企业级SOA(ESA)。利用这些企业级服务,SAP和其客户、商业伙伴等合作者就可以构建可以重复应用的服务来封装商业流程和规则,并且可以用来构建新的流程和规则。

      在本世纪初,SAP公司面临的境况是:公司销售额和利润增长缓慢; 甲骨文公司不断吞并竞争者并且市场份额不断增长,SAP需要保持与它的竞争能力; 需要精简产品线并且降低SAP软件的使用和维护费用; 从专利向开放标准变化; 像SAP前产品技术总监Shai Agassi一样的善于想象者的地位提升等。

      NetWeaver正是这一连串需要和观点的结果。企业级SOA是NetWeaver包的主要价值命题。不愧其声誉的是,SAP并没有让样式和宣传取代内容成为主要竞争力,而是集中精力交付了一个非常有潜力的技术范式。

      什么是SOA和ESA?

      除了“应用程序作为服务”概念以外, SOA并没有唯一的定义。但是这一概念并不是全新的——即应用诸如XML, SOAP, WSDL和 UDDI等开放标准和技术进行绑定,开放外部访问,并且在被架构为服务的商业功能之间进行交互。NetWeaver通过应用其网络应用服务器6.40(Web Application Server 6.40,即Web AS)支持所列规程来实现上述功能。Web AS是NetWeaver的后端服务器和技术基础。

      这些规程并不是全新的,很可能您的企业已经在将其作为基于网络的应用程序而使用。如果您对于企业在IT方面的核心能力做过记录的话,就很可能会发现这些技术和概已经存在,而且更重要的是,可能已有很好的认同度。

      宣布从SAP辞职后不久,Agassi在其博客上讲述了ERP, NetWeaver和企业级SOA的联系。在解除了公司规范的束缚后,他对其中的关系给出了公正的说明,标题是“ERP重要吗?”

    客户反应

      与我交谈过的SAP和其他主要SOA厂商的大部分顾客都认为SOA和ESA的概念过于抽象。有些人表示他们不会在像SOA这样模糊的概念下就决定使用或升级到NetWeaver 2004。

      如下是其中一些争辩最激烈的话题:

      我们所有的配置和开发是不是都会过时?

      构建企业级服务是不是与实施新的SAP模块类似?

      我们在ABAP方面的能力是否已毫无意义?我们应该招募Java 开发者吗?

      通过NetWeaver 实施SOA会额外收费吗?

      这些问题显示了NetWeaver和SOA的低认知度,这并不值得奇怪。在NetWeaver的早期阶段,有太多的理论、假设和高层次的思想,而具体信息非常少。我是第一次见到SOA和ESA的市场推广产品感到眩晕的SAP专业人士之一。还好,SAP为客户提供了一种可视化的构架以及许多帮助将想法转化为实际的资源。

      建议

      如果对于从ERP立场看企业级SOA来说,您是新手,那也不要绝望——大多数人都和您一样。但是,请不要让对技术和(或)NetWeaver的相对不熟悉成为您升级到NetWeaver并应用它的阻碍。

      转换到企业级SOA并不是一件容易的事情,我自己以及其他专业人士的经历可以说明其中的挑战大量存在。但是,SOA对于在当今超竞争的全球环境下使业务灵活化具有巨大的潜力。而且,SAP提供了实现灵活化愿景的的必要工具和技术——SOA能够与NetWeaver中的其他强大程序协力工作,这些程序有Visual Composer、NetWeaver Developer Studio (NWDS)、复合式应用程序框架(Composite Application Framework,即CAF)以及Adobe的交互式表单技术(Adobe's Interactive Forms technology)等。

      现在是该认真考虑企业级SOA的时候了。投入耐心和努力,您的企业就能从中受益。下面是对实行SOA的一些建议:

      不要把SOA看作范式更改。如果您付出应有的努力来分析组织的IT能力,就可能发现可以把SOA简单看作范围的扩张,从而使实施比想象来的容易一些。

      不要让关键股东淹没在技术行话、术语和缩写之中。SOA的关键主题是增加SAP投资的回报率和降低所有者的总体成本。利用这一主题来说服执行官投资于SOA的机会比较大。请谨记,SOA更多的是帮助业务满足挑战,而不仅仅是推行一揽子技术。

      不要贪多求快。尝试采用最容易的方式来获取最初的胜利并转变反对者和怀疑者的观点。也就是说,首先建立基于相对简单的业务流程的服务。最初的胜利对批评者和倡导者都会产生积极的心理影响,从而推动更广泛的应用。

      遇到困难积极寻求帮助。寻求帮助的最好去处之一是软件开发者网络(Software Developer Network)的SAP服务交流区。需要更多的资源,请查询工具条
    posted @ 2007-08-27 13:33 CharlieShen| 编辑 收藏

    【IT专家网独家】在一个SOA专家眼中,德国商业应用巨人SAP AG在争夺面向服务的架构(SOA)的核心的战斗中打败了主要对手,Oracle——至少目前是——并且IBM开始痛击这两家公司。

      同时,SOA还是被缓慢的接受,但是可以肯定的是大量的SOA计划正在进行中,根据一项最新的调查结果。

      SearchOracle.com调查了683位分布在各行各业、在IT决策过程中有一定发言权的IT专家,发现84%的受访者没有实现任何的SOA技术。其中,48%的受访者表示他们计划在未来三年中实施SOA,然而其他的半数受访者表示他们不知道他们的公司是否或者合适将进入SOA的世界。

      SOA计划提示

      总之,对于像这样的组织结构,SOA计划上哪家领先谁并不重要。根据分析师,计划SOA的IT专家应该从放下他们的笔记本开始,花时间来确定到底他们要用SOA解决什么商业难题。

      “你从商业问题开始,你检查你的商业流程,你找出如何建立服务,然后你开始思考购买什么,”美国马里兰州巴尔的摩的ZapThink公司的高级SOAWeb Service分析师Jason Bloomberg说。“(采购)不是第一步,而应该是第四或者第五步。”

      同时,Bloomberg说,数据库管理系统是SOA架构的关键组件,因此使用对XML原生支持的DBMS是非常重要的。大多数DBMSXML的支持的非常好,他说,但是组织机构通过产品比较来确定他们是否已有恰当的技能来最大化的利用每个产品中的特有XML功能,是个好主意。

      最后,对SOA感兴趣的人们应该记住SOA不是一个产品,它只是一个架构方法。

      “不要指望能够从任何厂商购买到SOA,”Bloomberg说。“(SOA)是一个利用异构性的方法。因此假如哪家厂商说,‘买了我的产品,你就可以得到SOA了,’那么他们就是蒙蔽你。没有哪个厂商会真心真意的这么说的。”

      一些机构,比如美国阿拉巴马州Jefferson郡的政府,完全没有时间或者资源来开始一个SOA开发项目。

      根据Jefferson郡的系统架构师David Shockey说,他的团队一直忙于使用较廉价的现成软件产品来取代遗留的主机应用,这些都受到吃紧的预算的限制。

      “SOA真的没有在我们的决策过程中被考虑,”Shockey 说。“也许有一点会实现SOA,但是决不是现在。我们还有很多其他优先的任务。”

      OracleSAPIBM都在竞争SOA的霸主地位

      SAP,凭借NetWeaver策略,在向客户证明它的SOA功能上比Oracle更胜一筹,Bloomberg说。但是,他补充,SAP也有SOA相关的问题。

      “这个公司在Shai Agassi离开之后,正经历重大的重组,因此关于他们的领导权和SOA的前景还是悬而未决的问题,”Bloomberg说。“他们还相当公开的斗争,就像他们希望客户在NetWeaver上运行企业服务。”

      与此同时,Oracle正在忙于实现称为Oracle Fusion的伟大的软件集成事业——在过去四年中近30笔收购的结果——并且承诺在2008年初推出完全基于Java和支持SOA的商业应用堆栈。这个Fusion挑战如今正在耗费着OracleSOA前线能够投入的精力,据Bloomberg说。

      “SAPOracle更有优势,因为他们有更动听的企业服务故事。他们谈论能够抽象他们应用功能的服务——他们的核心ERPCRM功能,”Bloomberg说。“但是Oracle呢,你听到他们的SOA故事,并且你听到他们的企业应用故事,但是你并没有看到它们像SAP那样互相联系起来。”

      接下来是蓝色巨人。

      “IBM拥有其他任何厂商都没有的最广阔和最深入的SOA故事,凭借他们可靠的软件和职业服务,以及跨产品线和界限的深度,”Bloomberg说。“他们是所有人的头号公敌。”

    posted @ 2007-08-27 13:31 CharlieShen| 编辑 收藏

    NetWeaver,是SAP推出的企业应用软件的底层技术平台,作为一个类似于中间件的支持平台,它不但提供强大的企业级SOA架构服务,还支持SAP所有新的应用软件。


    对于SOA的概念,大家都已经很熟悉了—基于服务的架构,将商业规则和流程封装从而能够向公众应用和再应用开放。如果这种架构处于企业级上,概念就扩展为企业级SOA(ESA)。


    SAP TechEd (SAP 全球技术研发者大会 ),作为SAP 全球最重要的技术类大会,拥有10多年的悠久历史。今年,SAP TechEd 来到中国上海。在这里,您将了解如何运用SAP NetWeaver的力量及其灵活性对您的业务流程进行创新和改变。并与产业链中的技术专家、客户代表、合作伙伴以及业界同行进行交流和学习,分享由 SAP 顶级技术专家的专业知识和观点。【编辑/付江】


    posted @ 2007-08-27 13:30 CharlieShen| 编辑 收藏

    SAP已着手将软件改写成SOA—由模组化元件及中间件软件组合而成的架构,部份新版软件已经出货,并预计于2007年完成所有软件的改写,SAP台湾区技术副总陈平佳指出。所谓服务导向架构(SOA)是打破相互独立而不互动的传统应用,将软件变成一个由中间件软件,与上面的模组化功能(称为服务)组合而成的灵活整体,可以依据企业业务面的需求而“兜”成对客户或使用者的服务。中介软件则负责服务提供软件元件控管,及与其他软件整合的任务。SOA已成所有软件大厂,包括IBM、BEA、微软、甲骨文的共同发展目标。SAP也不例外。作为一家大型商用软件公司,SAP产品以功能完整与稳定闻名,不过,却被视为过于庞大而缺少弹性,且因技术较特殊也较不易和他人整合。为了跟上这股潮流,SAP高层多次表态向SOA转换的决心。从商用软件起家的SAP也开发出名为Netveaver的中介软件作为软件元件的底层基础。

    在最近的开发者大会上,SAP宣布投入1亿2500万美元NetWeaver基金,及多项开发人员认证,以扩大NetWeaver认证产品的范围。这使得SAP与甲骨文成为同时兼具中间件软件与上层应用的供应商,其中又以甲骨文为最旗鼓的对手。甲骨文收购了Siebel与PeopleSoft(PeopleSoft稍早又收购J.D.Edwards)后,即归划出Fusion作为所有应用软件的基础平台,不过由于整合工程太大,甲骨文预计要到2008年才会推出Fusion。 陈平佳并不认为SAP的产品“很大”,但他指出,变成模组化并通过商业流程引擎的驱动,的确可提升开发上的效率。目前几个主要SAP的模组,包括企业资源规划(ERP)、供应链管理(SCM)、采购(Procurment)模组新版本出货时皆已可执行在Netweaver上。陈平佳表示,所有软件改写工程将至2007年完成。对于旧有SAP而言,新版软件意谓着新的整合工作。对此他表示,Netweaver也可以独立出来,以利于新、旧版本SAP的整合。
    posted @ 2007-08-27 13:28 CharlieShen| 编辑 收藏

    本文的目的是为IBM业务伙伴提供关于DB2 Universal Database(UDB)for z/OS(后面将简称为 DB2)环境中DB2数据库性能的重要信息。本文试图从多处收集材料,并尽可能有效地将它们表述出来。本文无意包含很全面的范围,也不会包含很深的细节。

    我曾打算讨论对DB2数据库的性能影响最大的一些因素。但是,并不是所有可能的情形都可以预测到,也不是所有潜在的考虑都能顾及到,更不用说在期望的范围内对它们进行描述了。我希望本文可以为不同环境下的DB2用户提供一个通用的指南,以帮助他们取得最佳的DB2数据库性能。本文的目的是成为一个良好的起点,用以处理任何给定安装环境下的数据库性能问题。

    本文的范围是数据库设计性能。DB2性能远不止这一部分,它肯定要受到数据库设计以外的很多因素的影响。例如,程序的编码逻辑和其中使用的实际的SQL语句,可以列为应用程序设计一类。DB2系统性能可以包括诸如安装选项、缓冲池大小设置、DB2相关地址空间的调度优先级等等之类的因素。

    本文的焦点是DB2数据库的设计。不过,有时候这些性能因素类别之间的界线可能会有些模糊。例如,在某种安装环境下进行配置时,缓冲池大小的设置和数量的选择通常被认为是一项系统性能因素。但是,倘若是将特定的表空间和索引指派给那些缓冲池,那么这些因素又可以看作是数据库设计一类的因素了。

    在这里,我假设读者对z/OS环境中的DB2有一个基本的理解。本文的头几页将讨论性能管理的一些基本概念和准则,以便进行“级别设置” 。我的建议有点综合的性质,因而不会总是详细地给出技术性的描述和语法。读者如果想了解关于这些内容的更详细的信息,那么应该去阅读关于用户本地所安装的DB2版本的最近的IBM文档。

    本文的通用设计点是DB2 for z/OS V7。虽然DB2 for z/OS V8已经被宣布,并且也普遍可用(generally available ,GA),但是大部分IBM客户极有可能需要几个月的时间才能实现用于他们的生产系统的DB2 V8 NFM(New Function Mode)。而且,这里还要考虑另外一个因素。虽然DB2的每个新版本在变得普遍可用之前,都已经在IBM及其客户环境下经过了广泛的测试,但是相对于一个还没有推广的、没有普遍使用的版本而言,客户们往往对于基于早先版本的DB2的一般建议和窍门更有信心(长时间积累的经验验证了这一结论)。我将提到DB2 V8的一些新特性,从性能的角度来看,这些新性能可能会影响数据库设计。

    免责声明:本文中所包含的信息未经任何正式的IBM测试,而是以AS IS的形式发布的。对这些信息的使用和其中任何技术的实现,都由用户承担责任,并取决于用户的能力去评价它们和将它们整合到客户特有的操作环境。虽然IBM对于每一项都进行了审查,以求特定情况下的正确性,但不能保证在其他情况下也能得到相同的或类似的结果。试图将这些技术应用于他们自身环境的用户须自己承担风险。
    posted @ 2007-08-27 08:35 CharlieShen| 编辑 收藏

    速度和可升级性是网络开发重要的性能要求,而且它们也不难达到。应用一些简单的规则会提高网络应用的性能。在本文中,您将了解到使用Borland C#Builder和IBM DB2通用数据库(UDB)8.1开发快速Microsoft® ASP.NET Web应用程序的2条规则。

    分析Web应用程序的性能需要利用一些手段来检测每个操作的性能。为此,我创建了一个TimeDiff类(见程序清单1),它可以计算数据库操作的用时。你可以利用TimeDiff类的检测结果作为衡量数据库操作性能的基准,来观察哪些操作最为有效。我还创建了一个配合TimeDiff 类使用的LOTSOFRECORDS表(见程序清单2),它包含10,000条记录,你可以通过对它的操作来观察不同技术之间的性能差异。DB2具有内部缓冲池,一旦运行一个查询,内部缓冲池启用,因此二次查询的速度较快。在检测查询速度时,请忽略缓冲池启用前的结果而采用启用后的结果。

    程序清单1. TimeDiff类

    posted @ 2007-08-27 08:34 CharlieShen| 编辑 收藏

    安装DB2 9数据管理软件大致有4种方式:“DB2安装精灵,db2_install安装脚本,描述配置文件式安装,纯手动安装”等。以下分别介绍:

    DB2安装精灵

    在Linux,Unix,Windows操作系统环境下的图形界面向导式安装方式,对初次安装DB2 9的用户很实用。安装精灵提供容易使用的安装界面,能简化安装后的数据库性能调整和优化任务等操作。安装精灵还可以用来简单地生成数据库实例和描述安装配置文件,在Unix或Linux环境下,安装精灵的运行需要依赖x服务器软件的支持。

    db2_install安装脚本

    这种脚本安装方式只可以在Linux或Unix平台环境下才可以使用,Windows平台不支持脚本安装方式。该种方式对安装过程的控制粒度更细致,但这种安装方式无法创建数据库用户和组,无法创建数据库实例,或进行安装后的配置。

    描述配置文件式安装

    描述配置文件是一个文本格式的文件,其中包含了DB2 9安装需要的步骤和配置的一些列设定值,DB2 9安装程序将读取描述配置文件中的各项预设安装值进行安装。有以下一些方法来生成安装描述配置文件:
    1.在Windows平台下可以用描述文件生成器

    2.使用DB2安装精灵来生成

    3.对产品包中提供的样例文件进行修改后得到
    这种安装方式有利于进行DB2 客户端的分布式安装,例如,你可以先安装好一个DB2 客户端,对它进行充分配置后,将结果生成一个描述配置文件,然后对类似的客户端进行安装复制。还可以使用db2cfexp命令来输出DB2客户端软件和服务器端软件的安装配置轮廓文件。

    纯手动安装

    此种安装方式只建议高级专家使用,需要安装者对将近970多个安装子包进行解包和安装部件提取工作,复杂性,不言而喻,不推荐初级用户使用。

    (责任编辑:城尘 68476636-8003)

    posted @ 2007-08-27 08:32 CharlieShen| 编辑 收藏

    什么是数据复制

    数据复制就是通过将源数据库中指定的数据复制到目标数据库中,以保持源数据库与目标数据库中指定数据的同步(一致)。

    基础概念

    CD表:change data tables更改数据表,用于临时存放更改数据的表。一般包含有需要捕捉更改的列及一些控制列。

    例如:用户指定的,要捕捉更改的列
    CREATE TABLE DEPARTMENT ( DEPTNO …, <-- DEPTNAME …, <-- MGRNO …, ADMRDEPT …, LOCATION …)

    源表
    CREATE TABLE CD20030805296530( IBMSNAP_UOWID …, IBMSNAP_INTENTSEQ…, IBMSNAP_OPERATION …, DEPTNO…, <-- DEPTNAME …) <--

    CD表

    DB2日志类型:

    循环日志 归档日志:

    DB2数据复制的组件

    DB2 DataPropagator由三部分组成:管理界面、更改捕捉机制、应用程序

    注意:此处应用程序(Apply program)与我们通常所说的应用程序是不同的概念,本文中如无特殊说明,“应用程序”都是指DB2数据复制的组件。

    管理界面

    我们主要用它来创建用于存储复制标准的控制表。控制表有多种类型,用来存放要复制哪些表哪些列等信息,我们在后面再仔细探讨。我们可以使用的管理界面有两种:

    1.DB2 Control Center(DB2 控制中心) 只能针对DB2服务器之间的数据复制

    2.DataJoiner Replication Administration (DJRA) 可包含非IBM数据库的数据复制(本文不详细讨论)

    具体控制表类型可通过查看文件“SQLLIB\samples\repl\dpcntl.udb”来获得,本文涉及到的控制表主要有:ASN.IBMSNAP_REGISTER、ASN.IBMSNAP_UOW等。

    更改捕捉机制

    在建立复制环境之后,利用该机制去捕捉源数据库发生的更改,且将更改临时存放于CD表中。 DB2数据复制解决方案提供两种捕捉数据的机制:

    1.捕捉DB2源表的捕捉程序

    当源是DB2表时,捕捉程序会捕捉在源上所发生的更改。捕捉程序使用数据库日志去捕捉发生于源数据库上的更改,并将更改临时存储在表里。捕捉程序运行在源服务器上。

    2.捕捉非IBM数据库源表的捕捉触发器(本文不详细讨论)

    应用程序

    当捕捉程序将源表发生的更改临时存放于CD表中后,应用程序再从这些表中读出源数据库的更改,将它应用于目标数据库,或者直接将数据从源数据库拷贝到目标数据库。

    1.当刚搭建起复制环境时,有一个初始化过程,该过程应用程序将直接从源表或视图读数据来初始目标表。而后如果你想复制更改,应用程序从CD表中读取临时存储的变化数据,将它应用于目标表。

    2.应用程序通常运行在目标服务器上,但它也可以运行在可以连接到源、控制和目标服务器的网络上的任一服务器上。多个应用程序实例可以运行在相同或不同的服务器上。

    3.每一个应用程序与一个包含着控制表的控制服务器相关联,控制表中包含着预订集的定义。控制表可以被多个应用程序实例使用。比如:你有一个源服务器和两个目标服务器,那么,你就可以将应用程序分别运行于每一台目标服务器上。这两个应用实例可以共享控制表,控制表中有特定的信息与每一应用实例相关联。

    各复制组件之间如何通讯

    各复制组件之间是相互独立的,所以他们依赖于控制表中的信息进行通信。捕捉、应用程序通过更新控制表以指示复制的进程及协调变化进程。

    对于DB2之间的复制,捕捉程序通过读取源服务器上的日志来捕捉源表中数据的更改。然后捕捉程序将更改的数据放入称之为更改数据(CD)表的表中。

    每次应用程序拷贝数据到目标数据库,目标数据库的内容将反映出在源数据库上发生的更改。应用程序是通过应用自应用程序所知道的对于目标的上一次更新以来累加的事务来实现的,即只应用还没应用的更改。

    基于日志的通讯

    捕捉程序使用部分控制表去记录发生在源数据库上的更改,而应用程序使用这些控制表中的值去检测什么需要拷贝到目标库中。

    重要:如果应用程序没有通知捕捉程序,捕捉程序不会捕捉任何更改信息。同样,除非你定义一个复制源并将它和预订集相关联,否则应用程序不会通知捕捉程序开始捕捉更改。

    posted @ 2007-08-27 08:32 CharlieShen| 编辑 收藏

    平静如水的数据库市场随着IBM新一代数据库DB2 9的正式亮相而重新掀起波澜。在XML入主数据库核心层之后,更多的人开始追问,传统的关系型数据库是否会被颠覆?

    7月14日,IBM软件集团发布了其最新一代的数据库产品DB2 9,不同于其他数据库,这款产品结合了层次型数据库与关系型数据库的优点,能够以XML的格式存储数据,XML在这一款数据库产品的地位不再是从属,而是核心之一,由此引发的一系列问题犹如在平静的水面上激起了太多的浪花—关系型数据库会被颠覆吗?这是否会改变数据库市场的传统格局?数据库设计与应用开发设计之间的鸿沟是否就此得以填平?

    IBM DB2 9的推出能够引发如此多的重要连锁反应,那么再讨论这款产品是否具有里程碑式意义已经不太重要,因为它本身已经在讲述一段崭新的故事。

    XML掀起完美风暴

    DB2 9可以提供XML数据的“原生态”存储,而无需将数据转化成行列格式,也不需要将其作为大型对象(LOB)来存储。

    近年来,数据库市场实在是一个让人感觉平淡无奇的地方。

    从上世纪80年代开始,关系型数据库以其扎实的理论基础得到了快速的发展,其后,各大厂商不遗余力的推动使得关系型数据库的主导地位不可动摇。到了20年后的本世纪初,以Oracle、IBM、微软三大数据库巨头为首的数据库厂商形成了三足鼎立的格局,各自封疆而治,局面变化甚微。同时,有关数据库技术创新的声音渐弱,无非是扩大关系型数据库的处理规模和效率,一直以数据库老大自居的Oracle公司的重心也转向了应用软件,数据库市场近乎一潭死水。

    “每当市场特别平静和乏味时,往往会有重大突破,大家都在沉淀”,IBM大中华区软件集团市场总监左洪这样看待数据库市场的演变,“我们发现,其实目前的数据库市场充满了激动人心的一面,XML可能引发技术和应用的多个突破点。”

    根据IDC对数据库市场的预测,XML数据库增长速度达到140%,远远超过其他数据库的增长比例。这预示着XML将成为今后数据库市场的主导力量。而各大数据库厂商也都为XML的成长做着准备。

    2005年,Sybase与微软各自发布了新一代数据库产品,其中对XML的支持都是主要特色之一,例如,在微软SQL Server 2005中,全面集成了.Net和Web服务技术,并发展出全新的XML数据库以及相关的查询语言XQuery。Sybase ASE15数据库为XML内容提供了灵活的存储和提取方式:将XML文档存储在text或Image列中;将XML映射到新的或已有的关系表中;从关系查询中创建XML格式的结果集;可同时支持 XPath/XQuery和 SQLX两种方式,进一步扩展了XML的功能。

    Oracle数据库10g在其小版本升级,即第二版中也增加了对存取XML数据的支持,还增强了对应用程序开发者的支持。

    XML并不是新面孔,其最初的使命是负责系统之间的数据交易,但XML并没有马上动摇到数据库的根基。关系型数据库产品纷纷提供了对XML的支持,但并未改变关系型数据库固有的血统,他们提供的产品是一种叫做XML-Enabled的数据库,XML只是附属功能。

    但是最近,XML-Enabled的数据库遇到相当大的挑战,这种挑战来自于外部环境。IBM院士王云先生谈到:“数据库面临的挑战就是数据类型的范围比20年前是不知道扩大了多少倍。信息的广度和复杂度都提高了好多。人们现在面临的是一个数量非常巨大、结构非常复杂的信息环境。”

    IBM 软件部信息管理中国区技术经理刘晶炜说:“今天大家用结构型的数据表描述这个世界,这种平面型的描述遇到数据少的还能应付,但当数据以一种爆炸式增长时,很多数据的不可理解性增加了,例如,一个ERP应用系统会涉及到上万张表,这么多表本身会导致效率下降,同时它描述业务的能力也非常弱。”

    目前,关系型数据库提供的都是XML-Enabled,IBM 从DB2 V7.0开始就提供这种支持,到DB2 V8.2依然如此,但是DB2 9的出场完全改变了这种传统,该软件使用了IBM已注册的商标—“pureXML”冠名的解决方案来管理以XML格式存储的数据。这意味着它可以提供XML数据的“原生态”存储,而无需将数据转化成行列格式,也不需要将其作为大型对象(LOB)来存储。

    IBM DB2 9同时支持纯XML文档和传统关系型数据,DB2 9中有两种数据库引擎,一种是关系型数据库的处理引擎,另一种则是纯XML处理引擎,从XML-Enabled到“纯XML+关系型数据库”引擎,这种改变如同科幻电影《暗夜传说》的故事情节那样令人意想不到—将吸血伯爵与狼人两大家族的神奇血统融为一体,IBM用XML引爆了原本平静的数据库市场,这种融合真的能产生更强大的“种族”吗?

    混合动力驱动数据库

    “混合动力车”的概念早就有,但研发出产品并非一朝之功,IBM为此准备了五年,而技术的积累时间则更长。

    在讨论混合型数据库是否更加强大之前,我们需要了解数据库的前世今生。目前流行的关系型数据库在处理大量的非结构化数据时显得力不从心,而在涉及企业之间不同应用系统的数据交易,以及根据多个已存应用系统联合构建新的应用系统时,关系型数据库也显得效率低下,这是否说明在复杂的信息环境下,关系型数据库将被完全颠覆呢?问题的答案不是这么简单。

    王云说:“XML是支援我们日益复杂的新时代应用的一个工具,但是传统的应用还是天天都在跑,比如证券交易系统。”

    相对而言,关系型数据库解决了固定流程下效率的提高,对于信息简单、处理数量巨大的应用来说,关系型数据库是最好的选择。关系型数据库与层次型数据库面对了两种不同的世界,前者是企业单一信息应用的王者,后者的强项是企业内不同应用之间、不同企业之间的信息处理。

    王云认为:“今天的问题是,目前有80%的信息都没有在数据库里面存储,都是以文档的形式存储,两种不同世界的信息处理都是由关系型数据库加上XML-Enabled来执行,效果显然不够理想。”

    所以,关系型数据库在新信息环境中的主宰地位虽然有可能被颠覆,但它并不会消失,在支持交易系统、商业智能等领域依然不可缺少,在DB2 9中人们看到的是一款“混合动力车”。

    刘晶炜谈到:“IBM首次在DB2 9版本里实现存储模式的结合,既可以用关系型存储,又可以用层次型对象的存储;既可以访问关系型数据,又可以用对象的方式访问。这并不是对传统形式的完全否定。它是一种融合,把新的模型新的选择加进来。”

    IBM DB2 9之所以能将关系型数据库与层次型数据库结合起来,这也与IBM的数据库情结密不可分。

    早在1966年,IBM就推出了世界第一款名为“ICS”的层次型数据库,以支持美国航空航天局(NASA)的“阿波罗登月计划”。在随后的1970年,IBM提出了关系型数据模型以及SQL标准,1983年DB2 关系型数据库正式发布,到今天IBM DB2 9(代号为Viper)的发布,IBM在数据库领域已走过了四十个春秋。

    即使在今天,ICS(后更名为IMS)仍然在一些大型企业中得到使用,其层次型数据库的结构非常适合管理宏大、繁琐的信息,包括中国建设银行在内的国内用户仍然是该产品的使用者。

    同时在层次型数据库和关系型数据库中积累了大量经验,这让IBM更能站一个恰当的角度理解信息管理的发展,王云说:“XML的结构就是层次型的,很容易支撑层次型数据库的发展,IBM在IMS上的积累与XML本身成熟的结合,有了今天DB2 9这样的混合型数据库。”

    左洪告诉记者:“如果只发展XML数据库也很容易,难的是传承两种数据库的优势。放在一起的好处是可以降低管理成本,也可以让管理员用熟悉的语言来查询、编程。以后我们还会把行业特性的XML标准加入到数据库产品中来。‘混合动力车’的概念早就有,但研发出产品并非一朝之功,IBM为此准备了五年,而技术的积累时间则更长。”

    posted @ 2007-08-27 08:31 CharlieShen| 编辑 收藏

    在Oracle数据库中,DBA可以通过观测一定的表或视图来了解当前空间的使用状况,进而作出可能的调整决定。

    一.表空间的自由空间

    通过对表空间的自由空间的观察,可用来判断分配给某个表空间的空间是太多还是不够。请看下列的语句

    SQL > select a.file_id "FileNo",a.tablespace_name
      "Tablespace_name",
      2 a.bytes "Bytes",a.bytes-sum(nvl(b.bytes,0)) "Used",
      3 sum(nvl(b.bytes,0)) "Free",
      4 sum(nvl(b.bytes,0))/a.bytes*100 "%free"
      5 from dba_data_files a, dba_free_space b
      6 where a.file_id=b.file_id(+)
      7 group by a.tablespace_name ,
      8 a.file_id,a.bytes order by a.tablespace_name;

    File Tablespace
      No _nameBytes Used Free %free
      ------ --------- -------- --------- --------- ----
      11IDX_JF .146E+09 849305600 1.297E+09 60.431806
      9 JFSJTS 2.146E+09 1.803E+09 343793664 16.016961
      10JFSJTS 2.146E+09 1.359E+09 787431424 36.685546
      2 RBS523239424 359800832 163438592 31.235909
      12RBS1.610E+09 1.606E+09 3104768 .19289495
      8 RBSJF 3.220E+09 2.716E+09 504356864 15.662396
      7 SFGLTS 2.146E+09 1.228E+09 918159360 42.776014
      6 SFSJTS 2.146E+09 1.526E+09 620093440 28.889457
      1 SYSTEM 523239424 59924480 463314944 88.547407
      3 TEMP 523239424294912 522944512 99.943637
      4 TOOLS 15728640 12582912 314572820
      5 USERS 7340032 81927331840 99.888393

    12 rows selected.

    可以看出,在FileNo为12的表空间RBS中,只有0.19%的分配空间未被使用,这个比例太小了,而在SYSTEM及TEMP等表空间中,高达80%以上的空间未被利用,对于生产型数据库,这个表空间的设置有些偏高。

    关于自由空间的管理,有下面的一些建议:

    利用Export及Import命令卸出和装入表空间可以释放大量的空间,从而缓解增加另外的数据文件的要求。

    如果包含具有高插入(insert)和更新(update)活动的表的表空间中自由空间的比重下降到了15%以下,要为此表空间增加更多的空间。

    对于一个基本是静态表数据的表空间,如果有多于20%的自由空间,则可以考虑减少分配给它的文件空间量。

    减少SYSTEM表空间的空间量比较困难,因为那要重建数据库。

    二 表及索引的扩展

    A.为了防止表或索引被过分扩展,及时实现对数据库的调整,用户应当经常对有关对象进行观察。

    我们可以认为,扩展区域大于5个的表或索引为过分扩展(overextended)。请看下面的语句:

    SQL > select substr(segment_name,1,15)
      Segment_name,segment_type,
      2 substr(tablespace_name,1,10)
      Tablepace_name,extents,Max_extents
      3from dba_segments
      4where extents >5 and owner='JFCL'
      5order by segment_name;

    SEGMENT_NAMESEGMENT TABLEPACE_
      EXTENTS MAX_EXTENTS
      _TYPE
      -------------- --------- ----------
      CHHDFYB TABLE JFSJTS 11121
      CHHDFYB_DHHMINDEX JFSJTS9121
      DJHZFYB_BF TABLE JFSJTS 17500
      DJHZFYB_DJHMINDEX IDX_JF6500
      DJHZFYB_JZHMINDEX IDX_JF7500
      GSMFYB TABLE JFSJTS 11121
      JFDHTABLE JFSJTS 14500
      JFDH_DHHM INDEX IDX_JF 61500
      JFDH_JZHM INDEX IDX_JF 64500
      XYKFYB TABLE JFSJTS7121
      YHDATABLE JFSJTS6500
      YHDA_BAKTABLE JFSJTS6500
      YHHZFYB_12 TABLE JFSJTS 10500

    13 rows selected.

    通过观察, DBA可以及时发现问题并进行相应的处理。

    我们可以利用export卸出表,然后删除表,再利用import命令将表装入,这样,可以将不连续的区域合并成一个连续的空间。

    B.如果用户希望对表的空间设置进行优化,例如,需要改变表EMP的initial参数,可以采用下面的方法:

    1.在将EMP表卸出并删除后执行imp命令时使用indexfile参数:

    imp userid=scott/tiger file=emp.dmp indexfile=emp.sql Oracle把表和索引的创建信息写到指定的文件,而不是把数据写回。

    posted @ 2007-08-27 08:27 CharlieShen| 编辑 收藏


    当你运用SQL语言,向数据库发布一条查询语句时,ORACLE将伴随产生一个“执行计划”,也就是该语句将通过何种数据搜索方案执行,是通过全表扫描、还是通过索引搜寻等其它方式。搜索方案的选用与ORACLE的优化器息息相关。

    SQL语句的执行步骤

    一条SQL语句的处理过程要经过以下几个步骤。

    1 语法分析 分析语句的语法是否符合规范,衡量语句中各表达式的意义。

    2 语义分析 检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。

    3 视图转换 将涉及视图的查询语句转换为相应的对基表查询语句。

    4 表达式转换 将复杂的SQL表达式转换为较简单的等效连接表达式。

    5 选择优化器 不同的优化器一般产生不同的“执行计划”

    6 选择连接方式 ORACLE有三种连接方式,对多表连接ORACLE可选择适当的连接方式。

    7 选择连接顺序 对多表连接ORACLE选择哪一对表先连接,选择这两表中哪个表做为源数据表。

    8 选择数据的搜索路径 根据以上条件选择合适的数据搜索路径,如是选用全表搜索还是利用索引或是其他的方式。

    9 运行“执行计划”

    ORACLE的优化器

    ORACLE有两种优化器:基于规则的优化器(RBO, Rule Based Optimizer),和基于代价的优化器(CBO, Cost Based Optimizer)。

    RBO自ORACLE 6版以来被采用,有着一套严格的使用规则,只要你按照它去写SQL语句,无论数据表中的内容怎样,也不会影响到你的“执行计划”,也就是说对数据不“敏感”,ORACLE公司已经不再发展这种技术了。

    CBO自ORACLE 7版被引入,ORACLE自7版以来采用的许多新技术都是基于CBO的,如星型连接排列查询,哈希连接查询,和并行查询等。CBO计算各种可能“执行计划”的“代价”,即cost,从中选用cost最低的方案,作为实际运行方案。各“执行计划”的cost的计算根据,依赖于数据表中数据的统计分布,ORACLE数据库本身对该统计分布并不清楚,须要分析表和相关的索引,才能搜集到CBO所需的数据。

    一般而言,CBO所选择的“执行计划”都不会比RBO的“执行计划”差,而且相对而言,CBO对程序员的要求没有RBO那么苛刻,节省了程序员为了从多个可能的“执行计划”中选择一个最优的方案而花费的调试时间,但在某些场合下也会存在问题。

    较典型的问题有:有时,表明明建有索引,但查询过程显然没有用到相关的索引,导致查询过程耗时漫长,占用资源巨大,问题到底出在哪儿呢?按照以下顺序查找,基本上能发现原因所在。

    查找原因的步骤

    首先,我们要确定数据库运行在何种优化模式下,相应的参数是:optimizer_mode。可在svrmgrl中运行“show parameter optimizer_mode"来查看。ORACLE V7以来缺省的设置应是"choose",即如果对已分析的表查询的话选择CBO,否则选择RBO。如果该参数设为“rule”,则不论表是否分析过,一概选用RBO,除非在语句中用hint强制。

    其次,检查被索引的列或组合索引的首列是否出现在PL/SQL语句的WHERE子句中,这是“执行计划”能用到相关索引的必要条件。

    第三,看采用了哪种类型的连接方式。ORACLE的共有Sort Merge Join(SMJ)、Hash Join(HJ)和Nested Loop Join(NL)。在两张表连接,且内表的目标列上建有索引时,只有Nested Loop才能有效地利用到该索引。SMJ即使相关列上建有索引,最多只能因索引的存在,避免数据排序过程。HJ由于须做HASH运算,索引的存在对数据查询速度几乎没有影响。

    第四,看连接顺序是否允许使用相关索引。假设表emp的deptno列上有索引,表dept的列deptno上无索引,WHERE语句有emp.deptno=dept.deptno条件。在做NL连接时,emp做为外表,先被访问,由于连接机制原因,外表的数据访问方式是全表扫描,emp.deptno上的索引显然是用不上,最多在其上做索引全扫描或索引快速全扫描。

    第五,是否用到系统数据字典表或视图。由于系统数据字典表都未被分析过,可能导致极差的“执行计划”。但是不要擅自对数据字典表做分析,否则可能导致死锁,或系统性能下降。

    posted @ 2007-08-27 08:26 CharlieShen| 编辑 收藏

    一、问题描述

    SQL Plus WorkSheet是一个窗口图形界面的SQL语句编辑器,对于那些喜欢窗口界面而不喜欢字符界面的用户,该工具相对SQL/PLUS受到了很大的欢迎。但从Oracle 8i以后,如果安装Oracle 8i时选取的是别于英语的字符集,对于我们中国,通常会选取简体中文字符集(ZHS16GBK),安装成功后,运行SQL Plus WorkSheet程序,会出现所有的中文显示以及查询结果均为乱码的情况。

    二、问题分析

    最初出现该问题,首先怀疑就是安装时字符集设置有问题,也就是说没有设置正确的简体中文字符集。首先检查数据库字符集,在SQL/PLUS中,运行下面的SQL语句,检查所连接数据库的字符集:

    SQL> select userenv('language') from dual;
      USERENV('LANGUAGE')
      ----------------------------------------------------
      SIMPLIFIED CHINESE_CHINA.ZHS16GBK

    查询结果发现数据库安装时所选字符集为简体中文ZHS16GBK,说明安装时字符集设置完全正确。第二步开始怀疑是用户客户端字符集问题,检查客户端注册表,打开注册表编辑程序(RegEdit),在HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/NLS_LANG,发现Oracle客户端字符集为AMERICAN_AMERICA.ZHS16GBK,设置也完全正确,可以排除是客户端字符集设置错误的问题。同时还有一个现象就是在同一个客户端机器上SQL/PLUS中的查询字符集显示完全正常,这也说明不是字符集设置问题,而是系统程序SQL/Plus Worksheet的问题。

    在Oracle 8i以前的版本中,从来没有出现过这样的情况,这应该和Oracle版本有关,我们知道Oracle 8i和它前面的版本一个显著的区别就是大部分的Oracle系统程序,现在均采用Java驱动,其实这也就是产生字符集乱码问题的根本所在。非Java驱动的程序,如SQL*Plus,有一个系统参数NLS_LANG,该参数在UNIX系统中设置在环境变量中,在Windows操作系统中设置在注册表中,这个参数决定了客户端应用程序的字符集。而对于基于Java应用的程序,如现在遇到的SQL*PLus Worksheet,NLS_LANG参数对这类程序是不起任何作用的。

    三、解决方案

    找到了问题产生的原因后,下面来讨论如何解决该问题。对于Oracle Enterprise Manager中的所有工具,有一个配置文件名为dbappscfg.properties,修改该文件即可解决上述问题。这个文件的位置在$ORACLE_HOME\sysman\config目录下,用任何的文本编辑器打开该文件,在这个文件里面,找到这样一项,

    # SQLPLUS_NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1

    去掉注释符#,同时将其修改为SQLPLUS_NLS_LANG=AMERICAN_AMERICA.ZHS16GBK。

    对于Windows操作系统,还需要修改一项,在文件中找到# SQLPLUS_SYSTEMROOT=c:\\WINNT40,去掉注释符,将其修改为你所在机器的操作系统主目录。如操作系统的主目录在D盘的Winnt下,则将其修改为 SQLPLUS_SYSTEMROOT=d:\\WINNT。

    对于后面一项的修改只对Windows操作系统进行,对UNIX操作系统则不需要。如果在Windows操作系统中不修改该项,在Oracle Enterprise Manager中,连接系统时,会提示如下的错误:

    ORA-12560 TNS:protocol adapter error

    或者

    ORA-12545 Connect failed because target host or object does not exist

    修改完成后,保存文件,退出编辑。重新连接SQL PLUS Worksheet,字符集乱码问题得到解决,显示正确的简体中文字符集。

    posted @ 2007-08-27 08:26 CharlieShen| 编辑 收藏


    概要:Oracle关系数据库系统以其卓越的性能获得了广泛的应用,而保证数据库的安全性是数据库管理工作的重要内容。本文是笔者在总结Oracle数据库安全管理工作的基础上,对Oracle数据库系统密码文件的创建、使用和维护作了详细的介绍,供大家参考。

    关键词:Oracle数据库 密码文件

    在Oracle数据库系统中,用户如果要以特权用户身份(INTERNAL/SYSDBA/SYSOPER)登录Oracle数据库可以有两种身份验证的方法:即使用与操作系统集成的身份验证或使用Oracle数据库的密码文件进行身份验证。因此,管理好密码文件,对于控制授权用户从远端或本机登录Oracle数据库系统,执行数据库管理工作,具有重要的意义。

    Oracle数据库的密码文件存放有超级用户INTERNAL/SYS的口令及其他特权用户的用户名/口令,它一般存放在ORACLE_HOME\DATABASE目录下。

    一、 密码文件的创建:

    在使用Oracle Instance Manager创建一数据库实例的时侯,在ORACLE_HOME\DATABASE目录下还自动创建了一个与之对应的密码文件,文件名为PWDSID.ORA,其中SID代表相应的Oracle数据库系统标识符。此密码文件是进行初始数据库管理工作的基础。在此之后,管理员也可以根据需要,使用工具ORAPWD.EXE手工创建密码文件,命令格式如下: C:\ >ORAPWD FILE=< FILENAME > PASSWORD
    =< PASSWORD > ENTRIES=< MAX_USERS >

    各命令参数的含义为:

    FILENAME:密码文件名;

    PASSWORD:设置INTERNAL/SYS帐号的口令;

    MAX_USERS:密码文件中可以存放的最大用户数,对应于允许以SYSDBA/SYSOPER权限登录数据库的最大用户数。由于在以后的维护中,若用户数超出了此限制,则需要重建密码文件,所以此参数可以根据需要设置得大一些。

    有了密码文件之后,需要设置初始化参数REMOTE_LOGIN_PASSWORDFILE来控制密码文件的使用状态。

    二、 设置初始化参数REMOTE_LOGIN_PASSWORDFILE:

    在Oracle数据库实例的初始化参数文件中,此参数控制着密码文件的使用及其状态。它可以有以下几个选项:

    NONE:指示Oracle系统不使用密码文件,特权用户的登录通过操作系统进行身份验证;

    EXCLUSIVE:指示只有一个数据库实例可以使用此密码文件。只有在此设置下的密码文件可以包含有除INTERNAL/SYS以外的用户信息,即允许将系统权限SYSOPER/SYSDBA授予除INTERNAL/SYS以外的其他用户。

    SHARED:指示可有多个数据库实例可以使用此密码文件。在此设置下只有INTERNAL/SYS帐号能被密码文件识别,即使文件中存有其他用户的信息,也不允许他们以SYSOPER/SYSDBA的权限登录。此设置为缺省值。

    ---- 在REMOTE_LOGIN_PASSWORDFILE参数设置为EXCLUSIVE、SHARED情况下,Oracle系统搜索密码文件的次序为:在系统注册库中查找ORA_SID_PWFILE参数值(它为密码文件的全路径名);若未找到,则查找ORA_PWFILE参数值;若仍未找到,则使用缺省值ORACLE_HOME\DATABASE\PWDSID.ORA;其中的SID代表相应的Oracle数据库系统标识符。

    下一页

    posted @ 2007-08-27 08:25 CharlieShen| 编辑 收藏


    1.having 子句的用法

    having 子句对 group by 子句所确定的行组进行控制,having 子句条件中只允许涉及常量,聚组函数或group by 子句中的列。

    2.外部联接"+"的用法

    外部联接"+"按其在"="的左边或右边分左联接和右联接.若不带"+"运算符的表中的一个行不直接匹配于带"+"预算符的表中的任何行,则前者的行与后者中的一个空行相匹配并被返回.若二者均不带’+’,则二者中无法匹配的均被返回.利用外部联接"+",可以替代效率十分低下的 not in 运算,大大提高运行速度.例如,下面这条命令执行起来很慢

    select a.empno from emp a where a.empno not in

    (select empno from emp1 where job=’SALE’);

    倘若利用外部联接,改写命令如下:

    select a.empno from emp a ,emp1 b

    where a.empno=b.empno(+)

    and b.empno is null

    and b.job=’SALE’;

    可以发现,运行速度明显提高。

    3.删除表内重复记录的方法

    可以利用这样的命令来删除表内重复记录:

    delete from table_name a

    where rowid< (select max(rowid) from table_name

    where column1=a.column1 and column2=a.column2

    and colum3=a.colum3 and ...);

    不过,当表比较大(例如50万条以上)时,这个方法的效率之差令人无法忍受,需要另想办法。

    4.set transaction 命令的用法

    在执行大事务时,有时oracle会报出如下的错误:

    ORA-01555:snapshot too old (rollback segment too small)

    这说明oracle给此事务随机分配的回滚段太小了,这时可以为它指定一个足够大的回滚段,以确保这个事务的成功执行.例如

    set transaction use rollback segment roll_abc;

    delete from table_name where ...

    commit;

    回滚段roll_abc被指定给这个delete事务,commit命令则在事务结束之后取消了回滚段的指定。

    5.使用索引的注意事项

    select,update,delete 语句中的子查询应当有规律地查找少于20%的表行.如果一个语句查找的行数超过总行数的20%,它将不能通过使用索引获得性能上的提高。

    索引可能产生碎片,因为记录从表中删除时,相应也从表的索引中删除。表释放的空间可以再用,而索引释放的空间却不能再用。频繁进行删除操作的被索引的表,应当阶段性地重建索引,以避免在索引中造成空间碎片,影响性能。在许可的条件下,也可以阶段性地truncate表,truncate命令删除表中所有记录,也删除索引碎片。

    6.数据库重建应注意的问题

    在利用import进行数据库重建过程中,有些视图可能会带来问题,因为结构输入的顺序可能造成视图的输入先于它低层次表的输入,这样建立视图就会失败.要解决这一问题,可采取分两步走的方法:首先输入结构,然后输入数据.命令举例如下 (uesrname:jfcl,password:hfjf,host sting:ora1,数据文件:expdata.dmp):

    imp jfcl/hfjf@ora1 file=empdata.dmp rows=N

    imp jfcl/hfjf@ora1 file=empdata.dmp full=Y buffer=64000

    commit=Y ignore=Y

    第一条命令输入所有数据库结构,但无记录。第二次输入结构和数据,64000字节提交一次。ignore=Y选项保证第二次输入既使对象存在的情况下也能成功。

    posted @ 2007-08-27 08:25 CharlieShen| 编辑 收藏

    在使用ORACLE的过程过,我们会经常遇到一些ORACLE产生的错误,对于初学者而言,这些错误可能有点模糊,而且可能一时不知怎么去处理产生的这些错误,本人就使用中出现比较频繁的错误代码一一做出分析,希望能够帮助你找到一个合理解决这些错误的方法,同时也希望你能够提出你的不同看法。毕竟作为一种交流的手段,个人意见难免过于偏颇,而且也必定存在着不足,出错之处在所难免。写这篇文章的目的就是想通过相互之间的交流共同促进,共同进步。

    ORA-01650:unable to extend rollback segment NAME by NUM intablespace NAME

    产生原因:上述ORACLE错误为回滚段表空间不足引起的,这也是ORACLE数据管理员最常见的ORACLE错误信息。当用户在做一个非常庞大的数据操作导致现有回滚段的不足,使可分配用的回滚段表空间已满,无法再进行分配,就会出现上述的错误。

    解决方式:使用“ALTER TABLESPACE tablespace_name ADD DATAFILE filename SIZE size_of_file”命令向指定的数据增加表空间,根据具体的情况可以增加一个或多个表空间。当然这与还与你主机上的裸盘设备有关,如果你主机的裸盘设备已经没有多余的使用空间,建议你不要轻意的增加回滚段表空间的大小,可使用下列的语句先查询一下剩余的tablespace空间有多少:

    Select user_name,sql_text from V$open_cursor where user_name=’’;

    如果多余的空间比较多,就可以适当追加一个大的回滚段给表空间使用,从而避免上述的错误。你也可以用以下语句来检测一下rollback segment的竞争状况:

    Select class,count from V$waitstat where calss in(‘system undo header’,’system undo block’,’undo header’,’undo block’);和

    Select sum(value) from V$sysstat where name in (‘db_block_gets’,’consistents gets’);

    如果任何一个class in count/sum(value)大于1%,就应该考虑增加rollback segment。

    相应的英文如下:

    Cause:Failed to allocate extent from the rollback segment in tablespace

    Action:Use the ALTER TABLESPACE ADD DATAFILE statement to add one or more files to the specified tablespace.

    ORA-01652:unable to extend temp segment by num in tablespace name

    产生原因:ORACLE临时段表空间不足,因为ORACLE总是尽量分配连续空间,一但没有足够的可分配空间或者分配不连续就会出现上述的现象。

    解决方法:我们知道由于ORACLE将表空间作为逻辑结构-单元,而表空间的物理结构是数据文件,数据文件在磁盘上物理地创建,表空间的所有对象也存在于磁盘上,为了给表空间增加空间,就必须增加数据文件。先查看一下指定表空间的可用空间,使用视图SYS.DBA_FREE_SPACE,视图中每条记录代表可用空间的碎片大小:

    SQL>Select file_id,block_id,blocks,bytes from sys.dba_free_space where tablespace_name=’’;

    返回的信息可初步确定可用空间的最大块,看一下它是否小于错误信息中提到的尺寸,再查看一下缺省的表空间参数:

    SQL>SELECT INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,PCT_INCREASE FROM SYS.DBA_TABLESPACES WHERE TABLESPACE_NAME=name;

    通过下面的SQL命令修改临时段表空间的缺省存储值:

    SQL>ALTER TABLESPACE name DEFAULT STORAGE

    posted @ 2007-08-27 08:24 CharlieShen| 编辑 收藏

    Oracle中的数据字典是数据库中的非常重要的一部分,提供了相关数据库的信息,它是所有Oracle用户(从应用的最终用户、应用的设计开发者到数据库管理员)的非常重要的信息来源。数据字典的创建,是在Oracle数据库创建完毕后,运行一些相关的数据库管理脚本来完成的。当采用Oracle统一安装器(Oracle Universal Installer)创建数据库时,Oracle服务器有关的字典视图和脚本最后会被自动安装。但当需要升级目前的Oracle数据库服务器时,数据库管理员必须要手工重新运行创建这些视图或脚本的SQL。安装完数据库后,Oracle数据库管理脚本就存放在操作系统中。对于UNIX和NT操作系统,分别位于不同的物理目录下,见表1所示:

    操作系统 脚本目录位置
    UNIX $ORACLE_HOME/rdbms/admin
    NT %ORACLE_HOME%\rdbms\admin

    表1 数据库管理脚本在操作系统中的物理位置

    Oracle中几乎所有的系统管理脚本都保存在该文件目录下,该目录下含有上百个不同文件。这些不同的文件都有什么作用呢?本文将详细讨论组成Oracle数据库管理脚本的命名规范。这样用户看到某个文件大概就可以知道该文件主要用途是什么。该目录下的文件按照功能不同可分为4大类,Oracle为了容易区分这几类不同的文件,对于文件的命名遵从一定的规则。见表2所示。

    命名规则 功能描述
    cat*.sql 关于目录和数据字典信息
    dbms*.sql 数据库中关于包的说明
    prvt*.plb 加密过的包代码
    utl*.sql 数据库其他功能的表和视图

    表2 数据库管理脚本命名规范

    下面来详细介绍这四种不同类型的脚本功能:

    1、cat*.sql 脚本

    该类脚本主要用于创建数据字典视图。其中,脚本catalog.sql 和 catproc.sql 是创建数据库后必须要运行的两个脚本。这两个脚本的功能说明见表3所示。

    脚本 脚本说明
    catalog.sql 创建系统常用的数据字典视图和同义词
    catproc.sql 运行服务器端所需要的PL/SQL脚本

    (1) catalog.sql

    该脚本创建相对于系统基表的视图和系统动态性能视图以及他们的同义词。该脚本又同时运行创建其他对象的脚本,主要有:

    基本PL/SQL环境,包括PL/SQL的声明:

    - 数据类型

    - 预定义例外

    - 内建的过程和函数

    - SQL操作等

    审计

    导入/导出

    SQL*Loader

    安装选项

    (2)catproc.sql

    该脚本主要用于建立PL/SQL功能的使用环境。此外,还创建几个PL/SQL包用于扩展RDBMS功能。该脚本同时还为下面的一些RDBMS功能创建另外的一些包和视图:

    警告(Alerts)

    管道(Pipes)

    日志分析(LogMiner)

    大对象(Large objects)

    对象(Objects)

    高级队列(Advanced queuing)

    复制选项( Replication option)

    其他的一些内建包和选项(Other built-ins and options)

    (3)其他脚本

    在该目录下还有其他一些脚本用来扩展Oracle数据库服务器功能。如,catadt.sql 脚本用来创建RDBMS中用来显示兆数据信息的数据字典视图。catnoadt.sql 脚本用来删除这些表和视图。

    2、dbms*.sql 和 prvt*.plb 脚本

    这两类脚本用来创建扩展Oracle服务器功能的系统预定义的一些Oracle包的对象。这些程序均用来完成数据库管理任务。大多数的SQL脚本在运行catproc.sql脚本时被执行。一些额外的脚本必须由数据库管理员另外单独执行。例如,dbmspool.sql 脚本,用来显示在共享池中对象的大小并且为了减少共享池碎块可以将其在SGA中标记为保持或可删除。

    3、utl*.sql 脚本

    该类脚本只有在数据库需要另外的视图和表时才需要运行。例如,脚本utlxplan.sql,用来创建一个表,该表用于观察SQL语句的运行计划(Execution Plan)。

    需要注意的是,绝大多数数据库管理脚本都必须在用户SYS下运行。数据库管理员如果打算运行这些脚本,最好首先阅读脚本内容中的相关信息,了解应该以什么用户来运行这些脚本。

    posted @ 2007-08-27 08:24 CharlieShen| 编辑 收藏

    Oracle中表的外键是保证系统参照完整性的手段,而参照完整性是指分布在两个表中的列所满足的具有主从性质的约束关系。外键涉及到两个表,其中一个称之为父项表,另一个称之为子项表。

    父项表(parent table)是参照约束的基础,即通过检查这张表的有效数据情况来判断约束是否成立,它是参照约束的条件,影响约束,而不受约束的任何影响。

    子项表(child table)是参照约束的对象,当其发生变化,如有新数据输入时,通过比较父项表中的有效数据状况,来判断这些变化是否符合约束条件,若不符合,则拒绝要发生的变化。

    在实际应用系统中,开发者为了保证系统的完整性,一般要定义大量的外键。然而,如果外键的命名不规范,如采用系统自动生成的名称,则在以后的系统运行维护中会造成很大的麻烦。如在系统运行后,加载大量数据或者进行一些数据转换操作等时,出现外键错误时,根据系统提示的外键错误,根本不可能直接定位到那两个表间的外键发生错误,需要浪费很多时间查找造成错误发生的外键的父项表和子项表,然后才能进一步确定是那条记录违反了外键约束条件。通常,我们采用这样的命名规则来命名外键FK_Child_table name_Parent_table name。由于外键名称的最大长度限制在30个字符之内,对child_table_name和Parent_table name不一定和原表一模一样,可以采取一些简写的办法,但名称一定要能反映出约束的两个表。这里的命名,Child_table name指子项表,也就是约束表,Parent_table name是指父项表,也就是被约束的表。

    下面来详细讨论如何将应用系统中不规范的外键命名修改为规范的外键名称。在讨论之前,需要提醒读者注意的是,完成下面的操作需要花费较长的时间,所以一定要规划在系统空闲时来完成。同时这里的外键更名,采用的方法是首先删除然后重建,涉及到删除应用系统对象的操作,所以在操作之前,为安全起见,应该备份应用系统。

    posted @ 2007-08-27 08:23 CharlieShen| 编辑 收藏

    相信为数不少的系统管理员每天都在做着同一样的工作——对数据进行备份。一旦哪一天疏忽了,而这一天系统又恰恰发生了故障,需要进行数据恢复,那么此时就无能为力了。假如每天设定一个固定的时间,系统自动进行备份,那该多好啊!下面笔者结合实践经验,谈一谈UNIX环境下Oracle数据库的自动备份,以起到抛砖引玉的作用。

    我们计划让数据库在晚上23点做export导出备份,在凌晨2点将备份文件拷贝到磁带上,在凌晨4点将备份文件拷贝到另一台UNIX机器上,为此我们可进行如下操作:

    一、导出数据库

    export命令将数据库中的数据备份成一个二进制文件,它通常有三种模式:用户模式、表模式和整个数据库模式。本文拟采用用户模式,备份之前,应先建立一个备份目录,以容纳备份文件,比如可建一个/backup目录。接着我们可在UNIX的Oracle目录下(也可以是其它目录)分别建立两个文件ora—backup,tar—backup。需要说明的是,前一个文件需要对Oracle的参数进行初始化,为了方便起见,我们不妨将初始化命令放到一个文件中(文件名姑且定为ora—env),再由第一个文件调用它。

    1. ora—env文件对Oracle的参数进行初始化,其内容如下:

      ORACLE—HOME=$ORACLE—HOME;export ORACLE—HOME
      ORACLE—SID=ora73;export ORACLE—SID
      ORACLE—TERM=sun;export ORACLE—TERM
      LD—LIBRARY—PATH=$ORACLE—HOME/lib;export LD—LIBRARY—PATH
      ORA—NLS32=$ORACLE—HOME/ocommon/nls/admin/data;export ORA—NLS
      PATH=.:/usr/ccs/bin:/usr/ucb:$ORACLE—HOME/bin:$PATH;export PATH
      DISPLAY=host1:0;export DISPLAY
      NLS—LANG=american—america.zhs16cgb231280;export NLS—LANG

    2. ora—backup文件对数据库做export导出,导出的文件名可以任意定,本文定为字母“xx”加当天日期,即假如当天日期是12月10号,则导出的文件名为“xx1210.dmp”,以区别于其它日期的备份文件。

    posted @ 2007-08-27 08:23 CharlieShen| 编辑 收藏

    一、增强的可扩展性

    Oracle9i Real Application Clusters是Oracle的下一代并行服务器系列产品。Oracle9i Real Application Clusters针对访问相同数据而设计了快捷高效的共享集群高速缓冲寄存器,从而提供了透明的应用程序可扩展性。Oracle9i Real Application Clusters是五年多研发工作的结晶,其中包含了9项独家专利和18项已申报的专利请求。

    Oracle9i Real Application Clusters独特之处在于:

    “开箱即用”,近线性的透明缩放

    与其它程序的良好兼容性,无需重新设计

    快速增长的集群,可快速增添节点和磁盘

    二、为什么你需要灵活的数据分区 Flexible Data Partitioning

    数据服务器管理、坏系统的恢复及低效率应用所带来的花费常常是惊人的。采用数据分区维护大数据存储将会使这些费用降低。

    数据分区是通过将大的数据分割成较小的易于管理的部分,从而降低成本。但是一些数据服务器在增加了这一功能时却多分区的数据进行了限定,限制了你的业务发展。

    Oracle没有任何这种数据大小的限制。

    其它数据服务器虽然提供了分区,但仅提供了有限的数据分区方法。Oracle的分区( Partitioning Option)方式有 hash, range和composite 多种。这种灵活的分区方式好处是:

    目标准确的数据服务器管理

    高可用性

    应用性能提高

    由于结构的限制,多数服务器的分区导致为提高性能以牺牲目标准确的数据服务器管理和高可用性为代价。 你必须在它们之间作出选择。Oracle的composite 分区方法则消除了这种情况。

    采用Oracle的分区,数据的存储、管理、访问和备份都完全按你的业务要求。例如许多公司喜欢按日期分区 ,当数据到达一定的日期后,数据就不能再被查询。Oracle的Range 分区使过期的分区,仍然可被查询。

    Oracle的分区显著地改进了数据的可用性。单一分区可被单独离线,不影响其它数据运行。查询永远是在所有分区正常的情况下才进行。 Oracle决不会提供不完整的查询结果。

    三、为什么你需要非递增的行级锁( Non-Escalating Row-Level Locking)?

    在今天的在线世界,许多客户就是不愿意等待。

    数据记录的访问能力是你业务的关键所在。但是数据访问能力、时间限制及业务记录的准确性需要相互妥协的,这是由于你的事务处理系统的原因。

    当一个员工修改信息时,数据服务器会锁住这一信息直到操作完成。在这一期间其他人都不可更改被锁住的信息。锁定信息直至一个变化完成被成为数据锁定。这是所有事务处理系统的基本功能。

    许多服务器甚至阻止员工读取锁定的数据,这造成了一些不必要的业务延误。

    表面上,多数数据服务器好象只提供行级锁,仅锁住那些工作中的数据行。事实上,多数数据服务器锁住的数据远不只这些。服务器是使用内存跟踪锁定的信息,这意味着它们只能跟踪到有限的细节。 随着系统活动水平的提高,这些服务器开始锁住更大面积的信息用于管理内存的使用。

    由于锁的递增,用户必须等候其他用户的任务执行后,即使等候完成的可能是完全不同的一条信息。

    Oracle则通过采用非递增行级锁(non-escalating row-level locking)消除了这一困难。

    Oracle数据服务器永远是只锁住正在更新中的数据行。 其它数据行不会受到影响。 Oracle并不使用计算机的内存跟踪锁定信息。这使Oracle可锁住的行数没有限制,所有员工都可同时更新数据,不会延误业务。

    四、Oralce Clickstream Intelligence

    作为Oracle9i Application Sever的一个组件,Oralce Clickstream Intelligence是现成的应用程序,它能分析网站数据和企业数据以提高网站效率和用户忠诚度。为此,Oralce 智能点击流利用Oracle仓库开发工具的开放数据模型来提供一个预先建立的、公开的数据集,并使用Oracle的门户框架提供一套预先建立的报表。可以扩充先建的报表,也可以增加新的报表。

    借助于Oracle 堆栈的力量,系统能够快速合并和分析大量数据,提供额外的反映次数,并在用户定制的、通过浏览器访问的门户中公布结果。

    借助于Oracle Warehouse Builder的“公用仓库元模型”(CWM)标准,Oralce Clickstream Intelligence能够合并Oracle和其它对应CWM储存库中的数据。这种开放性能够使您从客户关系管理(CRM)和企业资源规划(ERP)系统中提取数据。您能追踪营销活动、网站销售和用户的忠诚度。使用已格式化的报表,能够在你的Oracle商业智能门户网站中自动发布结果,并且你能使用Oracle 商业智能(BI)工具定制和增加新的报表。

    Oralce Clickstream Intelligence能够满足电子商务的苛刻要求,包括快速实施,可伸缩性,可操作性,可用性和可管理性。

    posted @ 2007-08-27 08:22 CharlieShen| 编辑 收藏


    体系结构

    Microsoft按照客户/服务器体系结构的分布进行操作。这种方法产生不必要的代价和复杂性。在Internet中,Oracle已经发现了一个较好的答案。在Internet Computing的多层(multi-tiered)体系结构中,集中(centralization)可以简化应用的部署和维护,数据的管理和备份,并向客户提供了高级的性能、安全性与可靠性——结果使总的操作成本更低。Oracle具有使所有数据和文档存储在少数几个高性能数据库的能力,这种能力使客户可以集中管理他们所有的数据,并且信息管理和访问更加容易、可靠且价格更加便宜。

    开放(openness)

    SQL Server只在Windows上运行,MicroSoft这种专有策略的目标是将客户锁定到Windows环境中,限制客户通过选择一个开放的基于标准的解决方案来获取革新和价格竞争带来的好处。此外,人们也都知道,Windows平台本身的可靠性、安全性和可伸缩性也是有限的。 Oracle能在所有主要的平台(其中包括Windows)上运行,并且完全支持所有的工业标准,所以,客户可以利用很多种第三方应用程序、工具、网关和管理实用程序。Oracle采用开放策略,它使得客户可以选择一种最适合他们特定需要的解决方案。利用Oracle8i,操作系统实质上将变得无关紧要。Oracle8i的Internet文件系统(iFS)是一种突破,这种突破性给所有数据类型提供了一种易于使用的数据管理接口,这样减少了客户对Windows之类的专用操作系统的依赖。

    可伸缩性

    由于SQLServer7.0的并行实施和共存模型并不成熟,这使得人们更加关心该产品处理日益增多的用户数和数据卷(volumes)的能力。Oracle在下列两个方面提供了一个优越的可伸缩性:

    簇:Oracle并行服务器通过使一组节点共享同一簇中的工作负载来扩展Windows NT的能力,Oracle提供具有高可用性和高伸缩性的簇解决方案,而Microsoft只提供克服错误的簇。根据Gartner Group的一份报告(10/97),Microsoft在2001年以前将不会有一个可伸缩的簇解决方案。 Oracle自从1997年以来就已经有这种能力。

    伸缩到其他操作系统:因为Oracle是一个开放的解决方案,客户可以从他们的系统移到Unix或另一个操作系统,当Windows NT不能满足他们的需要。SQL Server与单个平台的结合意味着,当一个客户达到Windows NT的限制时,除了放弃他们的系统并移到一个新平台上的一个新数据库以外——一个最能节省时间和金钱的建议,他们再也没有其他选择。

    安全性

    由于Internet的出现而带来的全球数据访问也同时增加了潜在的安全危险。对于数据库的安全要求决不会比以前更高,而SQL Server7.0还没有获得任何类型的安全证书。相比之下,Oracle是唯一获得最高认证级别的ISO标准认证的数据库。Oracle高级的安全特性考虑了强制实施的细小权限,先进的审查,增强的访问控制,安全的分布是处理与复制,以及使用附加的外部签发机制的能力。SQL Server7.0没有这些特性。利用Oracle产品,企业可以将真正集成的安全机制廉价地迁入到业务系统中。

    posted @ 2007-08-27 08:21 CharlieShen| 编辑 收藏


    硬件平台:SUN Ultra Enterprise 3000
      操作系统:Solaris 2.5(中文简体)
      磁盘:4.2GB
      内存:256MB
      ORACLE B版本:7.3.2.1
      安装目录:/database/oracle(/database下有2GB空间)
      安装产品:ORACLE RDBMS,SQL*NET,SQL*Plus,Pro *C,Server Manager等
      产品安装正常,运行稳定。

    二、应用开发中常见问题及排除

    ORACLE数据库在应用开发过程中,经常会遇到以下两个问题:

    1、使用Shutdown命令不能关闭数据库;

    2、Client端经常无故发生死机现象。

    问题1的排除:只要正确使用命令开启和关闭数据库(只有Internal用户有此权),问题1的出现,是由于数据库有未提交事务,此时可用Shutdown Abort命令关闭数据库,但是所有未提交事务将被废弃。

    问题2的排除:⑴此时可在Server端使用Platinum EP M产品确认问题所在。使用EMP可以监控系统的运行,当Cl ient端发生死机时,监控DML LOCK的使用会发现,用户由于误操作,造成此用户在数据库中发生死锁,引起Client 端死机。经确定进程号后,到ORACLE用户下,使用‘KILL -9进程号’命令,即可释放死锁,解决Client端死机问题。

    例如用户在发出Update、Delete命令语句后,接着进行Select,此时这个用户就会发生死锁。

    ⑵在应用软件开发过程中?会由于应用软件中存在某些BUG问题引起Client端死机。此时可借助数据字典和数据库基表进行查找,主要针对数据库中数据特点及数据库基表的约束条件进行核对以尽快找到问题所在,而和数据库的性能没有关系;当然也可在Server端使用EPM,监控某一用户当前正在执行的SQL语句,以便找到问题的所在。

    例如用户数据表加入数据后,运行应用程序时,提示DUP-VALUE-IN-INDEX等类似错误信息时,就是因为数据基表的Primary Key的数据字段选择有误,造成不应加入的数据加入到数据库,使应用程序发生死机。此时可通过修改基表,删除错误数据,即可解决问题。

    posted @ 2007-08-27 08:21 CharlieShen| 编辑 收藏

    到现在为止,已经学习了大部分的内容,这里将开 始外围知识的学习。也就是说,将要开始学习SQL Server以外的知识。这里并不是说后面将要介绍的内容是RDBMS系统以外的内容,而是并不需要这些知识来构成SQL的功能。毕竟,SQL Server包含的内容太多,很难把所有的内容都压缩到一本书中进行介绍。

    本章将从介绍这些额外内容的背景开始,接着将介 绍SQL Server支持XML的一些特性。这里的问题在于XML是完全独立的内容,它和到现在为止接触的关系系统有着很大的区别。为什么SQL Server要包含这么多的功能来支持它呢?简要的回答是,随着数据仓库的出现,对数据来说,XML可能最为重要。

    XML的出现已经有好几年,但是由于争议比较大,它的实际应用没有达到应有的程度。大约从2000年开始,XML的应用范围越来越广,它将作为一种使实时数据更新服务(data feed)以及大小合理的数据文档可用的通用方式。XML提供了数据自描述的方法——也就是说,可以定义与XML文档一起的类型和确认信息,这样不论用户是谁(即使他们连如何连接SQL Server都不知道),他们都能够理解该数据的规则。

    XML通常不是存储数据的好地方,但它确实是使得数据有用的一种引人注目的方式——同样地,使用XML的方法也在不断地发展。

    综上所述,本章将学习以下的内容:

    ●       XML的概念

    ●       其他与XML紧密相连的技术

    提示:

    前面提到过 XML通常并不是存储数据的好办法,但这也有例外情况。XML用作存储数据的一种方式是出于归档的目的。XML压缩的能力非常好,它使用一种非常开放的格 式,这样可以很好地理解这种格式。这里将用SQL Server 2005的备份功能作一下比较。十年以前,当您需要恢复一些旧的数据来回顾归档信息时,可能还没有安装SQL Server来处理这些旧的备份文件,但是很奇怪您可能会有解压缩(假设使用主流的压缩库如ZIP)以及阅读数据的工具。对于这些深入的归档来说,它们很 有用。

    16.1  XML基础

    有关XML的书籍已经很多(例如,Wrox出版社的Professional XML, 由Birbeck等人编写)。因为这本书的内容已经很完整,所以此处不会再添加有关XML本身的很多信息,而是假设您已经了解了XML的一些内容。但是, 我也知道即使XML近些年来成为了主流,还是有很多数据库人员认为XML“只是一项Web技术而已”,因此,他们没有花时间学过这方面的知识,而他们这样 的想法也是大错特错。

    首先,XML是一项信息技术。它不是Web特有的技术。相反,由于以下的原因,可能会把XML误认为是Web特有的技术(通常是那些不理解XML的人们):

    ●       XML是一种标记(mark up)语言,看上去和HTML很相似。

    ●       XML通常很容易转换为HTML。同样地,它也成为了保存页面的信息部分、根据请求最终转换成HTML的流行方法——可以根据标准(例如哪种浏览器正在请求信息)发生单独的转换。

    ●       Microsoft的Internet Explorer是第一个广泛使用的支持XML的产品。

    ●       Internet经常是用作交换信息的方式,XML也很理想地适合这么做。

    和HTML一样,XML是基于文本的标记语言。 它们的确继承于同一种语言,称为SGML。SGML存在的时间比Internet(至少是我们现在所认为的Internet)更为久远,并且用于印刷工业 或者用于政府相关的文档中。SGML中的“S”表示的意思并不简单——SGML很直观,但是并不清楚易学(我只能读懂所看过的35%的SGML文档。然 而,在阅读任何SGML时,我却肯定会感到不舒服)。而另一方面,XML更易于理解。

    所以,您可能会问:“从哪里能得到XML标记的 列表呢?”这样的问题。答案是得不到这样的列表——至少和您想像中的答案不一样。XML只有很少的一些标记是它本身语言的一部分。而它能提供自定义的标记 以及使用由其他人(例如本章前面提及的产业集团)定义的标记的方法。XML在很大程度上和灵活性有关——它包含了通过使用XML模式文档或者以前的文档类 型定义(Document Type Definition)来为XML设定规则。

    XML文档之所以成为XML是因为它有很少的规 则。这里的关系在于它必须是所谓的良好格式。后面将简要介绍良好格式的概念。仅仅因为XML文档满足良好格式的标准不能说明它有效。有效的XML文档不仅 是良好格式的,而且不能违反XML模式或文档引用的DTD加在其上的任何限制。本章后面将简单地介绍DTD和XML模式的内容。

    也可以对XML进行转换。这里的意思是指可以很 容易地把XML转换成完全不同的XML表示或者甚至是非XML的格式。最为常见的应用是把XML转换成为HTML供Web使用。这种转换需要将HTML和 XML进行比较并对照。简单地说,XML和信息有关,而HTML和表示有关。

    XML中存储的信息通过使用元素 (element)和属性(attribute)来表示。元素通常通过使用开始和结束标记(会有例外情况,后面将会介绍)来创建,并且用一个区分大小写的 名称来标识(不允许有空格)。属性是进一步描述元素的项,并且嵌入到元素的开始标记内。属性值必须在匹配的单引号或双引号内。

    16.1.1  XML文档的各个组成部分

    这里已经介绍了一些名称,它们是有意义的,但在开始深入介绍之前,我们先停下来学习一些术语,当谈及XML文档的时候将用到这些术语。

    这里真正要做的是提供可能会碰到的XML文档中所有重要部分的列表,如图16-1所示。其中许多文档部分是可选的,而另一些则不是。在某些情况下,其中的一项必须以另一项为前提。在其他的情况下,文档的一些部分和其他部分相对独立。

    图  16-1

    这里采用的是层次结构的方法(某些内容内部的内容将列在其所属内容之后),这样做很有意义,因为在给定的XML文档中将会顺序地碰到它们。

    1. 文档(Document)

    文档包含从第一个字符到最后一个字符的所有内容。当引用一个XML文档时,引用的既是结构,又是该特定XML文档中的内容。

    2. 声明(Declaration)

    从技术上说,声明是可选的,但是从实际应用来说,通常要包含它。如果它存在,那么它必须在文档中最先出现。在声明之前不能出现其他内容,甚至是空白处(空格、回车、制表符)。

    声明通过问号(表示这个标记是预处理指令)以及xml名称的特殊标记创建:

    <?xml version="1.0"?>

    声明有一个必需的属性(该属性进一步描述元素)——版本号(version)。在前面的示例中,已经声明了这是XML文档,并且它遵循XML规范的1.0标准。

    声明可以有额外的属性——这个属性称为 encoding,它描述了这个XML文档使用的字符集的特性。XML可以处理一些不同的字符集,最重要的是UTF-16和UTF-8。UTF-16本质 上是Unicode规范,它是16位的编码规范,适用于当今世界大多数使用的字符。默认的编码方法是UTF-8,它与以前的ASCII规范兼容。完整的声 明如下:

    <?xml version='1.0' encoding='UTF-8'?>

    提示:

    规范严格禁止使用以字母xml开始的元素—— 保留它们以供将来语言的扩充。

    3. 元素(Element)

    元素用作保存描述信息——它可以是任何内容。元素会为描述信息定义一个清楚的开始和结束点。通常,元素存在于一个配对的开始和结束的标记中。然而,开始标记可以自结束——基本上可以定义成为空元素。

    XML元素的结构和HTML标记的结构很相似。开始标记以左尖括号(<)开始,包含名称以及可能的属性,最后以右尖括号(>)结束:

    <ATagForANormalElement >

    这个规则的一个例外是该元素可以自结束,这种情况是在结束标记的右尖括号之前有一个“/”:

    <AselfClosingElement/>

    结束标记和开始标记很相似(区分大小写),但要在需要结束的元素名称前以一个斜线(/)开始:

    <ATagForANormalElement > <== Opening Tag

    Some data or whatever can go in here.

    We're still going strong with our data.

    </ATagForANormalElement > <== Closing Tag

    元素也可以包含属性(稍后将介绍)作为元素的开始标记(但不是结束标记)的一部分。最后,元素可以包含其他的元素,但是在结束外层元素之前必须先结束内层的元素:

    <OuterElement>

    <InnerElement>

    </InnerElement>

    </OuterElement>

    当要介绍良好格式的概念时,将回来介绍这些元素。

    4. 节点

    当您指定组成XML文档的层次结构时,它以熟悉的树结构模型结束,在任何层次结构关系中会碰到该模型,如图16-2所示,树中的每个交集点称为节点。

    图  16-2

    XML文档的内容可以通过基于节点层次以及特定节点的属性值和元素值导航。

    “根”节点

    可能XML文档中最容易混淆的地方在于所谓的 “根节点”。每一个XML文档都必须有一个(不多不少)根节点。根节点是包含文档中其他元素(如果有其他元素)的节点。可以把根节点想像成把其下面的所有 节点结合在一起并且在任何特定XML文档的作用域内为它们提供结构的统一节点。那么,会发生混淆的地方在何处呢?混淆的情况通常会分为两种:人们不知道需 要有一个根节点(现在您知道了),以及他们不能理解根节点命名的方式(稍后将会介绍)。

    因为通常的说法是“必须有一个根节点”,所以人 们通常把它理解为必须有一个节点称为root。的确,您可能会偶尔发现XML文档确实有一个根节点命名为Root(或root或ROOT)。但是现实的情 况是,根节点和其他任何元素一样,都遵循相同的命名模式,除了一点例外——名称在文档中必须唯一。也就是说,整个文档中,其他的元素不可以和根节点有相同 的名称。

    注意:

    根节点的存在是XML文档和XML片段的一个重要区别。通常,当从SQL Server中提取某些内容时,只能提取整个文档中的XML的一小部分,此处称之为XML片段。因为XML片段并不是整个文档,所以并不期望这些片段有根节点。

    5. 属性(Attribute)

    属性存在于元素的上下文中。对它们的实现是描述元素的更进一步的方式,属性放置在元素的开始标记的边界范围内:

    <SomeElement MyFirstAttribute="Hi There" MySecondAttribute="25">

    Optionally, some other XML

    </SomeElement>

    无论属性值是何种信息的数据类型,必须用单引号或双引号包含属性值。

    提示:

    默认情况下,XML文档没有数据类型的概念。本章的后面将介绍描述单文档应用程序规则的方法。到那时,可以看到保证数据类型的一些方法——为其设置规则,而XML自己不会这么做。

    6. 没有缺点——良好格式

    定义XML如何组织的规则——也就是说,可以使用何种元素、定义元素的方法、元素所拥有的部分——这些都是关于XML文档是否是良好格式的规则。

    事实上,所有基于SGML的语言都有良好格式的概念。甚至是HTML也有一些良好格式的概念——这在很大程度上是因为HTML更为宽容,并且浏览器能够忽略许多错误。

    如果熟悉HTML语法,那么您已经了解了一些基于标记语言的晦涩内容。XML有着更为严格的一些规则。简要的解释如下:

    ●       每一个XML文档必须有唯一的“根”节点。

    ●       每一个标记都必须有匹配的(区分大小写)结束标记,除非开始标记自结束。

    ●       标记不能跨越其他标记。

    ●       除非是XML分析器识别的字符,否则不能使用限制的字符。如果需要表示任何特殊的字符,那么需要使用转义序列(它会转换所请求的字符)。

    下面是一个良好格式的文档的示例:

    <?xml version="1.0" encoding="UTF-8"?>

    <ThisCouldBeCalledAnything>

    <AnElement>

    <AnotherElement AnAttribute="Some Value">

    <AselfClosingElement AnAttributeThatNeedsASpecialCharacter="

    Fred&quot;s

    Flicks"/>

    </AnotherElement>

    </AnElement>

    </ThisCouldBeCalledAnything>

    提示:

    这里的声明不需要一个结束标记。这是因为声明是预处理指令,而不是元素。从本质上讲,它告诉XML分析器在其开始真正处理XML业务之前需要知道的内容。

    这是关于XML文档是良好格式的一个非常简短的示例,但是它很好地概括了本书中介绍的XML有限范围内的基础内容。

    提示:

    理解这些概念对于理解下一章的内容(至少是理解)很重要。下面介绍的示例会加强您的理解,但是如果看过XML示例还是觉得混淆,那么可以再学习一下上面的示例或者参考Professional XML或其他XML的书籍。在学习本章最后的样式和模式问题之前,必须理解这些问题。

    7. XML示例

    如果有什么主题贯穿于本书,那么就是本书会用示例来解释内容。前面提到过,本书不是关于XML的书籍,所以这里不准备先介绍示例,而是先来看一下谈论的话题。

    在本章剩下来的部分以及下一章中,您将发现如果 您有一些XML编辑工具,那么一切将会变得简单很多。因为XML是基于文本的,所以可以在记事本中简单地打开并编辑XML文档——问题在于不能获得任何错 误的检测。那么如何知道该文档是良好格式的呢?如果文档只有几行,可以大致地看一下,但如果是完整的文档或是XSL文档,那么检测会变得困难。

    提示:

    作为边注,可以在Microsoft的Internet Explorer中打开文档来执行一个快速的检测,检测XML是否是良好格式。如果文档不是良好格式,那么它会报告错误。

    作为示例,将介绍Northwind中数据的XML表示。在本例中,将看到一些订单的信息。下面将首先介绍一些内容,然后在此基础上深入介绍。

    首先,对于任何XML文档来说都需要一个根节点。可以对根节点进行任意的命名,只要该名称在文档中唯一。一种常见的解决方法是命名该根节点为root。另外一个常见的方法是把它命名成为该特殊XML文档所表示的内容。

    这里开始介绍一个简单的示例,它只使用根节点:

    <root>

    </root>

    我们如此迅速地就创建了第一个良好格式的XML文档。注意它没有包含前面介绍的<?xml>标记。这里可以把它加进去,但它只是一个可选项。与该标记相关的唯一的限制是,它必须在最前面。为了最佳实践和清楚明了,这里增加了这个选项:

    <?xml version="1.0" encoding="UTF-8"?>

    <root>

    </root>

    事实上,根据XML的规则,任何以<?xml>开始的标记都是保留的标记——也就是说,不能命名该标记,因为当发布xml的新版本时,它们是保留给W3C现在和将来的使用。

    这里已经有了第一个良好格式的XML文档。遗憾的是,该文档太简单——它不能说明任何内容。对于本例来说,想要描述订单的信息,所以需要向其中加入一些描述订单的信息。这里以Order标记作为开始:

    <?xml version="1.0" encoding="UTF-8"?>

    <root>

    <Order/>

    </root>

    这看上去没什么变化,不是吗?现在知道,该XML文档中已经有了一个订单,但是还没有关于它的任何信息。这里通过添加一些属性来扩展它:

    <?xml version="1.0" encoding="UTF-8"?>

    <root>

    <Order CustomerID="ALFKI" OrderID="10643" OrderDate=

    "1997-08-25T00:00:00" />

    </root>

    这里并没有用到什么高深的知识,可以理解订单的基本内容:

    ●       客户的ID号是ALFKI

    ●       订单ID号是10643

    ●       订单日期是1997年8月25日

    基本上,它和SQL Server中Northwind数据库的Orders表中的一行记录等价。如果客户有多个订单,则会有如下所示的记录:

    <?xml version="1.0" encoding="UTF-8"?>

    <root>

    <Order CustomerID="ALFKI" OrderID="10643" OrderDate=

    "1997-08-25T00:00:00" />

    <Order CustomerID="ALFKI" OrderID="10692" OrderDate=

    "1997-10-03T00:00:00" />

    <Order CustomerID="ALFKI" OrderID="10702" OrderDate=

    "1997-10-13T00:00:00" />

    <Order CustomerID="ALFKI" OrderID="10835" OrderDate=

    "1998-01-15T00:00:00" />

    </root>

    虽然这是一个合法的而且良好格式的XML文档, 但是它并不能真正地表示期望的数据的层次结构。在本例中,想要有一定区别地创建该XML,并且表示如下概念:客户通常在该层次结构链中的更高层(它们是订 单的父节点)。可以通过修改表示客户的方法来表示这种层次结构。这里使客户成为一个元素,而不是一个属性——它将包含自己的属性——而在客户元素的内部包 含这个特定的客户订单:

    <?xml version="1.0" encoding="UTF-8"?>

    <root>

    <Customer CustomerID="ALFKI" CompanyName="Alfreds Futterkiste">

    <Order OrderID="10643" OrderDate="1997-08-25T00:00:00" />

    <Order OrderID="10692" OrderDate="1997-10-03T00:00:00" />

    <Order OrderID="10702" OrderDate="1997-10-13T00:00:00" />

    <Order OrderID="10835" OrderDate="1998-01-15T00:00:00" />

    </Customer>

    </root>

    如果有多位客户,那么也不会有问题——这里只要再添加另一个客户节点即可:

    <?xml version="1.0" encoding="UTF-8"?>

    <root>

    <Customer CustomerID="ALFKI" CompanyName="Alfreds Futterkiste">

    <Order OrderID="10643" OrderDate="1997-08-25T00:00:00" />

    <Order OrderID="10692" OrderDate="1997-10-03T00:00:00" />

    <Order OrderID="10702" OrderDate="1997-10-13T00:00:00" />

    <Order OrderID="10835" OrderDate="1998-01-15T00:00:00" />

    </Customer>

    <Customer CustomerID="ANTON" CompanyName="Antonio Moreno Taquería">

    <Order OrderID="10365" OrderDate="1996-11-27T00:00:00" />

    <Order OrderID="10507" OrderDate="1997-04-15T00:00:00" />

    <Order OrderID="10535" OrderDate="1997-05-13T00:00:00" />

    <Order OrderID="10573" OrderDate="1997-06-19T00:00:00" />

    </Customer>

    </root>

    的确,这可以进入到无限的层次中(当然也服从于分析器可以处理)。例如,可以在订单中添加一个层次放置订单中的单个行式项。

    8. 确定元素与属性

    这里首先要理解,没有什么确定的而且快速的规则可以决定是元素还是属性。属性描述了元素的特性。子元素——或者元素的子节点有着同样的效果。那么,如何决定具体的属性呢?为什么属性是必需的?和现实中的大多数事情一样,这是平衡行为的内容。

    属性在其值是一对一关系以及它是元素的继承部分时很有意义。例如,在Northwind中,每一个客户ID只有一个公司名称——这对于属性来说是理想的情况。当把关系数据转换为XML的时候,表中的列会成为元素的一个属性,该元素直接和表中的行相关。

    元素在元素自身和描述该元素的内容之间有一对多 关系时更有意义。在本章前面的示例中,对每一个客户会有多个订单。从技术上说,可以使每一个订单成为客户元素的属性,但是需要一次又一次地重复许多的客户 信息。同样地,如果Northwind数据库允许客户有别名(多个名称)的概念,那么可以在客户下面有“名称”元素,它的属性用来描述单个名称的实例。

    提示:

    不管如何选择,您需要坚持本书中多次强调的规则——前后一致。当在某处把给定的某个性质定义为属性时,在其他地方需要使它保持为属性,除非它的性质和在新位置中使用的性质有所不同。再提醒一次:前后一致。

    16.1.2  命名空间

    虽然有创建自己的标签、从其他来源混合和匹配数 据以及自己定义处理的自由,但是总会碰到在何处使用何种名称的冲突。例如,对于为库构建的应用程序来说,和另一个用来描述字体的(可能用它来描述字符集和 一系列字形之间的关联)应用程序相比,名为letter(对于某些人来说,信件(letter)是一个人写给另一个人的文档)的元素可能会有完全不同的结 构、规则以及含义。

    为了进一步说明该示例,XML的性质是,世界上 的行业组织都在逐渐地统一描述该行业不同信息的命名规则和结构的约定。库组织可能已经统一了元素的格式来描述书籍、戏剧、电影、信件、短文等。同时,操作 系统和/或图形产业界已经统一了元素的格式来描述图片、字体以及文档布局。

    现在,想像一下不幸的开发者被要求编写一个应用 程序,该应用程序提供库的内容。很明显,库内容经常会使用像字体这样的内容——所以,在XML中引用称为letter的内容时,是引用和字体有关的内容还 是一封某人写给另一个人的信件呢(假设是Thomas Jefferson写给George Washington的)?这里产生了冲突,需要方法解决这个问题。

    这就是命名空间的价值所在。命名空间描述了元素 和属性的域以及它们的结构。会把库中支持信件(letter)的结构描述成库的命名空间。同样的,图形产业可能会有它们自己的命名空间,该命名空间可以描 述与该产业相关的字体(letter)。有关命名空间的信息存储在一个参考文档中,可以使用统一资源标识符(Uniform Resource Identifier,URI)找到它们,URI是个特殊的名称,它和URL很相似,最终会解析为参考文档。

    当要建立XML文档来同时引用库以及图形结构 时,只要简单地引用这些产业各自的命名空间。另外,将限定元素和属性,它们的性质是由命名空间描述。通过使用命名空间来限定名称,可以确保如果文档有结构 不同、但名称相同的元素,那么可以引用文档的部分内容,这样可以确保并没有引用错误类型或属性。

    为了引用整个文档的命名空间,只要简单地添加引 用,把它作为根节点的一个特殊的属性(称为xmlns)。这里要提供本地名称(如何引用命名空间)以及最终解析为参考文档的URI。如果想在分配命名空间 的节点的作用域范围内应用该特殊的命名空间,那么也可以在文档中为其他节点添加命名空间的引用(再次使用xmlns)。

    下面是一个XML文档的示例(从技术上说,这就是所谓的模式),下一章将会用到它。请注意一下其中和命名空间相关的内容:

    文档引用了3个命名空间——XDR(碰巧这是个XDR文档)、Microsoft数据类型的命名空间(它会建立一个关于不同数据类型的数量以及性质的列表)以及为了使用SQL Server XML集成而使用的特殊SQL Server命名空间。

    一些属性(包括根节点的属性)由命名空间的信息加以限定(例如,参考sql:relation属性)。

    <?xml version="1.0" encoding="UTF-8"?>

    <Schema xmlns="urn:schemas-microsoft-com:xml-data"

    xmlns:dt="urn:schemas-microsoft-com:datatypes"

    xmlns:sql="urn:schemas-microsoft-com:xml-sql"

    sql:xsl='../Customers.xsl'>

    <ElementType name="Root" content="empty" />

    <ElementType name="Customers" sql:relation="Customers">

    <AttributeType name="CustomerID"/>

    <AttributeType name="CompanyName"/>

    <AttributeType name="Address"/>

    <AttributeType name="City"/>

    <AttributeType name="Region"/>

    <AttributeType name="PostalCode"/>

    <attribute type="CustomerID" sql:field="CustomerID"/>

    <attribute type="CompanyName" sql:field="CompanyName"/>

    <attribute type="Address" sql:field="Address"/>

    <attribute type="City" sql:field="City"/>

    <attribute type="Region" sql:field="Region"/>

    <attribute type="PostalCode" sql:field="PostalCode"/>

    </ElementType>

    </Schema>

    sql数据类型引用了一些特殊的属性。此处不需要担心Microsoft的数据类型命名空间是否也有字段或关系数据类型,因为完全限定了属性的名称。即使数据类型的命名空间没有称为字段的属性,XML分析器仍然会根据sql命名空间的规则来对它进行处理。

    16.1.3  元素的内容

    另一个关于XML和元素的值得一提的概念(与现在的内容很接近)是元素的内容。

    元素可以在超过属性层以及嵌套元素的范围之外包含数据。虽然嵌套的元素是元素内容的一种形式(一个元素包含另一个元素),但是XML也允许在元素中包含行文本的信息。例如,可能会有如下所示的XML文档:

    <?xml version="1.0" encoding="UTF-8"?>

    <root>

    <Customer CustomerID="ALFKI" CompanyName="Alfreds Futterkiste">

    <Note Date="1997-08-25T00:00:00">

    The customer called in today and placed another order. Says they really like our

    work and would like it if we would consider establishing a location closer to their

    base of operations.

    </Note>

    <Note Date="1997-08-26T00:00:00">

    Followed up with the customer on new location. Customer agrees to guarantee us

    $5,000 per month in business to help support a new office.

    </Note>

    </Customer>

    </root>

    Note元素的内容,就像“The customer called...”,既不是元素也不是属性,但是它们是有效的XML数据。

    注意这些数据在XML中,但是SQL Server不会根据这种格式输出数据。RDBMS系统的行/列方法更适合于元素和属性。为了能输出上面的注释数据,需要把数据转换成为新的格式。本章的最后将介绍转换。

    16.1.4  有效的与良好格式的——模式和DTD

    如果XML文档是良好格式的,并不能说明它是有效的XML。这里想要告诉您,除非XML能通过一些规范文档的形式进行验证,这个XML才被认为是有效的。如今,只有两种官方类型的规范文档——文档类型定义(Document Type Definition,DTD)和XML模式。

    这两种文档的基本前提相同。虽然XML希望能够定义大多数XML文档的基本结构,但是DTD和XML模式所探求定义的规则只是针对一类XML文档。这两种方法实现起来略有不同,它们都有各自的优点:

    ●       DTD:经证明它很不错。SGML(XML是SGML的应用程序,可以认为SGML是XML的超集,但是很难学会它)利用了DTD,它的优点是人们都能接受它。现在有很多DTD可供使用。
    它的缺点在于这个DTD在以前的语句中有效。这里不是说以前的内容未必好,但是在这种情况下,DTD确实不能跟上文档技术发展的脚步。DTD不能真正地允许类似限定数据类型这样的操作。

    ●       XML模式:XML模式有着强类型的明显优势。它们的好处在于可以有效地建立自己的复杂数据类型——这种类型是由一个或多个其他数据类型(包括其他复杂的 数据类型)组成的,或者需要特殊的模式匹配(例如,社会保障号码只是一个数字,但是它有特殊的格式,可以通过XML模式对它进行强制的格式化)。XML模 式还有一个优点,它本身就是XML文档。这意味着编写XML文档的很多技术都适用于编写XML模式(虽然要学的内容还很多),而这些模式本身也是自描述的 ——使用另一个模式来对它进行验证。

    posted @ 2007-08-27 08:19 CharlieShen| 编辑 收藏

    举几个例子来简单说明 这些例子我引用了Northwind库。

    1. TOP 表达式
    SQL Server 2000的TOP是个固定值,是不是觉得不爽,现在改进了。 

    --前n名的订单
    declare
     @n int 
    set @n = 10 
    select TOP(@n* from Orders


    2. 分页

    不知各位过去用SQL Server 2000是怎么分页的,大多都用到了临时表。SQL Server 2005一句话就支持分页,性能据说也非常不错。

    --按Freight从小到大排序,求20到30行的结果 
    select * from
        
    select OrderId, Freight, ROW_NUMBER() OVER(order by Freight) as row from Orders 
    ) a 
    where row between 20 and 30


    3. 排名

    select * from
        
    select OrderId, Freight, RANK() OVER(order by Freight) as rank from Orders 
    ) a 
    where rank between 20 and 30


    4. try ... catch

    SQL Server 2000没有异常,T-SQL必须逐行检查错误代码,对于习惯了try catch程序员,2005是不是更加亲切:

    SET XACT_ABORT ON  -- 打开 try功能 
    BEGIN TRY 
        
    begin tran 
            
    insert into Orders(CustomerId) values(-1
        
    commit tran 
        
    print 'commited' 
    END TRY 
    BEGIN
     CATCH 
        
    rollback    
        
    print 'rolled back' 
    END CATCH


    5. 通用表达式CTE

    通过表达式可免除你过去创建临时表的麻烦。

    --例子:结合通用表达式进行分页
    WITH OrderFreight AS
        
    select OrderId, Freight, ROW_NUMBER() OVER(order by Freight) as row from Orders 

    select OrderId, Freight from OrderFreight where row between 10 and 20

    特别,通过表达式还支持递归。


    6. 直接发布Web Service

    想要把store procedure变成Web Service就用这个吧,.NET, IIS都不需要,通过Windows 2003的HTTP Protocol Stack直接发布WebService,用这个功能需要Windows 2003 sp1

    --DataSet CustOrdersOrders(string customerID) 
    CREATE ENDPOINT Orders_Endpoint 
    state
    =started 
    as http( 
        path
    ='/sql/orders'
        AUTHENTICATION
    =(INTEGRATED), 
        ports
    =(clear) 

    for soap( 
        WebMethod 
    'CustOrdersOrders'(   
            name
    ='Northwind.dbo.CustOrdersOrders' 
        ), 
        
        wsdl
    =default
        
    database='Northwind'
        namespace
    ='http://mysite.org/' 
    )

    Web Service就发布好了,敲入http://localhost/sql/orders?wsdl得到wsdl

    posted @ 2007-08-27 08:19 CharlieShen| 编辑 收藏

    16.3  简要介绍XSLT

    这里将开始介绍本章最为复杂的内容。

    可扩展样式表语言转换(Extensible Stylesheet Language Transformation,XSLT)使XML有了多种功能。使用XSLT,可以把XML文档转换成其他的形式。

    为了快速了解一下这方面的内容,现在来看一下Northwind数据库产生的XML文档。

    <?xml version="1.0" encoding="UTF-8"?>

    <root>

    <Customer CustomerID="ALFKI" CompanyName="Alfreds Futterkiste">

    <Products ProductID="28" ProductName="Rössle Sauerkraut"/>

    <Products ProductID="39" ProductName="Chartreuse verte"/>

    <Products ProductID="46" ProductName="Spegesild"/>

    </Customer>

    <Customer CustomerID="BLONP" CompanyName="Blondesddsl père et fils">

    <Products ProductID="28" ProductName="Rössle Sauerkraut"/>

    <Products ProductID="29" ProductName="Thüringer Rostbratwurst"/>

    <Products ProductID="31" ProductName="Gorgonzola Telino"/>

    <Products ProductID="38" ProductName="Côte de Blaye"/>

    <Products ProductID="39" ProductName="Chartreuse verte"/>

    <Products ProductID="41" ProductName="Jack&apos;s New England Clam

    Chowder"/>

    <Products ProductID="46" ProductName="Spegesild"/>

    <Products ProductID="49" ProductName="Maxilaku"/>

    </Customer>

    </root>

    这里得到的是XML的层次结构。在本例中,会碰到客户订购不同产品的情况。XML文档告诉了我们客户所购买的物品。这看上去很合理,不是吗?

    这里对它作些修改——如果问题是“订购每件物品的客户是谁?”那该怎么办呢?我们的观点将大为改变。这里会有一个更好的层次结构,其中产品在外层,而客户在内层。在该场景中,客户(而不是产品)会多次地出现(一次对应一个产品),但是对根的访问将会更多。

    将XML与XSL转换相结合是很正常的。可以看到,不用去修改数据的外观——只要转换XML文档,这样结构就会不一样。

    提示:

    不要以为上面说的“数据的外观”是指视觉上看到的情况—— 而是指如何去理解该数据。其中一部分是指如何根据特殊的方式使用数据。当客户在层次结构的顶层时,数据将不能很好地回答以产品为中心的问题。这里需要将数据转换为以产品为中心,就像前面的那个问题一样。

    下面看一下有着相同的数据、但是以另一种样式表示的XML:

    <?xml version="1.0" encoding="UTF-8"?>

    <root>

    <Products ProductID="28" ProductName="Rössle Sauerkraut">

    <Customer CustomerID="ALFKI" CompanyName="Alfreds Futterkiste"/>

    <Customer CustomerID="BLONP" CompanyName="Blondesddsl père et fils"/>

    </Products>

    <Products ProductID="29" ProductName="Thüringer Rostbratwurst">

    <Customer CustomerID="BLONP" CompanyName="Blondesddsl père et fils"/>

    </Products>

    <Products ProductID="31" ProductName="Gorgonzola Telino">

    <Customer CustomerID="BLONP" CompanyName="Blondesddsl père et fils"/>

    </Products>

    <Products ProductID="38" ProductName="Côte de Blaye">

    <Customer CustomerID="BLONP" CompanyName="Blondesddsl père et fils"/>

    </Products>

    <Products ProductID="39" ProductName="Chartreuse verte">

    <Customer CustomerID="ALFKI" CompanyName="Alfreds Futterkiste"/>

    <Customer CustomerID="BLONP" CompanyName="Blondesddsl père et fils"/>

    </Products>

    <Products ProductID="41" ProductName="Jack&apos;s New England Clam Chowder">

    <Customer CustomerID="BLONP" CompanyName="Blondesddsl père et fils"/>

    </Products>

    <Products ProductID="46" ProductName="Spegesild">

    <Customer CustomerID="ALFKI" CompanyName="Alfreds Futterkiste"/>

    <Customer CustomerID="BLONP" CompanyName="Blondesddsl père et fils"/>

    </Products>

    <Products ProductID="49" ProductName="Maxilaku">

    <Customer CustomerID="BLONP" CompanyName="Blondesddsl père et fils"/>

    </Products>

    </root>

    同样,这是相同的数据——只是观点不同而已。

    为什么要限于XML呢?对每一种转换类型的介绍超出了本书的范围,但是理解XSL可以用很多种格式进行转换,这一点很重要。可以把它转化为其他XML的布局,也可以把它全部转换成其他的格式,如CSV文件或者Word文档。



    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1583566

    posted @ 2007-08-27 08:18 CharlieShen| 编辑 收藏

    随着“金盾工程”建设的逐步深入和公安信息化的高速发展,公安计算机应用系统被广泛应用在各警种、各部门。与此同时,应用系统体系的核心、系统数据的存放地――数据库也随着实际应用而急剧膨胀,一些大规模的系统,如人口系统的数据甚至超过了1000万条,可谓海量。那么,如何实现快速地从这些超大容量的数据库中提取数据(查询)、分析、统计以及提取数据后进行数据分页已成为各地系统管理员和数据库管理员亟待解决的难题。

    在以下的文章中,我将以“办公自动化”系统为例,探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页。以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构:

    CREATE TABLE [dbo].[TGongwen] (    --TGongwen是红头文件表名

       
    [Gid] [int] IDENTITY (11NOT NULL ,
    --本表的id号,也是主键


       
    [title] [varchar] (80) COLLATE Chinese_PRC_CI_AS NULL , 
    --红头文件的标题


       
    [fariqi] [datetime] NULL ,
    --发布日期


       
    [neibuYonghu] [varchar] (70) COLLATE Chinese_PRC_CI_AS NULL ,
    --发布用户


       
    [reader] [varchar] (900) COLLATE Chinese_PRC_CI_AS NULL ,

    --需要浏览的用户。每个用户中间用分隔符“,”分开


    ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

    GO

    下面,我们来往数据库中添加1000万条数据:

    declare @i int

    set @i=1

    while @i<=250000

    begin

        
    insert into Tgongwen(fariqi,neibuyonghu,reader,title) values('2004-2-5','通信科','通信科,办公室,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经侦支队,户政科,治安支队,外事科','这是最先的25万条记录')

        
    set @i=@i+1

    end

    GO

     

    declare @i int

    set @i=1

    while @i<=250000

    begin

        
    insert into Tgongwen(fariqi,neibuyonghu,reader,title) values('2004-9-16','办公室','办公室,通信科,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经侦支队,户政科,外事科','这是中间的25万条记录')

        
    set @i=@i+1

    end

    GO
     

    declare @h int

    set @h=1

    while @h<=100

    begin

    declare @i int

    set @i=2002

    while @i<=2003

    begin

    declare @j int

            
    set @j=0

            
    while @j<50

                
    begin

    declare @k int

                
    set @k=0

                
    while @k<50

                
    begin

        
    insert into Tgongwen(fariqi,neibuyonghu,reader,title) values(cast(@i as varchar(4))+'-8-15 3:'+cast(@j as varchar(2))+':'+cast(@j as varchar(2)),'通信科','办公室,通信科,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经侦支队,户政科,外事科','这是最后的50万条记录')

                
    set @k=@k+1

                
    end

    set @j=@j+1

            
    end

    set @i=@i+1

    end

    set @h=@h+1

    end

    GO

    declare @i int

    set @i=1

    while @i<=9000000

    begin

        
    insert into Tgongwen(fariqi,neibuyonghu,reader,title) values('2004-5-5','通信科','通信科,办公室,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经侦支队,户政科,治安支队,外事科','这是最后添加的900万条记录')

        
    set @i=@i+1000000

    end

    GO

      通过以上语句,我们创建了25万条由通信科于2004年2月5日发布的记录,25万条由办公室于2004年9月6日发布的记录,2002年和 2003年各100个2500条相同日期、不同分秒的由通信科发布的记录(共50万条),还有由通信科于2004年5月5日发布的900万条记录,合计 1000万条。

    一、因情制宜,建立“适当”的索引

    建立“适当”的索引是实现查询优化的首要前提。

    索引(index)是除表之外另一重要的、用户定义的存储在物理介质上的数据结构。当根据索引码的值搜索数据时,索引提供了对数据的快速访问。事实上, 没有索引,数据库也能根据SELECT语句成功地检索到结果,但随着表变得越来越大,使用“适当”的索引的效果就越来越明显。注意,在这句话中,我们用了 “适当”这个词,这是因为,如果使用索引时不认真考虑其实现过程,索引既可以提高也会破坏数据库的工作性能。

    (一)深入浅出理解索引结构

    实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。下面,我们举例来说明一下聚集索引和非聚集索引的区别:

    其实,我们的汉语字典的正文本身就是一 个聚集索引。比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字母“a”开头并以 “z”结尾的,那么“安”字就自然地排在字典的前部。如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;同样的,如 果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼音是“zhang”。也就是说,字典的正文部分本身就是一个目录,您不需要再去查其他目录 来找到您需要找的内容。

    我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。

    如果您认识某个字,您可以 快速地从自典中查到这个字。但您也可能会遇到您不认识的字,不知道它的发音,这时候,您就不能按照刚才的方法找到您要查的字,而需要去根据“偏旁部首”查 到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,比 如您查“张”字,我们可以看到在查部首之后的检字表中“张”的页码是672页,检字表中“张”的上面是“驰”字,但页码却是63页,“张”的下面是“弩” 字,页面是390页。很显然,这些字并不是真正的分别位于“张”字的上下方,现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序, 是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后再翻到您所需要的页码。

    我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。

    通过以上例子,我们可以理解到什么是“聚集索引”和“非聚集索引”。

    进一步引申一下,我们可以很容易的理解:每个表只能有一个聚集索引,因为目录只能按照一种方法进行排序。

    (二)何时使用聚集索引或非聚集索引

    下面的表总结了何时使用聚集索引或非聚集索引(很重要)。

    动作描述      使用聚集索引 使用非聚集索引
    ---------------------------  ------------ --------------
    外键列         应           应
    主键列              应          应
    列经常被分组排序(order by)   应        应
    返回某范围内的数据           应     不应
    小数目的不同值        应    不应
    大数目的不同值           不应     应
    频繁更新的列       不应    应
    频繁修改索引列      不应         应
    一个或极少不同值    不应    不应


    事 实上,我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。如:返回某范围内的数据一项。比如您的某个表有一个时间列,恰好您把聚合索引建立在 了该列,这时您查询2004年1月1日至2004年10月1日之间的全部数据时,这个速度就将是很快的,因为您的这本字典正文是按日期进行排序的,聚类索 引只需要找到要检索的所有数据中的开头和结尾数据即可;而不像非聚集索引,必须先查到目录中查到每一项数据对应的页码,然后再根据页码查到具体内容。


    (三)结合实际,谈索引使用的误区

    理论的目的是应用。虽然我们刚才列出了何时应使用聚集索引或非聚集索引,但在实践中以上规则却很容易被忽视或不能根据实际情况进行综合分析。下面我们将根据在实践中遇到的实际问题来谈一下索引使用的误区,以便于大家掌握索引建立的方法。

    1、主键就是聚集索引

    这种想法笔者认为是极端错误的,是对聚集索引的一种浪费。虽然SQL SERVER默认是在主键上建立聚集索引的。

    通 常,我们会在每个表中都建立一个ID列,以区分每条数据,并且这个ID列是自动增大的,步长一般为1。我们的这个办公自动化的实例中的列Gid就是如此。 此时,如果我们将这个列设为主键,SQL SERVER会将此列默认为聚集索引。这样做有好处,就是可以让您的数据在数据库中按照ID进行物理排序,但笔者认为这样做意义不大。

    显而易见,聚集索引的优势是很明显的,而每个表中只能有一个聚集索引的规则,这使得聚集索引变得更加珍贵。

    从 我们前面谈到的聚集索引的定义我们可以看出,使用聚集索引的最大好处就是能够根据查询要求,迅速缩小查询范围,避免全表扫描。在实际应用中,因为ID号是 自动生成的,我们并不知道每条记录的ID号,所以我们很难在实践中用ID号来进行查询。这就使让ID号这个主键作为聚集索引成为一种资源浪费。其次,让每 个ID号都不同的字段作为聚集索引也不符合“大数目的不同值情况下不应建立聚合索引”规则;当然,这种情况只是针对用户经常修改记录内容,特别是索引项的 时候会负作用,但对于查询速度并没有影响。

    在办公自动化系统中,无论是系统首页显示的需要用户签收的文件、会议还是用户进行文件查询等任何情况下进行数据查询都离不开字段的是“日期”还有用户本身的“用户名”。

    通 常,办公自动化的首页会显示每个用户尚未签收的文件或会议。虽然我们的where语句可以仅仅限制当前用户尚未签收的情况,但如果您的系统已建立了很长时 间,并且数据量很大,那么,每次每个用户打开首页的时候都进行一次全表扫描,这样做意义是不大的,绝大多数的用户1个月前的文件都已经浏览过了,这样做只 能徒增数据库的开销而已。事实上,我们完全可以让用户打开系统首页时,数据库仅仅查询这个用户近3个月来未阅览的文件,通过“日期”这个字段来限制表扫 描,提高查询速度。如果您的办公自动化系统已经建立的2年,那么您的首页显示速度理论上将是原来速度8倍,甚至更快。

    在这里之所以提到“理 论上”三字,是因为如果您的聚集索引还是盲目地建在ID这个主键上时,您的查询速度是没有这么高的,即使您在“日期”这个字段上建立的索引(非聚合索 引)。下面我们就来看一下在1000万条数据量的情况下各种查询的速度表现(3个月内的数据为25万条):

    (1)仅在主键上建立聚集索引,并且不划分时间段:

    Select gid,fariqi,neibuyonghu,title from tgongwen

    用时:128470毫秒(即:128秒)

    (2)在主键上建立聚集索引,在fariq上建立非聚集索引:

    select gid,fariqi,neibuyonghu,title from Tgongwen
    where fariqi> dateadd(day,-90,getdate())

    用时:53763毫秒(54秒)

    (3)将聚合索引建立在日期列(fariqi)上:

    select gid,fariqi,neibuyonghu,title from Tgongwen
    where fariqi> dateadd(day,-90,getdate())

    用时:2423毫秒(2秒)

    虽 然每条语句提取出来的都是25万条数据,各种情况的差异却是巨大的,特别是将聚集索引建立在日期列时的差异。事实上,如果您的数据库真的有1000万容量 的话,把主键建立在ID列上,就像以上的第1、2种情况,在网页上的表现就是超时,根本就无法显示。这也是我摒弃ID列作为聚集索引的一个最重要的因素。

    得出以上速度的方法是:在各个select语句前加:

    declare @d datetime
    set @d=getdate()

    并在select语句后加:

    select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())


    2、只要建立索引就能显著提高查询速度

    事实上,我们可以发现上面的例子中,第2、3条语句完全相同,且建立索引的字段也相同;不同的仅是前者在fariqi字段上建立的是非聚合索引,后者在此字段上建立的是聚合索引,但查询速度却有着天壤之别。所以,并非是在任何字段上简单地建立索引就能提高查询速度。

    从 建表的语句中,我们可以看到这个有着1000万数据的表中fariqi字段有5003个不同记录。在此字段上建立聚合索引是再合适不过了。在现实中,我们 每天都会发几个文件,这几个文件的发文日期就相同,这完全符合建立聚集索引要求的:“既不能绝大多数都相同,又不能只有极少数相同”的规则。由此看来,我 们建立“适当”的聚合索引对于我们提高查询速度是非常重要的。

    3、把所有需要提高查询速度的字段都加进聚集索引,以提高查询速度

    上面已经谈到:在进行数据查询时都离不开字段的是“日期”还有用户本身的“用户名”。既然这两个字段都是如此的重要,我们可以把他们合并起来,建立一个复合索引(compound index)。

    很 多人认为只要把任何字段加进聚集索引,就能提高查询速度,也有人感到迷惑:如果把复合的聚集索引字段分开查询,那么查询速度会减慢吗?带着这个问题,我们 来看一下以下的查询速度(结果集都是25万条数据):(日期列fariqi首先排在复合聚集索引的起始列,用户名neibuyonghu排在后列)

    (1)select gid,fariqi,neibuyonghu,title from Tgongwen
    where fariqi>'2004-5-5'

    查询速度:2513毫秒

    (2)select gid,fariqi,neibuyonghu,title from Tgongwen
    where fariqi>'2004-5-5' and neibuyonghu='办公室'

    查询速度:2516毫秒

    (3)select gid,fariqi,neibuyonghu,title from Tgongwen
    where neibuyonghu='办公室'

    查询速度:60280毫秒

    从 以上试验中,我们可以看到如果仅用聚集索引的起始列作为查询条件和同时用到复合聚集索引的全部列的查询速度是几乎一样的,甚至比用上全部的复合索引列还要 略快(在查询结果集数目一样的情况下);而如果仅用复合聚集索引的非起始列作为查询条件的话,这个索引是不起任何作用的。当然,语句1、2的查询速度一样 是因为查询的条目数一样,如果复合索引的所有列都用上,而且查询结果少的话,这样就会形成“索引覆盖”,因而性能可以达到最优。同时,请记住:无论您是否 经常使用聚合索引的其他列,但其前导列一定要是使用最频繁的列。


    (四)其他书上没有的索引使用经验总结

    1、用聚合索引比用不是聚合索引的主键速度快

    下面是实例语句:(都是提取25万条数据)

    select gid,fariqi,neibuyonghu,reader,title from Tgongwen
    where fariqi='2004-9-16'

    使用时间:3326毫秒

    select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid<=250000

    使用时间:4470毫秒

    这里,用聚合索引比用不是聚合索引的主键速度快了近1/4。


    2、用聚合索引比用一般的主键作order by时速度快,特别是在小数据量情况下

    select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by fariqi

    用时:12936

    select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by gid

    用时:18843

    这里,用聚合索引比用一般的主键作order by时,速度快了3/10。事实上,如果数据量很小的话,用聚集索引作为排序列要比使用非聚集索引速度快得明显的多;而数据量如果很大的话,如10万以上,则二者的速度差别不明显。


    3、使用聚合索引内的时间段,搜索时间会按数据占整个数据表的百分比成比例减少,而无论聚合索引使用了多少个

    select gid,fariqi,neibuyonghu,reader,title from Tgongwen
    where fariqi>'2004-1-1'

    用时:6343毫秒(提取100万条)

    select gid,fariqi,neibuyonghu,reader,title from Tgongwen
    where fariqi>'2004-6-6'

    用时:3170毫秒(提取50万条)

    select gid,fariqi,neibuyonghu,reader,title from Tgongwen
    where fariqi='2004-9-16'

    用时:3326毫秒(和上句的结果一模一样。如果采集的数量一样,那么用大于号和等于号是一样的)

    select gid,fariqi,neibuyonghu,reader,title from Tgongwen
    where fariqi>'2004-1-1' and fariqi<'2004-6-6'

    用时:3280毫秒


    4 、日期列不会因为有分秒的输入而减慢查询速度

    下面的例子中,共有100万条数据,2004年1月1日以后的数据有50万条,但只有两个不同的日期,日期精确到日;之前有数据50万条,有5000个不同的日期,日期精确到秒。

    select gid,fariqi,neibuyonghu,reader,title from Tgongwen
    where fariqi>'2004-1-1' order by fariqi

    用时:6390毫秒

    select gid,fariqi,neibuyonghu,reader,title from Tgongwen
    where fariqi<'2004-1-1' order by fariqi

    用时:6453毫秒

    (五)其他注意事项

    “水可载舟,亦可覆舟”,索引也一样。索引有助于提高检索性能,但过多或不当的索引也会导致系统低效。过多的索引甚至会导致索引碎片。
    索引是从数据库中获取数据的最高效方式之一。95%的数据库性能问题都可以采用索引技术得到解决。

    1. 不要索引常用的小型表

    不要为小型数据表设置任何键,假如它们经常有插入和删除操作就更别这样作了。对这些插入和删除操作的索引维护可能比扫描表空间消耗更多的时间。

    2. 不要把社会保障号码(SSN)或身份证号码(ID)选作键

    永远都不要使用 SSN 或 ID 作为数据库的键。除了隐私原因以外,SSN 或 ID 需要手工输入。永远不要使用手工输入的键作为主键,因为一旦你输入错误,你唯一能做的就是删除整个记录然后从头开始。

    3. 不要用用户的键

    在确定采用什么字段作为表的键的时候,可一定要小心用户将要编辑的字段。通常的情况下不要选择用户可编辑的字段作为键。这样做会迫使你采取以下两个措施:

    4. 不要索引 memo/notes 字段和不要索引大型文本字段(许多字符)

    这样做会让你的索引占据大量的数据库空间

    5. 使用系统生成的主键

    假如你总是在设计数据库的时候采用系统生成的键作为主键,那么你实际控制了数据库的索引完整性。这样,数据库和非人工机制就有效地控制了对存储数据中每一行的访问。
    采用系统生成键作为主键还有一个优点:当你拥有一致的键结构时,找到逻辑缺陷很容易。


    二、改善SQL语句

    很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解。比如:

    select * from table1 where name='zhangsan' and tID > 10000

    和执行:

    select * from table1 where tID > 10000 and name='zhangsan'

    一 些人不知道以上两条语句的执行效率是否一样,因为如果简单的从语句先后上看,这两个语句的确是不一样,如果tID是一个聚合索引,那么后一句仅仅从表的 10000条以后的记录中查找就行了;而前一句则要先从全表中查找看有几个name='zhangsan'的,而后再根据限制条件条件tID> 10000来提出查询结果。

    事实上,这样的担心是不必要的。SQL SERVER中有一个“查询分析优化器”,它可以计算出where子句中的搜索条件并确定哪个索引能缩小表扫描的搜索空间,也就是说,它能实现自动优化。

    虽然查询优化器可以根据where子句自动的进行查询优化,但大家仍然有必要了解一下“查询优化器”的工作原理,如非这样,有时查询优化器就会不按照您的本意进行快速查询。

    在查询分析阶段,查询优化器查看查询的每个阶段并决定限制需要扫描的数据量是否有用。如果一个阶段可以被用作一个扫描参数(SARG),那么就称之为可优化的,并且可以利用索引快速获得所需数据。

    SARG的定义:用于限制搜索的一个操作,因为它通常是指一个特定的匹配,一个值得范围内的匹配或者两个以上条件的AND连接。形式如下:

    列名 操作符 <常数 或 变量>

    <常数 或 变量> 操作符列名

    列名可以出现在操作符的一边,而常数或变量出现在操作符的另一边。如:

    Name=’张三’

    价格>5000

    5000<价格

    Name=’张三’ and 价格>5000

    如果一个表达式不能满足SARG的形式,那它就无法限制搜索的范围了,也就是SQL SERVER必须对每一行都判断它是否满足WHERE子句中的所有条件。所以一个索引对于不满足SARG形式的表达式来说是无用的。

    介绍完SARG后,我们来总结一下使用SARG以及在实践中遇到的和某些资料上结论不同的经验:

    1、Like语句是否属于SARG取决于所使用的通配符的类型

    如:name like ‘张%’ ,这就属于SARG
    而:name like ‘%张’ ,就不属于SARG。

    原因是通配符%在字符串的开通使得索引无法使用。

    2、or 会引起全表扫描

    如:Name=’张三’ and 价格>5000 符号SARG,
    而:Name=’张三’ or  价格>5000 则不符合SARG。
    使用or会引起全表扫描。

    3、非操作符、函数引起的不满足SARG形式的语句

    不满足SARG形式的语句最典型的情况就是包括非操作符的语句,如:NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等,另外还有函数。下面就是几个不满足SARG形式的例子:

    ABS(价格)<5000
    Name like ‘%三’

    有些表达式,如:

    WHERE 价格*2>5000
    SQL SERVER也会认为是SARG,SQL SERVER会将此式转化为:
    WHERE 价格>2500/2

    但我们不推荐这样使用,因为有时SQL SERVER不能保证这种转化与原始表达式是完全等价的。

    4、IN 的作用相当与OR

    语句:

    Select * from table1 where tid in (2,3)

    Select * from table1 where tid=2 or tid=3

    是一样的,都会引起全表扫描,如果tid上有索引,其索引也会失效。

    5、尽量少用NOT

    6、exists 和 in 的执行效率是一样的

    很 多资料上都显示说,exists要比in的执行效率要高,同时应尽可能的用not exists来代替not in。但事实上,我试验了一下,发现二者无论是前面带不带not,二者之间的执行效率都是一样的。因为涉及子查询,我们试验这次用SQL SERVER自带的pubs数据库。运行前我们可以把SQL SERVER的statistics I/O状态打开。

    (1)select title,price from titles where title_id in
    (select title_id from sales where qty>30)

    该句的执行结果为:
    表 'sales'。扫描计数 18,逻辑读 56 次,物理读 0 次,预读 0 次。
    表 'titles'。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。

    (2)select title,price from titles where exists
    (select * from sales where sales.title_id=titles.title_id and qty>30)

    第二句的执行结果为:
    表 'sales'。扫描计数 18,逻辑读 56 次,物理读 0 次,预读 0 次。
    表 'titles'。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。

    我们从此可以看到用exists和用in的执行效率是一样的。

    7、用函数charindex()和前面加通配符%的LIKE执行效率一样

    前面,我们谈到,如果在LIKE前面加上通配符%,那么将会引起全表扫描,所以其执行效率是低下的。但有的资料介绍说,用函数charindex()来代替LIKE速度会有大的提升,经我试验,发现这种说明也是错误的:

    select gid,title,fariqi,reader from tgongwen
    where charindex('刑侦支队',reader)>0 and fariqi>'2004-5-5'

    用时:7秒,另外:扫描计数 4,逻辑读 7155 次,物理读 0 次,预读 0 次。

    select gid,title,fariqi,reader from tgongwen
    where reader like '%' + '刑侦支队' + '%' and fariqi>'2004-5-5'

    用时:7秒,另外:扫描计数 4,逻辑读 7155 次,物理读 0 次,预读 0 次。

    8、union并不绝对比or的执行效率高

    我们前面已经谈到了在where子句中使用or会引起全表扫描,一般的,我所见过的资料都是推荐这里用union来代替or。事实证明,这种说法对于大部分都是适用的。

    select gid,fariqi,neibuyonghu,reader,title from Tgongwen
    where fariqi='2004-9-16' or gid>9990000

    用时:68秒。扫描计数 1,逻辑读 404008 次,物理读 283 次,预读 392163 次。

    select gid,fariqi,neibuyonghu,reader,title from Tgongwen
    where fariqi='2004-9-16'
    union
    select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid>9990000

    用时:9秒。扫描计数 8,逻辑读 67489 次,物理读 216 次,预读 7499 次。

    看来,用union在通常情况下比用or的效率要高的多。

    但经过试验,笔者发现如果or两边的查询列是一样的话,那么用union则反倒和用or的执行速度差很多,虽然这里union扫描的是索引,而or扫描的是全表。

    select gid,fariqi,neibuyonghu,reader,title from Tgongwen
    where fariqi='2004-9-16' or fariqi='2004-2-5'

    用时:6423毫秒。扫描计数 2,逻辑读 14726 次,物理读 1 次,预读 7176 次。

    select gid,fariqi,neibuyonghu,reader,title from Tgongwen
    where fariqi='2004-9-16'
    union
    select gid,fariqi,neibuyonghu,reader,title from Tgongwen
    where  fariqi='2004-2-5'

    用时:11640毫秒。扫描计数 8,逻辑读 14806 次,物理读 108 次,预读 1144 次。

    9、字段提取要按照“需多少、提多少”的原则,避免“select *”

    我们来做一个试验:

    select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc

    用时:4673毫秒

    select top 10000 gid,fariqi,title from tgongwen order by gid desc

    用时:1376毫秒

    select top 10000 gid,fariqi from tgongwen order by gid desc

    用时:80毫秒

    由此看来,我们每少提取一个字段,数据的提取速度就会有相应的提升。提升的速度还要看您舍弃的字段的大小来判断。

    10、count(*)不比count(字段)慢

    某些资料上说:用*会统计所有列,显然要比一个世界的列名效率低。这种说法其实是没有根据的。我们来看:

    select count(*) from Tgongwen

    用时:1500毫秒

    select count(gid) from Tgongwen

    用时:1483毫秒

    select count(fariqi) from Tgongwen

    用时:3140毫秒

    select count(title) from Tgongwen

    用时:52050毫秒

    从 以上可以看出,如果用count(*)和用count(主键)的速度是相当的,而count(*)却比其他任何除主键以外的字段汇总速度要快,而且字段越 长,汇总的速度就越慢。我想,如果用count(*), SQL SERVER可能会自动查找最小字段来汇总的。当然,如果您直接写count(主键)将会来的更直接些。

    11、order by按聚集索引列排序效率最高

    我们来看:(gid是主键,fariqi是聚合索引列)

    select top 10000 gid,fariqi,reader,title from tgongwen

    用时:196 毫秒。 扫描计数 1,逻辑读 289 次,物理读 1 次,预读 1527 次。

    select top 10000 gid,fariqi,reader,title from tgongwen order by gid asc

    用时:4720毫秒。 扫描计数 1,逻辑读 41956 次,物理读 0 次,预读 1287 次。

    select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc

    用时:4736毫秒。 扫描计数 1,逻辑读 55350 次,物理读 10 次,预读 775 次。

    select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi asc

    用时:173毫秒。 扫描计数 1,逻辑读 290 次,物理读 0 次,预读 0 次。

    select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi desc

    用时:156毫秒。 扫描计数 1,逻辑读 289 次,物理读 0 次,预读 0 次。

    从以上我们可以看出,不排序的速度以及逻辑读次数都是和“order by 聚集索引列” 的速度是相当的,但这些都比“order by 非聚集索引列”的查询速度是快得多的。

    同时,按照某个字段进行排序的时候,无论是正序还是倒序,速度是基本相当的。

    12、高效的TOP

    事实上,在查询和提取超大容量的数据集时,影响数据库响应时间的最大因素不是数据查找,而是物理的I/0操作。如:

    select top 10 * from (
    select top 10000 gid,fariqi,title from tgongwen
    where neibuyonghu='办公室'order by gid desc) as a
    order by gid asc

    这 条语句,从理论上讲,整条语句的执行时间应该比子句的执行时间长,但事实相反。因为,子句执行后返回的是10000条记录,而整条语句仅返回10条语句, 所以影响数据库响应时间最大的因素是物理I/O操作。而限制物理I/O操作此处的最有效方法之一就是使用TOP关键词了。TOP关键词是SQL SERVER中经过系统优化过的一个用来提取前几条或前几个百分比数据的词。经笔者在实践中的应用,发现TOP确实很好用,效率也很高。但这个词在另外一 个大型数据库ORACLE中却没有,这不能说不是一个遗憾,虽然在ORACLE中可以用其他方法(如:rownumber)来解决。在以后的关于“实现千 万级数据的分页显示存储过程”的讨论中,我们就将用到TOP这个关键词。

    到此为止,我们上面讨论了如何实现从大容量的数据库中快速地查询出您所需要的数据方法。当然,我们介绍的这些方法都是“软”方法,在实践中,我们还要考虑各种“硬”因素,如:网络性能、服务器的性能、操作系统的性能,甚至网卡、交换机等。


    三、实现小数据量和海量数据的通用分页显示存储过程

    建 立一个web 应用,分页浏览功能必不可少。这个问题是数据库处理中十分常见的问题。经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页。但这种分页方法仅适用于较小数据量的情形,因为游标本身有缺点:游标是存放在内存 中,很费内存。游标一建立,就将相关的记录锁住,直到取消游标。游标提供了对特定集合中逐行扫描的手段,一般使用游标来逐行遍历数据,根据取出数据条件的 不同进行不同的操作。而对于多表和大表中定义的游标(大的数据集合)循环很容易使程序进入一个漫长的等待甚至死机。

    更重要的是,对于非常大的数据模型而言,分页检索时,如果按照传统的每次都加载整个数据源的方法是非常浪费资源的。现在流行的分页方法一般是检索页面大小的块区的数据,而非检索所有的数据,然后单步执行当前行。

    最早较好地实现这种根据页面大小和页码来提取数据的方法大概就是“俄罗斯存储过程”。这个存储过程用了游标,由于游标的局限性,所以这个方法并没有得到大家的普遍认可。

    后来,网上有人改造了此存储过程,下面的存储过程就是结合我们的办公自动化实例写的分页存储过程:

    CREATE procedure pagination1
    (@pagesize int,  --页面大小,如每页存储20条记录
    @pageindex int   --当前页码
    )
    as
    set nocount on    //不返回计数,不返回任何结果集
    begin
    declare @indextable table(id int identity(1,1),nid int)  --定义表变量
    declare @PageLowerBound int      --定义此页的底码
    declare @PageUpperBound int      --定义此页的顶码
    set @PageLowerBound=(@pageindex-1)*@pagesize
    set @PageUpperBound=@PageLowerBound+@pagesize
    set rowcount @PageUpperBound
    insert into @indextable(nid) select gid from TGongwen where fariqi  > dateadd(day,-365,getdate()) order by fariqi desc
    select O.gid,O.mid,O.title,O.fadanwei,O.fariqi from TGongwen O, @indextable t where O.gid=t.nid
    and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id
    end
    set nocount off  //返回计数,返回任何结果集


    以 上存储过程运用了SQL SERVER的最新技术――表变量。应该说这个存储过程也是一个非常优秀的分页存储过程。当然,在这个过程中,您也可以把其中的表变量写成临时表: CREATE TABLE #Temp。但很明显,在SQL SERVER中,用临时表是没有用表变量快的。所以笔者刚开始使用这个存储过程时,感觉非常的不错,速度也比原来的ADO的好。但后来,我又发现了比此方 法更好的方法。

    笔者曾在网上看到了一篇小短文《从数据表中取出第n条到第m条的记录的方法》,全文如下:

    从publish 表中取出第 n 条到第 m 条的记录:

    SELECT TOP m-n+1 *
    FROM publish
    WHERE (id NOT IN (SELECT TOP n-1 id FROM publish))

    id 为publish 表的关键字

    我 当时看到这篇文章的时候,真的是精神为之一振,觉得思路非常得好。等到后来,我在作办公自动化系统(ASP.NET+ C#+SQL SERVER)的时候,忽然想起了这篇文章,我想如果把这个语句改造一下,这就可能是一个非常好的分页存储过程。于是我就满网上找这篇文章,没想到,文章 还没找到,却找到了一篇根据此语句写的一个分页存储过程,这个存储过程也是目前较为流行的一种分页存储过程,我很后悔没有争先把这段文字改造成存储过程:

    CREATE PROCEDURE pagination2
    (
     @SQL nVARCHAR(4000),    --不带排序语句的SQL语句
     @Page int,              --页码
     @RecsPerPage int,       --每页容纳的记录数
     @ID VARCHAR(255),       --需要排序的不重复的ID号
     @Sort VARCHAR(255)      --排序字段及规则
    )
    AS

    DECLARE @Str nVARCHAR(4000)

    SET @Str='SELECT   TOP '+CAST(@RecsPerPage AS VARCHAR(20))+' * FROM ('+@SQL+') T WHERE T.'+@ID+'NOT IN
    (SELECT   TOP '+CAST((@RecsPerPage*(@Page-1)) AS VARCHAR(20))+' '+@ID+' FROM ('+@SQL+') T9 ORDER BY '+@Sort+') ORDER BY '+@Sort

    PRINT @Str

    EXEC sp_ExecuteSql @Str
    GO

    其实,以上语句可以简化为:

    SELECT TOP 页大小 *
    FROM Table1
    WHERE (ID NOT IN
              (SELECT TOP 页大小*页数 id
             FROM 表
             ORDER BY id))
    ORDER BY ID

    但这个存储过程有一个致命的缺点,就是它含有NOT IN字样。虽然我可以把它改造为:

    SELECT TOP 页大小 *
    FROM Table1
    WHERE not exists
    (select * from (select top (页大小*页数) * from table1 order by id) b
       where b.id=a.id )
    order by id

    即,用not exists来代替not in,但我们前面已经谈过了,二者的执行效率实际上是没有区别的。

    既便如此,用TOP 结合NOT IN的这个方法还是比用游标要来得快一些。

    虽然用not exists并不能挽救上个存储过程的效率,但使用SQL SERVER中的TOP关键字却是一个非常明智的选择。因为分页优化的最终目的就是避免产生过大的记录集,而我们在前面也已经提到了TOP的优势,通过TOP 即可实现对数据量的控制。

    在分页算法中,影响我们查询速度的关键因素有两点:TOP和NOT IN。TOP可以提高我们的查询速度,而NOT IN会减慢我们的查询速度,所以要提高我们整个分页算法的速度,就要彻底改造NOT IN,同其他方法来替代它。

    我 们知道,几乎任何字段,我们都可以通过max(字段)或min(字段)来提取某个字段中的最大或最小值,所以如果这个字段不重复,那么就可以利用这些不重 复的字段的max或min作为分水岭,使其成为分页算法中分开每页的参照物。在这里,我们可以用操作符“>”或“<”号来完成这个使命,使查 询语句符合SARG形式。如:

    Select top 10 * from table1 where id>200

    于是就有了如下分页方案:

    select top 页大小 *
    from table1
    where id>
          (select max (id) from
          (select top ((页码-1)*页大小) id from table1 order by id) as T
           )    
    order by id

    在 选择即不重复值,又容易分辨大小的列时,我们通常会选择主键。下表列出了笔者用有着1000万数据的办公自动化系统中的表,在以GID(GID是主键,但 并不是聚集索引。)为排序列、提取gid,fariqi,title字段,分别以第1、10、100、500、1000、1万、10万、25万、50万页 为例,测试以上三种分页方案的执行速度:(单位:毫秒)

    页  码        方案1            方案2           方案3
    -----------   -----------    ---------  ------------
    1             60             30              76
    10              46             16              63
    100            1076            720             130
    500            540             12943           83
    1000          17110          470             250
    1万             24796           4500            140
    10万           38326           42283           1553
    25万           28140           128720          2330
    50万           121686         127846          7168


     从上表中,我们可以看出,三种存储过程在执行100页以下的分页命令时,都是可以信任的,速度都很好。但第一种方案在执行分页1000页以上后,速度就降了下来。第二种方案大约是在执行分页1万页以上后速度开始降了下来。而第三种方案却始终没有大的降势,后劲仍然很足。

    在 确定了第三种分页方案后,我们可以据此写一个存储过程。大家知道SQL SERVER的存储过程是事先编译好的SQL语句,它的执行效率要比通过WEB页面传来的SQL语句的执行效率要高。下面的存储过程不仅含有分页方案,还 会根据页面传来的参数来确定是否进行数据总数统计。

    -- 获取指定页的数据

    CREATE PROCEDURE pagination3
    @tblName varchar(255),          -- 表名
    @strGetFields varchar(1000) = '*',   -- 需要返回的列
    @fldName varchar(255)='',         -- 排序的字段名
    @PageSize int = 10,             -- 页尺寸(每页记录数)
    @PageIndex int = 1,              -- 页码
    @doCount bit = 0,        -- 返回记录总数, 非0值则返回记录数
    @OrderType bit = 0,       -- 设置排序类型, 非0值则降序
    @strWhere  varchar(1500) = ''     -- 查询条件 (注意: 不要加 where)
    AS
    declare @strSQL   varchar(5000)        -- 主语句
    declare @strTmp   varchar(110)         -- 临时变量
    declare @strOrder varchar(400)         -- 排序类型

    if @doCount != 0
      begin
        if @strWhere !=''
           set @strSQL = "select count(*) as Total from [" + @tblName + "] where "+@strWhere
        else
           set @strSQL = "select count(*) as Total from [" + @tblName + "]"
     end   --以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
    else
    begin
    if @OrderType != 0         // 降序(desc)
    begin
        set @strTmp = "<(select min"
    set @strOrder = " order by [" + @fldName +"] desc"
    --如果@OrderType不是0,就执行降序,这句很重要!
    end
    else      // 升序(asc)
    begin
        set @strTmp = ">(select max"
        set @strOrder = " order by [" + @fldName +"] asc"
    end

    if @PageIndex = 1   // 页码
    begin
        if @strWhere != ''  
    set @strSQL = "select top " +str(@PageSize)+ " " +@strGetFields+ " from [" + @tblName + "] where " + @strWhere + " " + @strOrder
            else
    set @strSQL = "select top " +str(@PageSize)+" " +@strGetFields+ "  from [" +@tblName+ "] " +@strOrder
    --如果是第一页就执行以上代码,这样会加快执行速度
    end
    else
    begin --以下代码赋予了@strSQL以真正执行的SQL代码
    set @strSQL = "select top " +str(@PageSize)+ " " +@strGetFields+ "  from [" +@tblName+ "] where [" +@fldName+ "]" +@strTmp+ "([" +@fldName+ "]) from (select top " +str((@PageIndex-1)*@PageSize)+ " [" +@fldName+ "] from [" +@tblName+ "]" +@strOrder+ ") as tblTmp)" +@strOrder

    if @strWhere != ''
    set @strSQL ="select top " +str(@PageSize)+ " " +@strGetFields+ "  from [" +@tblName+ "] where [" +@fldName+ "]" +@strTmp+ "([" +@fldName+ "]) from (select top " +str((@PageIndex-1)*@PageSize) + " [" +@fldName+ "] from [" +@tblName+ "] where " +@strWhere+ " " +@strOrder+ ") as tblTmp) and " +@strWhere+ " " +@strOrder
    end
    end  
    exec (@strSQL)
    GO

    上面的这个存储过程是一个通用的存储过程,其注释已写在其中了。

    select top 页大小 *
    from table1
    where id >
          (select max (id) from
          (select top ((页码-1)*页大小) id from table1 order by id) as T
           )    
    order by id

    在大数据量的情况下,特别是在查询最后几页的时候,查询时间一般不会超过9秒;而用其他存储过程,在实践中就会导致超时,所以这个存储过程非常适用于大容量数据库的查询。

    笔者希望能够通过对以上存储过程的解析,能给大家带来一定的启示,并给工作带来一定的效率提升,同时希望同行提出更优秀的实时数据分页算法。


    四、聚集索引的重要性和如何选择聚集索引

    在上一节的标题中,笔者写的是:实现小数据量和海量数据的通用分页显示存储过程。这是因为在将本存储过程应用于“办公自动化”系统的实践中时,笔者发现这第三种存储过程在小数据量的情况下,有如下现象:

    1、分页速度一般维持在1秒和3秒之间。

    2、在查询最后一页时,速度一般为5秒至8秒,哪怕分页总数只有3页或30万页。

    虽然在超大容量情况下,这个分页的实现过程是很快的,但在分前几页时,这个1-3秒的速度比起第一种甚至没有经过优化的分页方法速度还要慢,借用户的话说就是“还没有ACCESS数据库速度快”,这个认识足以导致用户放弃使用您开发的系统。

    笔者就此分析了一下,原来产生这种现象的症结是如此的简单,但又如此的重要:排序的字段不是聚集索引!

    本篇文章的题目是:“查询优化及分页算法方案”。笔者只所以把“查询优化”和“分页算法”这两个联系不是很大的论题放在一起,就是因为二者都需要一个非常重要的东西――聚集索引。

    在前面的讨论中我们已经提到了,聚集索引有两个最大的优势:

    1、以最快的速度缩小查询范围。
    2、以最快的速度进行字段排序。

    第1条多用在查询优化时,而第2条多用在进行分页时的数据排序。

    而聚集索引在每个表内又只能建立一个,这使得聚集索引显得更加的重要。聚集索引的挑选可以说是实现“查询优化”和“高效分页”的最关键因素。

    但要既使聚集索引列既符合查询列的需要,又符合排序列的需要,这通常是一个矛盾。

    笔者前面“索引”的讨论中,将fariqi,即用户发文日期作为了聚集索引的起始列,日期的精确度为“日”。这种作法的优点,前面已经提到了,在进行划时间段的快速查询中,比用ID主键列有很大的优势。

    但在分页时,由于这个聚集索引列存在着重复记录,所以无法使用max或min来最为分页的参照物,进而无法实现更为高效的排序。而如果将ID主键列作为聚集索引,那么聚集索引除了用以排序之外,没有任何用处,实际上是浪费了聚集索引这个宝贵的资源。

    为解决这个矛盾,笔者后来又添加了一个日期列,其默认值为getdate()。用户在写入记录时,这个列自动写入当时的时间,时间精确到毫秒。即使这样,为了避免可能性很小的重合,还要在此列上创建UNIQUE约束。将此日期列作为聚集索引列。

    有了这个时间型聚集索引列之后,用户就既可以用这个列查找用户在插入数据时的某个时间段的查询,又可以作为唯一列来实现max或min,成为分页算法的参照物。

    经过这样的优化,笔者发现,无论是大数据量的情况下还是小数据量的情况下,分页速度一般都是几十毫秒,甚至0毫秒。而用日期段缩小范围的查询速度比原来也没有任何迟钝。

    聚集索引是如此的重要和珍贵,所以笔者总结了一下,一定要将聚集索引建立在:

    1、您最频繁使用的、用以缩小查询范围的字段上;
    2、您最频繁使用的、需要排序的字段上。


    结束语:

    本 篇文章汇集了笔者近段在使用数据库方面的心得,是在做“办公自动化”系统时实践经验的积累。希望这篇文章不仅能够给大家的工作带来一定的帮助,也希望能让 大家能够体会到分析问题的方法;最重要的是,希望这篇文章能够抛砖引玉,掀起大家的学习和讨论的兴趣,以共同促进,共同为公安科技强警事业和金盾工程做出 自己最大的努力。

    最后需要说明的是,在试验中,我发现用户在进行大数据量查询的时候,对数据库速度影响最大的不是内存大小,而是CPU。在 我的P4 2.4机器上试验的时候,查看“资源管理器”,CPU经常出现持续到100%的现象,而内存用量却并没有改变或者说没有大的改变。即使在我们的HP ML 350 G3服务器上试验时,CPU峰值也能达到90%,一般持续在70%左右。

    posted @ 2007-08-27 08:17 CharlieShen| 编辑 收藏

    有时, 为了让应用程序运行得更快,所做的全部工作就是在这里或那里做一些很小调整。啊,但关键在于确定如何进行调整!迟早您会遇到这种情况:应用程序中的 SQL 查询不能按照您想要的方式进行响应。它要么不返回数据,要么耗费的时间长得出奇。如果它降低了报告或您的企业应用程序的速度,用户必须等待的时间过长,他们就会很不满意。就像您的父母不想听您解释为什么在深更半夜才回来一样,用户也不会听你解释为什么查询耗费这么长时间。(“对不起,妈妈,我使用了太多的 LEFT JOIN。”)用户希望应用程序响应迅速,他们的报告能够在瞬间之内返回分析数据。就我自己而言,如果在 Web 上冲浪时某个页面要耗费十多秒才能加载(好吧,五秒更实际一些),我也会很不耐烦。

    为了解决这些问题,重要的是找到问题的根源。那么,从哪里开始呢?根本原因通常在于数据库设计和访问它的查询。在本月的专栏中,我将讲述四项技术,这些技术可用于提高基于 SQL Server 的应用程序的性能或改善其可伸缩性。我将仔细说明 LEFT JOIN、CROSS JOIN 的使用以及 IDENTITY 值的检索。请记住,根本没有神奇的解决方案。调整您的数据库及其查询需要占用时间、进行分析,还需要大量的测试。这些技术都已被证明行之有效,但对您的应用程序而言,可能其中一些技术比另一些技术更适用。

    本页内容
    1. 从 INSERT 返回 IDENTITY  
    2. 内嵌视图与临时表  
    3. 避免 LEFT JOIN 和 NULL  
    4. 灵活使用笛卡尔乘积  
    5. 拾遗补零  

    1. 从 INSERT 返回 IDENTITY 

    我决定从遇到许多问题的内容入手:如何在执行 SQL INSERT 后检索 IDENTITY 值。通常,问题不在于如何编写检索值的查询,而在于在哪里以及何时进行检索。在 SQL Server 中,下面的语句可用于检索由最新在活动数据库连接上运行的 SQL 语句所创建的 IDENTITY 值:

    SELECT @@IDENTITY
    这个 SQL 语句并不复杂,但需要记住的一点是:如果这个最新的 SQL 语句不是 INSERT,或者您针对非 INSERT SQL 的其他连接运行了此 SQL,则不会获得期望的值。您必须运行下列代码才能检索紧跟在 INSERT SQL 之后且位于同一连接上的 IDENTITY,如下所示:

    INSERT INTO Products (ProductName) VALUES ('Chalk')
     
    SELECT @@IDENTITY
    在一个连接上针对 Northwind 数据库运行这些查询将返回一个名称为 Chalk 的新产品的 IDENTITY 值。所以,在使用 ADO 的 Visual Basic? 应用程序中,可以运行以下语句:

    Set oRs = oCn.Execute("SET NOCOUNT ON;INSERT INTO Products _
    (ProductName) VALUES ('Chalk');SELECT @@IDENTITY"
     
    lProductID = oRs(0)
    此代码告诉 SQL Server 不要返回查询的行计数,然后执行 INSERT 语句,并返回刚刚为这个新行创建的 IDENTITY 值。SET NOCOUNT ON 语句表示返回的记录集有一行和一列,其中包含了这个新的 IDENTITY 值。如果没有此语句,则会首先返回一个空的记录集(因为 INSERT 语句不返回任何数据),然后会返回第二个记录集,第二个记录集中包含 IDENTITY 值。这可能有些令人困惑,尤其是因为您从来就没有希望过 INSERT 会返回记录集。之所以会发生此情况,是因为 SQL Server 看到了这个行计数(即一行受到影响)并将其解释为表示一个记录集。因此,真正的数据被推回到了第二个记录集。当然您可以使用 ADO 中的 NextRecordset 方法获取此第二个记录集,但如果总能够首先返回该记录集且只返回该记录集,则会更方便,也更有效率。

    此方法虽然有效,但需要在 SQL 语句中额外添加一些代码。获得相同结果的另一方法是在 INSERT 之前使用 SET NOCOUNT ON 语句,并将 SELECT @@IDENTITY 语句放在表中的 FOR INSERT 触发器中,如下面的代码片段所示。这样,任何进入该表的 INSERT 语句都将自动返回 IDENTITY 值。

    CREATE TRIGGER trProducts_Insert ON Products FOR INSERT AS 
        SELECT @@IDENTITY 
    GO
    触发器只在 Products 表上发生 INSERT 时启动,所以它总是会在成功 INSERT 之后返回一个 IDENTITY。使用此技术,您可以始终以相同的方式在应用程序中检索 IDENTITY 值。


    2. 内嵌视图与临时表 
    某些时候,查询需要将数据与其他一些可能只能通过执行 GROUP BY 然后执行标准查询才能收集的数据进行联接。例如,如果要查询最新五个定单的有关信息,您首先需要知道是哪些定单。这可以使用返回定单 ID 的 SQL 查询来检索。此数据就会存储在临时表(这是一个常用技术)中,然后与 Products 表进行联接,以返回这些定单售出的产品数量:

    CREATE TABLE #Temp1 (OrderID INT NOT NULL, _
                         OrderDate DATETIME NOT NULL)
     
    INSERT INTO #Temp1 (OrderID, OrderDate)
    SELECT     TOP 5 o.OrderID, o.OrderDate
    FROM Orders o ORDER BY o.OrderDate DESC
     
    SELECT     p.ProductName, SUM(od.Quantity) AS ProductQuantity
    FROM     #Temp1 t 
        INNER JOIN [Order Details] od ON t.OrderID = od.OrderID
        INNER JOIN Products p ON od.ProductID = p.ProductID 
    GROUP BY p.ProductName
    ORDER BY p.ProductName
     
    DROP TABLE #Temp1
    这些 SQL 语句会创建一个临时表,将数据插入该表中,将其他数据与该表进行联接,然后除去该临时表。这会导致此查询进行大量 I/O 操作,因此,可以重新编写查询,使用内嵌视图取代临时表。内嵌视图只是一个可以联接到 FROM 子句中的查询。所以,您不用在 tempdb 中的临时表上耗费大量 I/O 和磁盘访问,而可以使用内嵌视图得到同样的结果:

    SELECT p.ProductName, 
        SUM(od.Quantity) AS ProductQuantity
    FROM     (
        SELECT TOP 5 o.OrderID, o.OrderDate
        FROM     Orders o 
        ORDER BY o.OrderDate DESC
        screen.width/2)this.width=screen.width/2" vspace=2 border=0> t 
        INNER JOIN [Order Details] od ON t.OrderID = od.OrderID
        INNER JOIN Products p ON od.ProductID = p.ProductID 
    GROUP BY
        p.ProductName
    ORDER BY
        p.ProductName
    此查询不仅比前面的查询效率更高,而且长度更短。临时表会消耗大量资源。如果只需要将数据联接到其他查询,则可以试试使用内嵌视图,以节省资源。

    3. 避免 LEFT JOIN 和 NULL 
    当然,有很多时候您需要执行 LEFT JOIN 和使用 NULL 值。但是,它们并不适用于所有情况。改变 SQL 查询的构建方式可能会产生将一个花几分钟运行的报告缩短到只花几秒钟这样的天壤之别的效果。有时,必须在查询中调整数据的形态,使之适应应用程序所要求的显示方式。虽然 TABLE 数据类型会减少大量占用资源的情况,但在查询中还有许多区域可以进行优化。SQL 的一个有价值的常用功能是 LEFT JOIN。它可以用于检索第一个表中的所有行、第二个表中所有匹配的行、以及第二个表中与第一个表不匹配的所有行。例如,如果希望返回每个客户及其定单,使用 LEFT JOIN 则可以显示有定单和没有定单的客户。

    此工具可能会被过度使用。LEFT JOIN 消耗的资源非常之多,因为它们包含与 NULL(不存在)数据匹配的数据。在某些情况下,这是不可避免的,但是代价可能非常高。LEFT JOIN 比 INNER JOIN 消耗资源更多,所以如果您可以重新编写查询以使得该查询不使用任何 LEFT JOIN,则会得到非常可观的回报(请参阅图 1 中的图)。

    图1
    图 1 查询 

    加快使用 LEFT JOIN 的查询速度的一项技术涉及创建一个 TABLE 数据类型,插入第一个表(LEFT JOIN 左侧的表)中的所有行,然后使用第二个表中的值更新 TABLE 数据类型。此技术是一个两步的过程,但与标准的 LEFT JOIN 相比,可以节省大量时间。一个很好的规则是尝试各种不同的技术并记录每种技术所需的时间,直到获得用于您的应用程序的执行性能最佳的查询。

    测试查询的速度时,有必要多次运行此查询,然后取一个平均值。因为查询(或存储过程)可能会存储在 SQL Server 内存中的过程缓存中,因此第一次尝试耗费的时间好像稍长一些,而所有后续尝试耗费的时间都较短。另外,运行您的查询时,可能正在针对相同的表运行其他查询。当其他查询锁定和解锁这些表时,可能会导致您的查询要排队等待。例如,如果您进行查询时某人正在更新此表中的数据,则在更新提交时您的查询可能需要耗费更长时间来执行。

    避免使用 LEFT JOIN 时速度降低的最简单方法是尽可能多地围绕它们设计数据库。例如,假设某一产品可能具有类别也可能没有类别。如果 Products 表存储了其类别的 ID,而没有用于某个特定产品的类别,则您可以在字段中存储 NULL 值。然后您必须执行 LEFT JOIN 来获取所有产品及其类别。您可以创建一个值为“No Category”的类别,从而指定外键关系不允许 NULL 值。通过执行上述操作,现在您就可以使用 INNER JOIN 检索所有产品及其类别了。虽然这看起来好像是一个带有多余数据的变通方法,但可能是一个很有价值的技术,因为它可以消除 SQL 批处理语句中消耗资源较多的 LEFT JOIN。在数据库中全部使用此概念可以为您节省大量的处理时间。请记住,对于您的用户而言,即使几秒钟的时间也非常重要,因为当您有许多用户正在访问同一个联机数据库应用程序时,这几秒钟实际上的意义会非常重大。 

    4. 灵活使用笛卡尔乘积 
    对于此技巧,我将进行非常详细的介绍,并提倡在某些情况下使用笛卡尔乘积。出于某些原因,笛卡尔乘积 (CROSS JOIN) 遭到了很多谴责,开发人员通常会被警告根本就不要使用它们。在许多情况下,它们消耗的资源太多,从而无法高效使用。但是像 SQL 中的任何工具一样,如果正确使用,它们也会很有价值。例如,如果您想运行一个返回每月数据(即使某一特定月份客户没有定单也要返回)的查询,您就可以很方便地使用笛卡尔乘积。 图 2 中的 SQL 就执行了上述操作。

    虽然这看起来好像没什么神奇的,但是请考虑一下,如果您从客户到定单(这些定单按月份进行分组并对销售额进行小计)进行了标准的 INNER JOIN,则只会获得客户有定单的月份。因此,对于客户未订购任何产品的月份,您不会获得 0 值。如果您想为每个客户都绘制一个图,以显示每个月和该月销售额,则可能希望此图包括月销售额为 0 的月份,以便直观标识出这些月份。如果使用 图 2 中的 SQL,数据则会跳过销售额为 0 美元的月份,因为在定单表中对于零销售额不会包含任何行(假设您只存储发生的事件)。

    图 3 中的代码虽然较长,但是可以达到获取所有销售数据(甚至包括没有销售额的月份)的目标。首先,它会提取去年所有月份的列表,然后将它们放入第一个 TABLE 数据类型表 (@tblMonths) 中。下一步,此代码会获取在该时间段内有销售额的所有客户公司的名称列表,然后将它们放入另一个 TABLE 数据类型表 (@tblCus-tomers) 中。这两个表存储了创建结果集所必需的所有基本数据,但实际销售数量除外。 第一个表中列出了所有月份(12 行),第二个表中列出了这个时间段内有销售额的所有客户(对于我是 81 个)。并非每个客户在过去 12 个月中的每个月都购买了产品,所以,执行 INNER JOIN 或 LEFT JOIN 不会返回每个月的每个客户。这些操作只会返回购买产品的客户和月份。

    笛卡尔乘积则可以返回所有月份的所有客户。笛卡尔乘积基本上是将第一个表与第二个表相乘,生成一个行集合,其中包含第一个表中的行数与第二个表中的行数相乘的结果。因此,笛卡尔乘积会向表 @tblFinal 返回 972 行。最后的步骤是使用此日期范围内每个客户的月销售额总计更新 @tblFinal 表,以及选择最终的行集。

    如果由于笛卡尔乘积占用的资源可能会很多,而不需要真正的笛卡尔乘积,则可以谨慎地使用 CROSS JOIN。例如,如果对产品和类别执行了 CROSS JOIN,然后使用 WHERE 子句、DISTINCT 或 GROUP BY 来筛选出大多数行,那么使用 INNER JOIN 会获得同样的结果,而且效率高得多。如果需要为所有的可能性都返回数据(例如在您希望使用每月销售日期填充一个图表时),则笛卡尔乘积可能会非常有帮助。但是,您不应该将它们用于其他用途,因为在大多数方案中 INNER JOIN 的效率要高得多。

    5. 拾遗补零 
    这里介绍其他一些可帮助提高 SQL 查询效率的常用技术。假设您将按区域对所有销售人员进行分组并将他们的销售额进行小计,但是您只想要那些数据库中标记为处于活动状态的销售人员。您可以按区域对销售人员分组,并使用 HAVING 子句消除那些未处于活动状态的销售人员,也可以在 WHERE 子句中执行此操作。在 WHERE 子句中执行此操作会减少需要分组的行数,所以比在 HAVING 子句中执行此操作效率更高。HAVING 子句中基于行的条件的筛选会强制查询对那些在 WHERE 子句中会被去除的数据进行分组。

    另一个提高效率的技巧是使用 DISTINCT 关键字查找数据行的单独报表,来代替使用 GROUP BY 子句。在这种情况下,使用 DISTINCT 关键字的 SQL 效率更高。请在需要计算聚合函数(SUM、COUNT、MAX 等)的情况下再使用 GROUP BY。另外,如果您的查询总是自己返回一个唯一的行,则不要使用 DISTINCT 关键字。在这种情况下,DISTINCT 关键字只会增加系统开销。

    您已经看到了,有大量技术都可用于优化查询和实现特定的业务规则,技巧就是进行一些尝试,然后比较它们的性能。最重要的是要测试、测试、再测试。在此专栏的将来各期内容中,我将继续深入讲述 SQL Server 概念,包括数据库设计、好的索引实践以及 SQL Server 安全范例。

    如有向 Johnny 提出的问题和建议,请发送电子邮件到 mmdata@microsoft.com 

    Johnny Papa 是北卡罗来纳州罗利市的 MJM 研究公司的信息技术副总裁,他著有Professional ADO 25 RDS Programming with ASP(Wrox, 2000),并经常在行业会议中做演讲。要与他联系,请发送电子邮件到 datapoints@lancelotweb.com
    posted @ 2007-08-27 08:15 CharlieShen| 编辑 收藏

    ---- 人们在使用SQL时往往会陷入一个误区,即太关注于所得的结果是否正确,而忽略了不同的实现方法之间可能存在的性能差异,这种性能差异在大型的或是复杂的数据库环境中(如联机事务处理OLTP或决策支持系统DSS)中表现得尤为明显。笔者在工作实践中发现,不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句。在对它们进行适当的优化后,其运行速度有了明显地提高!下面我将从这三个方面分别进行总结:
    ---- 为了更直观地说明问题,所有实例中的SQL运行时间均经过测试,不超过1秒的均表示为(< 1秒)。
    ---- 测试环境--
    ---- 主机:HP LH II
    ---- 主频:330MHZ
    ---- 内存:128兆
    ---- 操作系统:Operserver5.0.4
    ---- 数据库:Sybase11.0.3

    一、不合理的索引设计
    ----例:表record有620000行,试看在不同的索引下,下面几个 SQL的运行情况:
    ---- 1.在date上建有一非个群集索引
    select count(*) from record where date > '19991201' and date < '19991214'and amount > 2000 (25秒)
    select date,sum(amount) from record group by date (55秒)
    select count(*) from record where date > '19990901' and place in ('BJ','SH') (27秒)
    ---- 分析:
    ----date上有大量的重复值,在非群集索引下,数据在物理上随机存放在数据页上,在范围查找时,必须执行一次表扫描才能找到这一范围内的全部行。
    ---- 2.在date上的一个群集索引
    select count(*) from record where date > '19991201' and date < '19991214' and amount > 2000 (14秒)
    select date,sum(amount) from record group by date (28秒)
    select count(*) from record where date >  '19990901' and place in ('BJ','SH')(14秒)
    ---- 分析:
    ---- 在群集索引下,数据在物理上按顺序在数据页上,重复值也排列在一起,因而在范围查找时,可以先找到这个范围的起末点,且只在这个范围内扫描数据页,避免了大范围扫描,提高了查询速度。
    ---- 3.在place,date,amount上的组合索引
    select count(*) from record where date > '19991201' and date < '19991214' and amount > 2000 (26秒)
    select date,sum(amount) from record group by date (27秒)
    select count(*) from record where date > '19990901' and place in ('BJ, 'SH')(< 1秒)
    ---- 分析:
    ---- 这是一个不很合理的组合索引,因为它的前导列是place,第一和第二条SQL没有引用place,因此也没有利用上索引;第三个SQL使用了place,且引用的所有列都包含在组合索引中,形成了索引覆盖,所以它的速度是非常快的。
    ---- 4.在date,place,amount上的组合索引
    select count(*) from record where date > '19991201' and date < '19991214' and amount > 2000(< 1秒)
    select date,sum(amount) from record group by date (11秒)
    select count(*) from record where date > '19990901' and place in ('BJ','SH')(< 1秒)
    ---- 分析:
    ---- 这是一个合理的组合索引。它将date作为前导列,使每个SQL都可以利用索引,并且在第一和第三个SQL中形成了索引覆盖,因而性能达到了最优。
    ---- 5.总结:
    ---- 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的;合理的索引设计要建立在对各种查询的分析和预测上。一般来说:
    ---- ①.有大量重复值、且经常有范围查询
    (between, >,< ,>=,< =)和order by、group by发生的列,可考虑建立群集索引;
    ---- ②.经常同时存取多列,且每列都含有重复值可考虑建立组合索引;
    ---- ③.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。

    二、不充份的连接条件:
    ---- 例:表card有7896行,在card_no上有一个非聚集索引,表account有191122行,在account_no上有一个非聚集索引,试看在不同的表连接条件下,两个SQL的执行情况:

    select sum(a.amount) from account a, card b where a.card_no = b.card_no(20秒)
    ---- 将SQL改为:
    select sum(a.amount) from account a, card b where a.card_no = b.card_no and a.account_no=b.account_no(< 1秒)
    ---- 分析:
    ---- 在第一个连接条件下,最佳查询方案是将account作外层表,card作内层表,利用card上的索引,其I/O次数可由以下公式估算为:
    ---- 外层表account上的22541页+(外层表account的191122行*内层表card上对应外层表第一行所要查找的3页)=595907次I/O
    ---- 在第二个连接条件下,最佳查询方案是将card作外层表,account作内层表,利用account上的索引,其I/O次数可由以下公式估算为:
    ---- 外层表card上的1944页+(外层表card的7896行*内层表account上对应外层表每一行所要查找的4页)= 33528次I/O
    ---- 可见,只有充份的连接条件,真正的最佳方案才会被执行。
    ---- 总结:
    ---- 1.多表操作在被实际执行前,查询优化器会根据连接条件,列出几组可能的连接方案并从中找出系统开销最小的最佳方案。连接条件要充份考虑带有索引的表、行数多的表;内外表的选择可由公式:外层表中的匹配行数*内层表中每一次查找的次数确定,乘积最小为最佳方案。
    ---- 2.查看执行方案的方法-- 用set showplanon,打开showplan选项,就可以看到连接顺序、使用何种索引的信息;想看更详细的信息,需用sa角色执行dbcc(3604,310,302)。

    三、不可优化的where子句
    ---- 1.例:下列SQL条件语句中的列都建有恰当的索引,但执行速度却非常慢:
    select * from record where substring(card_no,1,4)='5378' (13秒)
    select * from record where amount/30< 1000(11秒)
    select * from record where convert(char(10),date,112)='19991201'(10秒)
    ---- 分析:
    ---- where子句中对列的任何操作结果都是在SQL运行时逐列计算得到的,因此它不得不进行表搜索,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被SQL优化器优化,使用索引,避免表搜索,因此将SQL重写成下面这样:
    select * from record where card_no like '5378%'(< 1秒)
    select * from record where amount < 1000*30(< 1秒)
    select * from record where date= '1999/12/01' (< 1秒)
    ---- 你会发现SQL明显快起来!
    ---- 2.例:表stuff有200000行,id_no上有非群集索引,请看下面这个SQL:
    select count(*) from stuff where id_no in('0','1') (23秒)
    ---- 分析:
    ---- where条件中的'in'在逻辑上相当于'or',所以语法分析器会将in ('0','1')转化为id_no ='0' or id_no='1'来执行。我们期望它会根据每个or子句分别查找,再将结果相加,这样可以利用id_no上的索引;但实际上(根据showplan),它却采用了"OR策略",即先取出满足每个or子句的行,存入临时数据库的工作表中,再建立唯一索引以去掉重复行,最后从这个临时表中计算结果。因此,实际过程没有利用id_no上索引,并且完成时间还要受tempdb数据库性能的影响。
    ---- 实践证明,表的行数越多,工作表的性能就越差,当stuff有620000行时,执行时间竟达到220秒!还不如将or子句分开:
    select count(*) from stuff where id_no='0'
    select count(*) from stuff where id_no='1'
    ---- 得到两个结果,再作一次加法合算。因为每句都使用了索引,执行时间只有3秒,在620000行下,时间也只有4秒。或者,用更好的方法,写一个简单的存储过程:
    create proc count_stuff as
    declare @a int
    declare @b int
    declare @c int
    declare @d char(10)
    begin
    select @a=count(*) from stuff where id_no='0'
    select @b=count(*) from stuff where id_no='1'
    end
    select @c=@a+@b
    select @d=convert(char(10),@c)
    print @d
    ---- 直接算出结果,执行时间同上面一样快!
    ---- 总结:
    ---- 可见,所谓优化即where子句利用了索引,不可优化即发生了表扫描或额外开销。

    ---- 1.任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
    ---- 2.in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。
    ---- 3.要善于使用存储过程,它使SQL变得更加灵活和高效。
    ---- 从以上这些例子可以看出,SQL优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充份利用索引,减少表扫描的I/O次数,尽量避免表搜索的发生。其实SQL的性能优化是一个复杂的过程,上述这些只是在应用层次的一种体现,深入研究还会涉及数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计。

    posted @ 2007-08-27 08:15 CharlieShen| 编辑 收藏

    数据库系统是管理信息系统的核心,基于数据库的联机事务处理(OLTP)以及联机分析处理(OLAP)是银行、企业、政府等部门最为重要的计算机应用之 一。从大多数系统的应用实例来看,查询操作在各种数据库操作中所占据的比重最大,而查询操作所基于的SELECT语句在SQL语句中又是代价最大的语句。 举例来说,如果数据的量积累到一定的程度,比如一个银行的账户数据库表信息积累到上百万甚至上千万条记录,全表扫描一次往往需要数十分钟,甚至数小时。如 果采用比全表扫描更好的查询策略,往往可以使查询时间降为几分钟,由此可见查询优化技术的重要性。

    笔者在应用项目的实施中发现,许多程序员在利用一些前端数据库开发工具(如PowerBuilder、Delphi等)开发数据库应用程序时,只注重用户 界面的华丽,并不重视查询语句的效率问题,导致所开发出来的应用系统效率低下,资源浪费严重。因此,如何设计高效合理的查询语句就显得非常重要。本文以应 用实例为基础,结合数据库理论,介绍查询优化技术在现实系统中的运用。 

    分析问题 

    许多程序员认为查询优化是DBMS(数据库管理系统)的任务,与程序员所编写的SQL语句关系不大,这是错误的。一个好的查询计划往往可以使程序性能提高 数十倍。查询计划是用户所提交的SQL语句的集合,查询规划是经过优化处理之后所产生的语句集合。DBMS处理查询计划的过程是这样的:在做完查询语句的 词法、语法检查之后,将语句提交给DBMS的查询优化器,优化器做完代数优化和存取路径的优化之后,由预编译模块对语句进行处理并生成查询规划,然后在合 适的时间提交给系统处理执行,最后将执行结果返回给用户。在实际的数据库产品(如Oracle、Sybase等)的高版本中都是采用基于代价的优化方法, 这种优化能根据从系统字典表所得到的信息来估计不同的查询规划的代价,然后选择一个较优的规划。虽然现在的数据库产品在查询优化方面已经做得越来越好,但 由用户提交的SQL语句是系统优化的基础,很难设想一个原本糟糕的查询计划经过系统的优化之后会变得高效,因此用户所写语句的优劣至关重要。系统所做查询 优化我们暂不讨论,下面重点说明改善用户查询计划的解决方案。  
    解决问题 
    下面以关系数据库系统Informix为例,介绍改善用户查询计划的方法。 

    1.合理使用索引 
    索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引的使用要恰到好处,其使用原则如下: 
    ●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。 
    ●在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。 
    ●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。 
    ●如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。 
    ●使用系统工具。如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作 而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大 量数据后,删除并重建索引可以提高查询速度。 

    2.避免或简化排序 
    应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素: 
    ●索引中不包括一个或几个待排序的列; 
    ●group by或order by子句中列的次序与索引的次序不一样; 
    ●排序的列来自不同的表。 
    为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。 

    3.消除对大型表行数据的顺序存取 
    在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查 询10亿行数据。避免这种情况的主要方法就是对连接的列进行索引。例如,两个表:学生表(学号、姓名、年龄……)和选课表(学号、课程号、成绩)。如果两 个表要做连接,就要在“学号”这个连接字段上建立索引。 
    还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的where子句强迫优化器使用顺序存取。下面的查询将强迫对orders表执行顺序操作: 
    SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008 
    虽然在customer_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句: 
    SELECT * FROM orders WHERE customer_num=104 AND order_num>1001 
    UNION 
    SELECT * FROM orders WHERE order_num=1008 
    这样就能利用索引路径处理查询。 

    4.避免相关子查询 
    一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。 

    5.避免困难的正规表达式 
    MATCHES和LIKE关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时间。例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _” 
    即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为SELECT * FROM customer WHERE zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。 
    另外,还要避免非开始的子串。例如语句:SELECT * FROM customer WHERE zipcode[2,3] >“80”,在where子句中采用了非开始子串,因而这个语句也不会使用索引。

    6.使用临时表加速查询 
    把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。例如: 
    SELECT cust.name,rcvbles.balance,……other columns 
    FROM cust,rcvbles 
    WHERE cust.customer_id = rcvlbes.customer_id 
    AND rcvblls.balance>0 
    AND cust.postcode>“98000” 
    ORDER BY cust.name 
    如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个临时文件中,并按客户的名字进行排序: 
    SELECT cust.name,rcvbles.balance,……other columns 
    FROM cust,rcvbles 
    WHERE cust.customer_id = rcvlbes.customer_id 
    AND rcvblls.balance>0 
    ORDER BY cust.name 
    INTO TEMP cust_with_balance 
    然后以下面的方式在临时表中查询: 
    SELECT * FROM cust_with_balance 
    WHERE postcode>“98000” 
    临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。 
    注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。 

    7.用排序来取代非顺序存取 
    非顺序磁盘存取是最慢的操作,表现在磁盘存取臂的来回移动。SQL语句隐藏了这一情况,使得我们在写应用程序时很容易写出要求存取大量非顺序页的查询。 
    有些时候,用数据库的排序能力来替代非顺序的存取能改进查询。 

    实例分析 

    下面我们举一个制造公司的例子来说明如何进行查询优化。制造公司数据库中包括3个表,模式如下所示: 
    1.part表 
    零件号零件描述其他列 
    (part_num)(part_desc)(other column) 
    102,032Seageat 30G disk…… 
    500,049Novel 10M network card   …… 
    …… 

    2.vendor表 
    厂商号厂商名其他列 
    (vendor _num)(vendor_name)      (other column) 
    910,257 Seageat Corp     …… 
    523,045IBM Corp…… 
    …… 

    3.parven表 
    零件号厂商号零件数量 
    (part_num)(vendor_num)  (part_amount) 
    102,032910,2573,450,000 
    234,423321,0014,000,000 
    …… 

    下面的查询将在这些表上定期运行,并产生关于所有零件数量的报表: 
    SELECT part_desc,vendor_name,part_amount 
    FROM part,vendor,parven 
    WHERE part.part_num=parven.part_num 
    AND parven.vendor_num = vendor.vendor_num 
    ORDER BY part.part_num 
    如果不建立索引,上述查询代码的开销将十分巨大。为此,我们在零件号和厂商号上建立索引。索引的建立避免了在嵌套中反复扫描。关于表与索引的统计信息如下: 

    表行尺寸行数量每页行数量数据页数量 
    (table)(row size)(Row count)(Rows/Pages)(Data Pages) 
    part15010,00025400 
    Vendor1501,000 2540 
    Parven13 15,000300   50 
    索引键尺寸每页键数量页面数量 
    (Indexes)(Key Size)(Keys/Page)(Leaf Pages) 
    part450020 
    Vendor45002 
    Parven825060 

    看起来是个相对简单的3表连接,但是其查询开销是很大的。通过查看系统表可以看到,在part_num上和vendor_num上有簇索引,因此索引是按 照物理顺序存放的。parven表没有特定的存放次序。这些表的大小说明从缓冲页中非顺序存取的成功率很小。此语句的优化查询规划是:首先从part中顺 序读取400页,然后再对parven表非顺序存取1万次,每次2页(一个索引页、一个数据页),总计2万个磁盘页,最后对vendor表非顺序存取 1.5万次,合3万个磁盘页。可以看出在这个索引好的连接上花费的磁盘存取为5.04万次。 
    实际上,我们可以通过使用临时表分3个步骤来提高查询效率: 

    1.从parven表中按vendor_num的次序读数据: 
    SELECT part_num,vendor_num,price 
    FROM parven 
    ORDER BY vendor_num 
    INTO temp pv_by_vn 
    这个语句顺序读parven(50页),写一个临时表(50页),并排序。假定排序的开销为200页,总共是300页。 

    2.把临时表和vendor表连接,把结果输出到一个临时表,并按part_num排序: 
    SELECT pv_by_vn,* vendor.vendor_num 
    FROM pv_by_vn,vendor 
    WHERE pv_by_vn.vendor_num=vendor.vendor_num 
    ORDER BY pv_by_vn.part_num 
    INTO TMP pvvn_by_pn 
    DROP TABLE pv_by_vn 
    这个查询读取pv_by_vn(50页),它通过索引存取vendor表1.5万次,但由于按vendor_num次序排列,实际上只是通过索引顺序地读 vendor表(40+2=42页),输出的表每页约95行,共160页。写并存取这些页引发5*160=800次的读写,索引共读写892页。 

    3.把输出和part连接得到最后的结果: 
    SELECT pvvn_by_pn.*,part.part_desc 
    FROM pvvn_by_pn,part 
    WHERE pvvn_by_pn.part_num=part.part_num 
    DROP TABLE pvvn_by_pn 
    这样,查询顺序地读pvvn_by_pn(160页),通过索引读part表1.5万次,由于建有索引,所以实际上进行1772次磁盘读写,优化比例为 30∶1。笔者在Informix Dynamic Sever上做同样的实验,发现在时间耗费上的优化比例为5∶1(如果增加数据量,比例可能会更 大)。 


    小结
     

    20%的代码用去了80%的时间,这是程序设计中的一个著名定律,在数据库应用程序中也同样如此。我们的优化要抓住关键问题,对于数据库应用程序来说,重点在于SQL的执行效率。查询优化的重点环节是使得数据库服务器少从磁盘中读数据以及顺序读页而不是非顺序读页。
    posted @ 2007-08-27 08:14 CharlieShen| 编辑 收藏

    1 逻辑数据库和表的设计
    数据库的逻辑设计、包括表与表之间的关系是优化关系型数据库性能的核心。一个好的逻辑数据库设计可以为优化数据库和应用程序打下良好的基础。
    标准化的数据库逻辑设计包括用多的、有相互关系的窄表来代替很多列的长数据表。下面是一些使用标准化表的一些好处。
    A:由于表窄,因此可以使排序和建立索引更为迅速
    B:由于多表,所以多镞的索引成为可能
    C:更窄更紧凑的索引
    D:每个表中可以有少一些的索引,因此可以提高insert update delete等的速度,因为这些操作在索引多的情况下会对系统性能产生很大的影响
    E:更少的空值和更少的多余值,增加了数据库的紧凑性由于标准化,所以会增加了在获取数据时引用表的数目和其间的连接关系的复杂性。太多的表和复杂的连接关系会降低服务器的性能,因此在这两者之间需要综合考虑。
      定义具有相关关系的主键和外来键时应该注意的事项主要是:用于连接多表的主键和参考的键要有相同的数据类型。

    2 索引的设计
    A:尽量避免表扫描
    检查你的查询语句的where子句,因为这是优化器重要关注的地方。包含在where里面的每一列(column)都是可能的侯选索引,为能达到最优的性能,考虑在下面给出的例子:对于在where子句中给出了column1这个列。
    下面的两个条件可以提高索引的优化查询性能!
    第一:在表中的column1列上有一个单索引
    第二:在表中有多索引,但是column1是第一个索引的列
    避免定义多索引而column1是第二个或后面的索引,这样的索引不能优化服务器性能
    例如:下面的例子用了pubs数据库。
    SELECT au_id, au_lname, au_fname FROM authors
    WHERE au_lname = ’White’
    按下面几个列上建立的索引将会是对优化器有用的索引
    ?au_lname
    ?au_lname, au_fname
    而在下面几个列上建立的索引将不会对优化器起到好的作用
    ?au_address
    ?au_fname, au_lname
    考虑使用窄的索引在一个或两个列上,窄索引比多索引和复合索引更能有效。用窄的索引,在每一页上
    将会有更多的行和更少的索引级别(相对与多索引和复合索引而言),这将推进系统性能。
    对于多列索引,SQL Server维持一个在所有列的索引上的密度统计(用于联合)和在第一个索引上的
    histogram(柱状图)统计。根据统计结果,如果在复合索引上的第一个索引很少被选择使用,那么优化器对很多查询请求将不会使用索引。
    有用的索引会提高select语句的性能,包括insert,uodate,delete。
    但是,由于改变一个表的内容,将会影响索引。每一个insert,update,delete语句将会使性能下降一些。实验表明,不要在一个单表上用大量的索引,不要在共享的列上(指在多表中用了参考约束)使用重叠的索引。
    在某一列上检查唯一的数据的个数,比较它与表中数据的行数做一个比较。这就是数据的选择性,这比较结果将会帮助你决定是否将某一列作为侯选的索引列,如果需要,建哪一种索引。你可以用下面的查询语句返回某一列的不同值的数目。
    select count(distinct cloumn_name) from table_name
    假设column_name是一个10000行的表,则看column_name返回值来决定是否应该使用,及应该使用什么索引。
    Unique values Index

    5000 Nonclustered index
    20 Clustered index
    3 No index

    镞索引和非镞索引的选择

    <1:>镞索引是行的物理顺序和索引的顺序是一致的。页级,低层等索引的各个级别上都包含实际的数据页。一个表只能是有一个镞索引。由于update,delete语句要求相对多一些的读操作,因此镞索引常常能加速这样的操作。在至少有一个索引的表中,你应该有一个镞索引。
    在下面的几个情况下,你可以考虑用镞索引:
    例如: 某列包括的不同值的个数是有限的(但是不是极少的)
    顾客表的州名列有50个左右的不同州名的缩写值,可以使用镞索引。
    例如: 对返回一定范围内值的列可以使用镞索引,比如用between,>,>=,<,<=等等来对列进行操作的列上。
    select * from sales where ord_date between ’5/1/93’ and ’6/1/93’
    例如: 对查询时返回大量结果的列可以使用镞索引。
    SELECT * FROM phonebook WHERE last_name = ’Smith’

    当有大量的行正在被插入表中时,要避免在本表一个自然增长(例如,identity列)的列上建立镞索引。如果你建立了镞的索引,那么insert的性能就会大大降低。因为每一个插入的行必须到表的最后,表的最后一个数据页。
    当一个数据正在被插入(这时这个数据页是被锁定的),所有的其他插入行必须等待直到当前的插入已经结束。
    一个索引的叶级页中包括实际的数据页,并且在硬盘上的数据页的次序是跟镞索引的逻辑次序一样的。

    <2:>一个非镞的索引就是行的物理次序与索引的次序是不同的。一个非镞索引的叶级包含了指向行数据页的指针。
    在一个表中可以有多个非镞索引,你可以在以下几个情况下考虑使用非镞索引。
    在有很多不同值的列上可以考虑使用非镞索引
    例如:一个part_id列在一个part表中
    select * from employee where emp_id = ’pcm9809f’
    查询语句中用order by 子句的列上可以考虑使用镞索引

    3 查询语句的设计

    SQL Server优化器通过分析查询语句,自动对查询进行优化并决定最有效的执行方案。优化器分析查询语句来决定那个子句可以被优化,并针对可以被优化查询的子句来选择有用的索引。最后优化器比较所有可能的执行方案并选择最有效的一个方案出来。
    在执行一个查询时,用一个where子句来限制必须处理的行数,除非完全需要,否则应该避免在一个表中无限制地读并处理所有的行。
    例如下面的例子,
    select qty from sales where stor_id=7131
    是很有效的比下面这个无限制的查询
    select qty from sales
    避免给客户的最后数据选择返回大量的结果集。允许SQL Server运行满足它目的的函数限制结果集的大小是更有效的。
    这能减少网络I/O并能提高多用户的相关并发时的应用程序性能。因为优化器关注的焦点就是where子句的查询,以利用有用的索引。在表中的每一个索引都可能成为包括在where子句中的侯选索引。为了最好的性能可以遵照下面的用于一个给定列column1的索引。
    第一:在表中的column1列上有一个单索引
    第二:在表中有多索引,但是column1是第一个索引的列不要在where子句中使用没有column1列索引的查询语句,并避免在where子句用一个多索引的非第一个索引的索引。
    这时多索引是没有用的。
    For example, given a multicolumn index on the au_lname, au_fname columns of the authors table in
    the pubs database,
    下面这个query语句利用了au_lname上的索引
    SELECT au_id, au_lname, au_fname FROM authors
    WHERE au_lname = ’White’
    AND au_fname = ’Johnson’
    SELECT au_id, au_lname, au_fname FROM authors
    WHERE au_lname = ’White’
    下面这个查询没有利用索引,因为他使用了多索引的非第一个索引的索引
    SELECT au_id, au_lname, au_fname FROM authors
    WHERE au_fname = ’Johnson’

    测试过程:
    环境:
    PIII900 128M
    win2000+sql server2000企业版
    table name :t_data
    CLUSTERED PRIMARY KEY :id
    Rows:441000

    语句1:
    select * from t_data where
    id in
    (select top 10 id from t_data where id in
    (select top 60000 id from t_data order by id asc)
    order by id desc)
    order by id asc

    时间:390ms

    语句2:
    select * from t_data where
    id in
    (select top 10 id from t_data where id in
    (select top 100000 id from t_data order by id asc)
    order by id desc)
    order by id asc

    时间:4s

    语句3:
    select * from t_data where
    id in
    (select top 10 id from t_data where id in
    (select top 150000 id from t_data order by id asc)
    order by id desc)
    order by id asc

    时间:5s

    语句4:
    select * from t_data where
    id in
    (select top 10 id from t_data where id in
    (select top 200000 id from t_data order by id asc)
    order by id desc)
    order by id asc

    时间:6s

    语句5:
    select * from t_data where
    id in
    (select top 10 id from t_data where id in
    (select top 250000 id from t_data order by id asc)
    order by id desc)
    order by id asc

    时间:过了15m没有出来,中断

    语句6:
    select * from t_data where
    id in
    (select top 10 id from t_data where id in
    (select top 300000 id from t_data order by id asc)
    order by id desc)
    order by id asc

    时间:过了20m没有出来,中断

    语句7:
    select top 60000 id into #a from t_data order by id asc

    create index ind_a_base_id on #a(id)

    select * from t_data where
    id in (select top 10 id from #a order by id desc)
    order by id asc

    时间:20s

    语句8:
    select top 100000 id into #a from t_data order by id asc

    create index ind_a_base_id on #a(id)

    select * from t_data where
    id in (select top 10 id from #a order by id desc)
    order by id asc

    时间:21s

    语句9:
    select top 150000 id into #a from t_data order by id asc

    create index ind_a_base_id on #a(id)

    select * from t_data where
    id in (select top 10 id from #a order by id desc)
    order by id asc

    时间:23s

    语句10:
    select top 200000 id into #a from t_data order by id asc

    create index ind_a_base_id on #a(id)

    select * from t_data where
    id in (select top 10 id from #a order by id desc)
    order by id asc

    时间:24s

    语句11:
    select top 250000 id into #a from t_data order by id asc

    create index ind_a_base_id on #a(id)

    select * from t_data where
    id in (select top 10 id from #a order by id desc)
    order by id asc

    时间:26s

    语句12:
    select top 300000 id into #a from t_data order by id asc

    create index ind_a_base_id on #a(id)

    select * from t_data where
    id in (select top 10 id from #a order by id desc)
    order by id asc

    时间:28s

    语句13:
    select top 400000 id into #a from t_data order by id asc

    create index ind_a_base_id on #a(id)

    select * from t_data where
    id in (select top 10 id from #a order by id desc)
    order by id asc

    时间:29s

    语句14:
    select * from t_data where
    id in
    (select top 10 id from t_data where id in
    (select top 250000 id from t_data order by id asc)
    order by id desc)
    order by id asc
    posted @ 2007-08-27 08:13 CharlieShen| 编辑 收藏

    个人觉得yykele的回答有很不够的地方,“和视图没什么关系”是不可能。

    首写两者都是SQL的数据对象

    再次并且写法也很相似。

    最重要的是在
    服务器的存储和运行过程都几乎是一样的,二者都是以SQL语句集存储的,而且在运行之前都是经过编译的,也就是不用每次都重新编译,这样可以大大提高执行效率。

    顾名思义,其区别一个重在“过程”、一个重在“图”。
    也就是存储过程涉及很多的数据处理,整个是一个复杂的过程。它可以接收参数,相当于一个函数。主要目的是用来处理数据。

    而视图是把现在有数据组合成新的形式展示出来,相当于一张虚拟的表,在运行时可以当作表Table来进行查询(增删改是不行的)。其目的是用来呈现数据。

    事实上,两者其内部实现是基本一样的,提供者在开发这些对象时,是针对不同目的不同应用的。
    我们在使用时,同一件事情,实现的方法可以是多样的,不是说只有那者行,其他的就不行。到底使用什么来实现呢?这要对实际情况进行具体分析,看怎样实现方便,怎样实现高效。


    以下是一些资料:
    存储过程

    存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在
    数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。总的来说,存储过程具有以下一些优点:

    ◆存储过程允许标准组件式编程

    ◆存储过程能够实现较快的执行速度

    ◆存储过程能够减少网络流量

    ◆存储过程可被作为一种安全机制来充分利用

    基本语法如下:
    完整的语法规则如下:

    CREATE PROC [ EDURE ] procedure_name [ ; number ]
    [ { @parameter data_type }
    [ VARYING ] [ = default ] [ OUTPUT ]
    ] [ ,...n ]
    [ WITH
    { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
    [ FOR REPLICATION ]
    AS sql_statement [ ...n ]

    SQL视图

    视图可以被看成是虚拟表或存储查询。可通过视图访问的数据不作为独特的对象存储在
    数据库内。数据库内存储的是 SELECT 语句。SELECT 语句的结果集构成视图所返回的虚拟表。用户可以用引用表时所使用的方法,在 Transact-SQL 语句中通过引用视图名称来使用虚拟表。使用视图可以实现下列任一或所有功能:

    将用户限定在表中的特定行上。
    例如,只允许雇员看见工作跟踪表内记录其工作的行。

    将用户限定在特定列上。
    例如,对于那些不负责处理工资单的雇员,只允许他们看见雇员表中的姓名列、办公室列、工作电话列和部门列,而不能看见任何包含工资信息或个人信息的列。

    将多个表中的列联接起来,使它们看起来象一个表。


    聚合信息而非提供详细信息。
    例如,显示一个列的和,或列的最大值和最小值。

    通过定义 SELECT 语句以检索将在视图中显示的数据来创建视图。SELECT 语句引用的数据表称为视图的基表。在下例中,pubs
    数据库中的 titleview 是一个视图,该视图选择三个基表中的数据来显示包含常用数据的虚拟表:

    CREATE VIEW titleview
    AS
    SELECT title, au_ord, au_lname, price, ytd_sales, pub_id
    FROM authors AS a
    JOIN titleauthor AS ta ON (a.au_id = ta.au_id)
    JOIN titles AS t ON (t.title_id = ta.title_id)

    之后,可以用引用表时所使用的方法在语句中引用 titleview。

    SELECT *
    FROM titleview

    一 个视图可以引用另一个视图。例如,titleview 显示的信息对管理人员很有用,但公司通常只在季度或年度财务报表中才公布本年度截止到现在的财政数字。可以建立一个视图,在其中包含除 au_ord 和 ytd_sales 外的所有 titleview 列。使用这个新视图,客户可以获得已上市的书籍列表而不会看到财务信息:

    CREATE VIEW Cust_titleview
    AS
    SELECT title, au_lname, price, pub_id
    FROM titleview

    视图可用于在多个
    数据库或 Microsoft? SQL Server? 2000 实例间对数据进行分区。分区视图可用于在整个服务器组内分布数据库处理。服务器组具有与服务器聚集相同的性能优点,并可用于支持最大的 Web 站点或公司数据中心的处理需求。原始表被细分为多个成员表,每个成员表包含原始表的行子集。每个成员表可放置在不同服务器数据库中。每个服务器也可得到分区视图。分区视图使用 Transact-SQL UNION 运算符,将在所有成员表上选择的结果合并为单个结果集,该结果集的行为与整个原始表的复本完全一样。例如在三个服务器间进行表分区。在第一个服务器上定义如下的分区视图:

    CREATE VIEW PartitionedView AS
    SELECT *
    FROM MyDatabase.dbo.PartitionTable1
    UNION ALL
    SELECT *
    FROM Server2.MyDatabase.dbo.PartitionTable2
    UNION ALL
    SELECT *
    FROM Server3.MyDatabase.dbo.PartitionTable3

    在其它两个
    服务器上定义类似的分区视图。利用这三个视图,三个服务器上任何引用 PartitionedView 的 Transact-SQL 语句都将看到与原始表中相同的行为。似乎每个服务器上都存在原始表的复本一样,而实际上每个表只有一个成员表和分区视图。有关更多信息,请参见视图使用方案。

    只要所做的修改只影响视图所引用的其中一个基表,就可以更新所有 SQL Server 版本内的视图(可以对其执行 UPDATE、DELETE 或 INSERT 语句)。

    -- Increase the prices for publisher ’0736’ by 10%.
    UPDATE titleview
    SET price = price * 1.10
    WHERE pub_id = ’0736’
    GO

    SQL Server 2000 支持可引用视图的更复杂的 INSERT、UPDATE 和 DELETE 语句。可在视图上定义 INSTEAD OF 触发器,指定必须对基表执行的个别更新以支持 INSERT、UPDATE 或 DELETE 语句。另外,分区视图还支持 INSERT、UDPATE 和 DELETE 语句修改视图所引用的多个成员表。

    索引视图是 SQL Server 2000 具有的功能,可显著提高复杂视图类型的性能,这些视图类型通常在数据仓库或其它决策支持系统中出现。

    视图的结果集通常不保存在
    数据库中,因此视图也称为虚拟表。视图的结果集动态包含在语句逻辑中并在运行时动态生成。有关更多信息,请参见视图解析。

    复 杂的查询(如决策支持系统中的查询)可引用基表中的大量行,并将大量信息聚积在相对较简洁的聚合中,如总和或平均值。SQL Server 2000 支持在执行此类复杂查询的视图上创建聚集索引。当执行 CREATE INDEX 语句时,视图 SELECT 的结果集将永久存储在
    数据库中。SQL 语句此后若引用该视图,响应时间将会显著缩短。对基本数据的修改将自动反映在视图中。

    SQL Server 2000 CREATE VIEW 语句支持 SCHEMABINDING 选项,以防止视图所引用的表在视图未被调整的情况下发生改变。必须为任何创建索引的视图指定 SCHEMABINDING。

    例:创建视图
    Create View TitleView
    AS
    Select ID,Title,PostTime,Hits From [List]
    然后引用Select Top 100 * From TitleView
    用循环输出数据与直接Select Top 100 * From [List]相比速度提高将近30毫秒!
    当然我这里只是举例子,一般情况下对单个表没必要去用视图
    posted @ 2007-08-27 08:12 CharlieShen| 编辑 收藏

    概要
    什么是单一索引,什么又是复合索引呢? 何时新建复合索引,复合索引又需要注意些什么呢?本篇文章主要是对网上一些讨论的总结。

    一.概念

    单一索引是指索引列为一列的情况,即新建索引的语句只实施在一列上。

    用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引)。复合索引的创建方法与创建单一索引的方法完全一样。但复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引。当表的行数远远大于索引键的数目时,使用这种方式可以明显加快表的查询速度。

    同时有两个概念叫做窄索引和宽索引,窄索引是指索引列为1-2列的索引,如果不特殊说明的话一般是指单一索引。宽索引也就是索引列超过2列的索引。

    设计索引的一个重要原则就是能用窄索引不用宽索引,因为窄索引往往比组合索引更有效。拥有更多的窄索引,将给优化程序提供更多的选择余地,这通常有助于提高性能。

    二.使用

    创建索引
    create index idx1 on table1(col1,col2,col3) 
    查询
    select * from table1 where col1= A and col2= B and col3 = C

    这时候查询优化器,不在扫描表了,而是直接的从索引中拿数据,因为索引中有这些数据,这叫覆盖式查询,这样的查询速度非常快。  

    三.注意事项

    1.何时是用复合索引
    在where条件中字段用索引,如果用多字段就用复合索引。一般在select的字段不要建什么索引(如果是要查询select col1 ,col2, col3 from mytable,就不需要上面的索引了)。根据where条件建索引是极其重要的一个原则。注意不要过多用索引,否则对表更新的效率有很大的影响,因为在操作表的时候要化大量时间花在创建索引中.

    2.对于复合索引,在查询使用时,最好将条件顺序按找索引的顺序,这样效率最高。如: 
      IDX1:create   index   idx1   on   table1(col2,col3,col5) 
      select   *   from   table1   where   col2=A   and   col3=B   and   col5=D 

    如果是"select   *   from   table1   where   col3=B   and   col2=A   and   col5=D"
    或者是"select   *   from   table1   where   col3=B"将不会使用索引,或者效果不明显

    3.复合索引会替代单一索引么?
    很多人认为只要把任何字段加进聚集索引,就能提高查询速度,也有人感到迷惑:如果把复合的聚集索引字段分开查询,那么查询速度会减慢吗?带着这个问题,我们来看一下以下的查询速度(结果集都是25万条数据):(日期列fariqi首先排在复合聚集索引的起始列,用户名neibuyonghu排在后列)

    IDX1:create   index   idx1   on   Tgongwen(fariqi,neibuyonghu) 


    (1)select gid,fariqi,neibuyonghu,title from Tgongwen
    where fariqi>'2004-5-5'

    查询速度:2513毫秒

    (2)select gid,fariqi,neibuyonghu,title from Tgongwen
    where fariqi>'2004-5-5' and neibuyonghu='办公室'

    查询速度:2516毫秒

    (3)select gid,fariqi,neibuyonghu,title from Tgongwen
    where neibuyonghu='办公室'

    查询速度:60280毫秒

    从以上试验中,我们可以看到如果仅用聚集索引的起始列作为查询条件和同时用到复合聚集索引的全部列的查询速度是几乎一样的,甚至比用上全部的复合索引列还要略快(在查询结果集数目一样的情况下);而如果仅用复合聚集索引的非起始列作为查询条件的话,这个索引是不起任何作用的。当然,语句1、2的查询速度一样是因为查询的条目数一样,如果复合索引的所有列都用上,而且查询结果少的话,这样就会形成“索引覆盖”,因而性能可以达到最优。同时,请记住:无论您是否经常使用聚合索引的其他列,但其前导列一定要是使用最频繁的列。

    [参考: 查询优化及分页算法方案 http://blog.csdn.net/chiefsailor/archive/2007/05/28/1628339.aspx]

    4.需要在同一列上同时建单一索引和复合索引么?
    试验: sysbase   5.0   表table1   字段:col1,col2,col3 

    试验步骤: 
    (1)建立索引idx1   on   col1 
      执行select   *   from   table1   where   col1=A     使用idx1 
      执行select   *   from   table1   where   col1=A   and   col2=B   也使用idx1 

    (2)删除索引idx1,然后建立idx2   on   (col1,col2)复合索引 
      执行以上两个查询,也都使用idx2 

    (3)如果两个索引idx1,idx2都存在 
      并不是   where   col1='A'用idx1;where   col1=A   and   col2=B  用idx2。 
      其查询优化器使用其中一个以前常用索引。要么都用idx1,要么都用idx2. 
      
    由此可见,
    (1)对一张表来说,如果有一个复合索引 on   (col1,col2),就没有必要同时建立一个单索引 on col1。
    (2)如果查询条件需要,可以在已有单索引
    on col1的情况下,添加复合索引on   (col1,col2),对于效率有一定的提高。
    (3)
    同时建立多字段(包含5、6个字段)的复合索引没有特别多的好处,相对而言,建立多个窄字段(仅包含一个,或顶多2个字段)的索引可以达到更好的效率和灵活性。

    [参考:http://topic.csdn.net/t/20030612/14/1907394.html ]

    5. 一定需要覆盖性查询么?
    通常最好不要采用一个强调完全覆盖查询的策略。如果Select子句中的所有列都被一个非群集索引覆盖,优化程序会识别出这一点,并提供很好的性能。不过,这通常会导致索引过宽,并会过度依赖于优化程序使用该策略的可能性。通常,是用数量更多的窄索引,这对于大量查询来说可以提供更好的性能。
    posted @ 2007-08-27 08:12 CharlieShen| 编辑 收藏

    1、% DPC Time 指在范例间隔期间处理器用在缓延程序调用(DPC)接收和提供服务的百分比。(DPC 正在运行的为比标准间隔优先权低的间隔)。 由于 DPC 是以特权模式执行的,DPC 时间的百分比为特权时间百分比的一部分。这些时间单独计算并且不属于间隔计算总数的一部 分。这个总数显示了作为实例时间百分比的平均忙时。
      2、%Processor Time计数器 如果该参数值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。
      3、% Privileged Time 指非闲置处理器时间用于特权模式的百分比。(特权模式是为操作系统组件和操纵硬件驱动程序而设计的一种处理模式。它允许直接访问硬件和所有内存。另一种模式为用户模式,它是一种为应用程序、环境分系统和整数分系统设计的一种有限处理模式。操作系统将应用程序线程转换成特权模式以访问操作系统服务)。特权时间的 % 包括为间断和 DPC 提供服务的时间。特权时间比率高可能是由于失败设备产生的大数量的间隔而引起的。这个计数器将平均忙时作为样本时间的一部分显示。
      4、% User Time表示耗费CPU的数据库操作,如排序,执行aggregate functions等。如果该值很高,可考虑增加索引,尽量使用简单的表联接,水平分割大表格等方法来降低该值。 Physical Disk: Curretn Disk Queue Length计数器该值应不超过磁盘数的1.5~2倍。要提高性能,可增加磁盘。 SQLServer:Cache Hit Ratio计数器该值越高越好。如果持续低于80%,应考虑增加内存。 注意该参数值是从SQL Server启动后,就一直累加记数,所以运行经过一段时间后,该值将不能反映系统当前值。
      47、分析select emp_name form employee where salary > 3000 在此语句中若salary是Float类型的,则优化器对其进行优化为Convert(float,3000),因为3000是个整数,我们应在编程时使用3000.0而不要等运行时让DBMS进行转化。同样字符和整型数据的转换。
      48、查询的关联同写的顺序
      select a.personMemberID, * from chineseresume a,personmember b where personMemberID = b.referenceid and a.personMemberID = 'JCNPRH39681' (A = B ,B = '号码')
      select a.personMemberID, * from chineseresume a,personmember b where a.personMemberID = b.referenceid and a.personMemberID = 'JCNPRH39681' and b.referenceid = 'JCNPRH39681' (A = B ,B = '号码', A = '号码')
      select a.personMemberID, * from chineseresume a,personmember b where b.referenceid = 'JCNPRH39681' and a.personMemberID = 'JCNPRH39681' (B = '号码', A = '号码')
      49、
      (1)IF 没有输入负责人代码 THEN code1=0 code2=9999 ELSE code1=code2=负责人代码 END IF 执行SQL语句为: Select 负责人名 FROM P2000 Where 负责人代码>=:code1 AND负责人代码 <=:code2
      (2)IF 没有输入负责人代码 THEN  Select 负责人名 FROM P2000 ELSE code= 负责人代码 Select 负责人代码 FROM P2000 Where 负责人代码=:code END IF 第一种方法只用了一条SQL语句,第二种方法用了两条SQL语句。在没有输入负责人代码时,第二种方法显然比第一种方法执行效率高,因为它没有限制条件; 在输入了负责人代码时,第二种方法仍然比第一种方法效率高,不仅是少了一个限制条件,还因相等运算是最快的查询运算。我们写程序不要怕麻烦
      50、关于JOBCN现在查询分页的新方法(如下),用性能优化器分析性能的瓶颈,如果在I/O或者网络的速度上,如下的方法优化切实有效,如果在CPU或者内存上,用现在的方法更好。请区分如下的方法,说明索引越小越好。
      begin
      DECLARE @local_variable table (FID int identity(1,1),ReferenceID varchar(20))
      insert into @local_variable (ReferenceID)
      select top 100000 ReferenceID from chineseresume order by ReferenceID
      select * from @local_variable where Fid > 40 and fid <= 60
      end 和
      begin
      DECLARE @local_variable table (FID int identity(1,1),ReferenceID varchar(20))
      insert into @local_variable (ReferenceID)
      select top 100000 ReferenceID from chineseresume order by updatedate
      select * from @local_variable where Fid > 40 and fid <= 60
      end 的不同
      begin
      create table #temp (FID int identity(1,1),ReferenceID varchar(20))
      insert into #temp (ReferenceID)
      select top 100000 ReferenceID from chineseresume order by updatedate
      select * from #temp where Fid > 40 and fid <= 60 drop table #temp
      end
    posted @ 2007-08-27 08:11 CharlieShen| 编辑 收藏

     可以通过如下方法来优化查询:
      1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要.
      2、纵向、横向分割表,减少表的尺寸(sp_spaceuse)
      3、升级硬件
      4、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的几个值的字段建单一索引如性别字段
      5、提高网速;
      6、扩大服务器的内存,Windows 2000和SQL server 2000能支持4-8G的内存。配置虚拟内存:虚拟内存大小应基于计算机上并发运行的服务进行配置。运行 Microsoft SQL Server? 2000 时,可考虑将虚拟内存大小设置为计算机中安装的物理内存的 1.5 倍。如果另外安装了全文检索功能,并打算运行 Microsoft 搜索服务以便执行全文索引和查询,可考虑:将虚拟内存大小配置为至少是计算机中安装的物理内存的 3 倍。将 SQL Server max server memory 服务器配置选项配置为物理内存的 1.5 倍(虚拟内存大小设置的一半)。
      7、增加服务器 CPU个数;但是必须明白并行处理串行处理更需要资源例如内存。使用并行还是串行程是MsSQL自动评估选择的。单个任务分解成多个任务,就可以在处理器上运行。例如耽搁查询的排序、连接、扫描和GROUP BY字句同时执行,SQL SERVER根据系统的负载情况决定最优的并行等级,复杂的需要消耗大量的CPU的查询最适合并行处理。但是更新操作Update,Insert, Delete还不能并行处理。
      8、如果是使用like进行查询的话,简单的使用index是不行的,但是全文索引,耗空间。 like 'a%' 使用索引 like '%a' 不使用索引用 like '%a%' 查询时,查询耗时和字段值总长度成正比,所以不能用CHAR类型,而是VARCHAR。对于字段的值很长的建全文索引。
      9、DB Server 和APPLication Server 分离;OLTP和OLAP分离
      10、分布式分区视图可用于实现数据库服务器联合体。联合体是一组分开管理的服务器,但它们相互协作分担系统的处理负荷。这种通过分区数据形成数据库服务器联合体的机制能够扩大一组服务器,以支持大型的多层 Web 站点的处理需要。有关更多信息,参见设计联合数据库服务器。(参照SQL帮助文件'分区视图')
      a、在实现分区视图之前,必须先水平分区表
      b、在创建成员表后,在每个成员服务器上定义一个分布式分区视图,并且每个视图具有相同的名称。这样,引用分布式分区视图名的查询可以在任何一个成员服务器上运行。系统操作如同每个成员服务器上都有一个原始表的复本一样,但其实每个服务器上只有一个成员表和一个分布式分区视图。数据的位置对应用程序是透明的。
      11、重建索引 DBCC REINDEX ,DBCC INDEXDEFRAG,收缩数据和日志 DBCC SHRINKDB,DBCC SHRINKFILE. 设置自动收缩日志.对于大的数据库不要设置数据库自动增长,它会降低服务器的性能。在T-sql的写法上有很大的讲究,下面列出常见的要点:首先,DBMS处理查询计划的过程是这样的:
      1、 查询语句的词法、语法检查
      2、 将语句提交给DBMS的查询优化器
      3、 优化器做代数优化和存取路径的优化
      4、 由预编译模块生成查询规划
      5、 然后在合适的时间提交给系统处理执行
      6、 最后将执行结果返回给用户其次,看一下SQL SERVER的数据存放的结构:一个页面的大小为8K(8060)字节,8个页面为一个盘区,按照B树存放。
      12、Commit和rollback的区别 Rollback:回滚所有的事物。 Commit:提交当前的事物. 没有必要在动态SQL里写事物,如果要写请写在外面如: begin tran exec(@s) commit trans 或者将动态SQL 写成函数或者存储过程。
      13、在查询Select语句中用Where字句限制返回的行数,避免表扫描,如果返回不必要的数据,浪费了服务器的I/O资源,加重了网络的负担降低性能。如果表很大,在表扫描的期间将表锁住,禁止其他的联接访问表,后果严重。
      14、SQL的注释申明对执行没有任何影响
      15、尽可能不使用光标,它占用大量的资源。如果需要row-by-row地执行,尽量采用非光标技术,如:在客户端循环,用临时表,Table变量,用子查询,用Case语句等等。游标可以按照它所支持的提取选项进行分类:
      只进:必须按照从第一行到最后一行的顺序提取行。FETCH NEXT 是唯一允许的提取操作,也是默认方式。
      可滚动性:可以在游标中任何地方随机提取任意行。
      游标的技术在SQL2000下变得功能很强大,他的目的是支持循环。
      有四个并发选项
      READ_ONLY:不允许通过游标定位更新(Update),且在组成结果集的行中没有锁。
      OPTIMISTIC WITH valueS:乐观并发控制是事务控制理论的一个标准部分。乐观并发控制用于这样的情形,即在打开游标及更新行的间隔中,只有很小的机会让第二个用户更新某一行。当某个游标以此选项打开时,没有锁控制其中的行,这将有助于最大化其处理能力。如果用户试图修改某一行,则此行的当前值会与最后一次提取此行时获取的值进行比较。如果任何值发生改变,则服务器就会知道其他人已更新了此行,并会返回一个错误。如果值是一样的,服务器就执行修改。
    选择这个并发选项将迫使用户或程序员承担责任,处理那些表示其它用户已经对其进行了修改的错误。应用程序收到这种错误时采取的典型措施就是刷新游标,获得其新值,然后让用户决定是否对新值进行修改。
      OPTIMISTIC WITH ROW VERSIONING:此乐观并发控制选项基于行版本控制。使用行版本控制,其中的表必须具有某种版本标识符,服务器可用它来确定该行在读入游标后是否有所更改。在 SQL Server 中,这个性能由 timestamp 数据类型提供,它是一个二进制数字,表示数据库中更改的相对顺序。每个数据库都有一个全局当前时间戳值:@@DBTS。每次以任何方式更改带有 timestamp 列的行时,SQL Server 先在时间戳列中存储当前的 @@DBTS 值,然后增加 @@DBTS 的值。如果某个表具有 timestamp 列,则时间戳会被记到行级。服务器就可以比较某行的当前时间戳值和上次提取时所存储的时间戳值,从而确定该行是否已更新。服务器不必比较所有列的值,只需比较 timestamp 列即可。如果应用程序对没有 timestamp 列的表要求基于行版本控制的乐观并发,则游标默认为基于数值的乐观并发控制。
      SCROLL LOCKS:这个选项实现悲观并发控制。在悲观并发控制中,在把数据库的行读入游标结果集时,应用程序将试图锁定数据库行。在使用服务器游标时,将行读入游标时会在其上放置一个更新锁。如果在事务内打开游标,则该事务更新锁将一直保持到事务被提交或回滚;当提取下一行时,将除去游标锁。如果在事务外打开游标,则提取下一行时,锁就被丢弃。因此,每当用户需要完全的悲观并发控制时,游标都应在事务内打开。更新锁将阻止任何其它任务获取更新锁或排它锁,从而阻止其它任务更新该行。然而,更新锁并不阻止共享锁,所以它不会阻止其它任务读取行,除非第二个任务也在要求带更新锁的读取。
      滚动锁
      根据在游标定义的 SELECT 语句中指定的锁提示,这些游标并发选项可以生成滚动锁。滚动锁在提取时在每行上获取,并保持到下次提取或者游标关闭,以先发生者为准。下次提取时,服务器为新提取中的行获取滚动锁,并释放上次提取中行的滚动锁。滚动锁独立于事务锁,并可以保持到一个提交或回滚操作之后。如果提交时关闭游标的选项为关,则 COMMIT 语句并不关闭任何打开的游标,而且滚动锁被保留到提交之后,以维护对所提取数据的隔离。
      所获取滚动锁的类型取决于游标并发选项和游标 SELECT 语句中的锁提示。
    锁提示 只读 乐观数值 乐观行版本控制 锁定
    无提示 未锁定 未锁定 未锁定 更新
    NOLOCK 未锁定 未锁定 未锁定 未锁定
    HOLDLOCK 共享 共享 共享 更新
    UPDLOCK 错误 更新 更新 更新
    TABLOCKX 错误 未锁定 未锁定 更新
    其它 未锁定 未锁定 未锁定 更新
      *指定 NOLOCK 提示将使指定了该提示的表在游标内是只读的。
      16、用Profiler来跟踪查询,得到查询所需的时间,找出SQL的问题所在;用索引优化器优化索引
      17、注意UNion和UNion all 的区别。UNION all好
      18、注意使用DISTINCT,在没有必要时不要用,它同UNION一样会使查询变慢。重复的记录在查询里是没有问题的
      19、查询时不要返回不需要的行、列
      20、用sp_configure 'query governor cost limit'或者SET QUERY_GOVERNOR_COST_LIMIT来限制查询消耗的资源。当评估查询消耗的资源超出限制时,服务器自动取消查询,在查询之前就扼杀掉。 SET LOCKTIME设置锁的时间
      21、用select top 100 / 10 Percent 来限制用户返回的行数或者SET ROWCOUNT来限制操作的行
      22、在SQL2000以前,一般不要用如下的字句: "IS NULL", "<>", "!=", "!>", "!<", "NOT", "NOT EXISTS", "NOT IN", "NOT LIKE", and "LIKE '%500'",因为他们不走索引全是表扫描。也不要在Where字句中的列名加函数,如Convert,substring等,如果必须用函数的时候,创建计算列再创建索引来替代.还可以变通写法:Where SUBSTRING(firstname,1,1) = 'm'改为Where firstname like 'm%'(索引扫描),一定要将函数和列名分开。并且索引不能建得太多和太大。NOT IN会多次扫描表,使用EXISTS、NOT EXISTS ,IN , LEFT OUTER JOIN 来替代,特别是左连接,而Exists比IN更快,最慢的是NOT操作.如果列的值含有空,以前它的索引不起作用,现在2000的优化器能够处理了。相同的是IS NULL,"NOT", "NOT EXISTS", "NOT IN"能优化她,而"<>"等还是不能优化,用不到索引。
      23、使用Query Analyzer,查看SQL语句的查询计划和评估分析是否是优化的SQL。一般的20%的代码占据了80%的资源,我们优化的重点是这些慢的地方。
      24、如果使用了IN或者OR等时发现查询没有走索引,使用显示申明指定索引: Select * FROM PersonMember (INDEX = IX_Title) Where processid IN ('男','女')
      25、将需要查询的结果预先计算好放在表中,查询的时候再Select。这在SQL7.0以前是最重要的手段。例如医院的住院费计算。
      26、MIN() 和 MAX()能使用到合适的索引。
      27、数据库有一个原则是代码离数据越近越好,所以优先选择Default,依次为Rules,Triggers, Constraint(约束如外健主健CheckUNIQUE……,数据类型的最大长度等等都是约束),Procedure.这样不仅维护工作小,编写程序质量高,并且执行的速度快。
      28、如果要插入大的二进制值到Image列,使用存储过程,千万不要用内嵌Insert来插入(不知JAVA是否)。因为这样应用程序首先将二进制值转换成字符串(尺寸是它的两倍),服务器受到字符后又将他转换成二进制值.存储过程就没有这些动作: 方法:Create procedure p_insert as insert into table(Fimage) values (@image), 在前台调用这个存储过程传入二进制参数,这样处理速度明显改善。
      29、Between在某些时候比IN 速度更快,Between能够更快地根据索引找到范围。用查询优化器可见到差别。 select * from chineseresume where title in ('男','女') Select * from chineseresume where between '男' and '女' 是一样的。由于in会在比较多次,所以有时会慢些。
      30、在必要是对全局或者局部临时表创建索引,有时能够提高速度,但不是一定会这样,因为索引也耗费大量的资源。他的创建同是实际表一样。
      31、不要建没有作用的事物例如产生报表时,浪费资源。只有在必要使用事物时使用它。
      32、用OR的字句可以分解成多个查询,并且通过UNION 连接多个查询。他们的速度只同是否使用索引有关,如果查询需要用到联合索引,用UNION all执行的效率更高.多个OR的字句没有用到索引,改写成UNION的形式再试图与索引匹配。一个关键的问题是否用到索引。
       33、尽量少用视图,它的效率低。对视图操作比直接对表操作慢,可以用stored procedure来代替她。特别的是不要用视图嵌套,嵌套视图增加了寻找原始资料的难度。我们看视图的本质:它是存放在服务器上的被优化好了的已经产生了查询规划的SQL。对单个表检索数据时,不要使用指向多个表的视图,直接从表检索或者仅仅包含这个表的视图上读,否则增加了不必要的开销,查询受到干扰.为了加快视图的查询,MsSQL增加了视图索引的功能。
      34、没有必要时不要用DISTINCT和ORDER BY,这些动作可以改在客户端执行。它们增加了额外的开销。这同UNION 和UNION ALL一样的道理。
      select top 20 ad.companyname,comid,position,ad.referenceid,worklocation, convert(varchar(10),ad.postDate,120) as postDate1,workyear,degreedescription FROM jobcn_query.dbo.COMPANYAD_query ad where referenceID in('JCNAD00329667','JCNAD132168','JCNAD00337748','JCNAD00338345',
      'JCNAD00333138','JCNAD00303570','JCNAD00303569',
      'JCNAD00303568','JCNAD00306698','JCNAD00231935','JCNAD00231933',
      'JCNAD00254567','JCNAD00254585','JCNAD00254608',
      'JCNAD00254607','JCNAD00258524','JCNAD00332133','JCNAD00268618',
      'JCNAD00279196','JCNAD00268613') order by postdate desc
      35、在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数。
      36、当用Select INTO时,它会锁住系统表(sysobjects,sysindexes等等),阻塞其他的连接的存取。创建临时表时用显示申明语句,而不是 select INTO. drop table t_lxh begin tran select * into t_lxh from chineseresume where name = 'XYZ' --commit 在另一个连接中Select * from sysobjects可以看到 Select INTO 会锁住系统表,Create table 也会锁系统表(不管是临时表还是系统表)。所以千万不要在事物内使用它!!!这样的话如果是经常要用的临时表请使用实表,或者临时表变量。
      37、一般在GROUP BY 个HAVING字句之前就能剔除多余的行,所以尽量不要用它们来做剔除行的工作。他们的执行顺序应该如下最优:select 的Where字句选择所有合适的行,Group By用来分组个统计行,Having字句用来剔除多余的分组。这样Group By 个Having的开销小,查询快.对于大的数据行进行分组和Having十分消耗资源。如果Group BY的目的不包括计算,只是分组,那么用Distinct更快
      38、一次更新多条记录比分多次更新每次一条快,就是说批处理好
      39、少用临时表,尽量用结果集和Table类性的变量来代替它,Table 类型的变量比临时表好
      40、在SQL2000下,计算字段是可以索引的,需要满足的条件如下:
      a、计算字段的表达是确定的
      b、不能用在TEXT,Ntext,Image数据类型
      c、必须配制如下选项 ANSI_NULLS = ON, ANSI_PADDINGS = ON, …….
      41、尽量将数据的处理工作放在服务器上,减少网络的开销,如使用存储过程。存储过程是编译好、优化过、并且被组织到一个执行规划里、且存储在数据库中的SQL语句,是控制流语言的集合,速度当然快。反复执行的动态SQL,可以使用临时存储过程,该过程(临时表)被放在Tempdb中。以前由于SQL SERVER对复杂的数学计算不支持,所以不得不将这个工作放在其他的层上而增加网络的开销。SQL2000支持UDFs,现在支持复杂的数学计算,函数的返回值不要太大,这样的开销很大。用户自定义函数象光标一样执行的消耗大量的资源,如果返回大的结果采用存储过程
      42、不要在一句话里再三的使用相同的函数,浪费资源,将结果放在变量里再调用更快
      43、Select COUNT(*)的效率教低,尽量变通他的写法,而EXISTS快.同时请注意区别: select count(Field of null) from Table 和 select count(Field of NOT null) from Table 的返回值是不同的!!!
      44、当服务器的内存够多时,配制线程数量 = 最大连接数+5,这样能发挥最大的效率;否则使用 配制线程数量<最大连接数启用SQL SERVER的线程池来解决,如果还是数量 = 最大连接数+5,严重的损害服务器的性能。
      45、按照一定的次序来访问你的表。如果你先锁住表A,再锁住表B,那么在所有的存储过程中都要按照这个顺序来锁定它们。如果你(不经意的)某个存储过程中先锁定表B,再锁定表A,这可能就会导致一个死锁。如果锁定顺序没有被预先详细的设计好,死锁很难被发现
      46、通过SQL Server Performance Monitor监视相应硬件的负载 Memory: Page Faults / sec计数器如果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。
    posted @ 2007-08-27 08:10 CharlieShen| 编辑 收藏

    查询速度慢的原因很多,常见如下几种:
      1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)
      2、I/O吞吐量小,形成了瓶颈效应。
      3、没有创建计算列导致查询不优化。
      4、内存不足
      5、网络速度慢
      6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)
      7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)
      8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。
      9、返回了不必要的行和列
      10、查询语句不好,没有优化

    posted @ 2007-08-27 08:09 CharlieShen| 编辑 收藏