2010-02-01 Mon
每年的春运总是牵动着无数中国人的心,顺顺利利回家、高高兴兴团圆是每个身在异乡的中国人此时最急切的心愿。为了让大家回家过年更方便,重装上阵的“谷歌春运地图”在谷歌中国地图团队的努力下,今天正式上线!更加丰富的内容、更加强大的功能必将带给大家前所未有的体验。
与以往不同的是,今年的谷歌春运地图提供了更加完整的交通、出游和节日休闲购物等各类信息。包括全国31个主要城市的数千个火车售票点、160个机场的实时航班状态查询、省际高速路况、天气和最新春运资讯。不仅如此,春运地图还整合了北京,上海,武汉,成都,西安,广州六大城市春节期间的烟花禁放区域和近千个吃喝玩乐好去处,让你安全、开心地过大年!
1)火车售票:在“谷歌春运地图”上,你可以通过火车票查询,找到回家的车次和价格 。然后,你可以输入自己的位置,查找最近的火车售票点。如果你动作晚了,没有在第一时间买到回家的票, 那你不妨通过车次查询,找到“谷歌生活”为你搜集到的网友在各个网站上发布的车票转让信息。

2) 航班信息:航班是否准时起飞?归家的亲人是否已经上路?你可以键入飞机航班号,就知道飞机是否按时起飞。这些内容是实时的呦!全国160个机场的实时流量信息尽在你的掌握之中!

3) 高速路况:想开车回家吗?谷歌春运地图还整合了“中国公路信息网”的最新内容,出发前务必了解一下,千万别在这个时候被困在路上。

4)六大城市春节好去处:除了与春运相关的交通信息,谷歌春运地图还为大家提供了北京、上海、广州、西安、武汉和成都六大城市的休闲娱乐场所信息。试试看,你可能会发现自己竟然还不知道的新商场、餐厅、酒吧和KTV。过年了,让谷歌春运地图帮你实现城市发现之旅吧!快乐节日将会由你带给家人和朋友!




5) 如果你有自己的博客或网站,不妨嵌入谷歌地图。这样,读者从你的网站上就可以直接查看到这些信息喽!

请即登录谷歌春运地图, 立即体验。
周六上午自然醒,睁开眼就看见盖老咪看着我笑,他说做了一个梦,梦见盖小咪说:“射雕英雄传第一章第一节到此结束。” 这个梦把盖老咪乐醒了。
上午一边练瑜伽,一边看李敖的大学演讲,煲汤。
午饭后看了《福尔摩斯》,新片,挺有意思的。然后我们拉着小车去买菜了,中途决定去看房,于是被中介带着看了四五套房子,天黑之前买足了下一周的蔬菜和肉。跟盖老咪一起做饭,晚饭后看了套新片《成事在人》,可能是在户外着凉了,头疼。
《成事在人》讲述的是南非领袖孟德拉与橄榄球队跳羚的故事,我们都觉得很好看,Beyond有首歌‘光辉岁月’,就是向孟德拉致敬的。于是我和盖老咪赶紧搜到歌词,一起唱,凌晨12点。
关灯后,这晚的卧谈主题是关于文学家的,我们聊了很久很久,我们比赛,看谁记得最多的文学家,盖老咪按着我不让我上厕所,因为怕我作弊,中途跑去翻书。肚子饿,起床吃饼干的时候已经凌晨两点。
都不知道是周六哪个环节出了问题,或者是从上年年尾开始积劳成疾,周日醒来胳膊和脖子就僵硬了,很痛,稍微动一下,呼吸,打喷嚏我都感觉到身体的崩溃,痛得心惊胆跳的。盖老咪和盖小菊照顾我,于是一整天,我都躺在床上,听盖老咪给我下载的李敖访谈,有时候看见近年的李敖有点老态,他自己也这样认为,心挺酸的,可是谁也逃避不了啊。李敖太牛了,以至于他那么风流我都觉得他超可爱。
盖老咪整天地照料着我,喂我吃东西,扶我上下床,还做饭给我吃,其实整天躺在床上的时光也是很美好的,阳光很充足,照在脚丫子上,北京的冬天朝南的房间特别温暖,不用开暖气,穿短袖就够了,阳光晒着脚丫,晒着大腿和手臂,晒着鼻尖,拿一本很轻的书,一边看一边跟盖老咪说说话。。。
傍晚做饭的时候我们谈起古代的英雄,他说要当李世民,我呢,我要当成吉思汗,我觉得胡人啊,蒙古人啊特别有型,可惜匈奴不复存在了(又或者匈牙利人的祖先是匈奴?)
晚上盖小菊和丰丰一起回来了,我们一起看了一套烂片《Eagle Eye》,其实我觉得盖小菊和丰丰真挺配的,我知道他们真的拍拖的话,我会很开心。我特别特别希望他们能在一起...
周一上午休病假,颈椎好痛,吃了消炎药,胃也开始疼了。。。
本文翻译自Jonathan Lewis的文章. Plan Stability in Oracle 8i/9i, 可以到此下载这篇文章的word版本. Stored Outlines in Oracle 8
Oracle 8i/9i中的执行计划稳定性
找出如何使用”存储概要”来提高应用的性能的方法,即使你无法修改源代码,调整索引或者胡乱摆弄配置..
by Jonathan Lewis (jonathan@jlcomp.demon.co.uk)
工具箱: 为了测试需要,这篇文章将仅仅涉及可在一个SQL*Plus会话中运行的简单SQL与PL/SQL代码. 读者将需要拥有一些特别的权限(典型的终端用户一般没有这些权限),另外,还需要熟悉一些基本SQL的技能. 本文从Oracle8i开始讲起, 接着讨论Oracle9i, 在9i部分将提供多个针对存储概要的生成与处理的改进.
针对黑盒的后门
如果你是这样一个DBA,在你负责维护的Oracle数据库上运行的是一个第三方应用程序, 你一定曾经遇到这样的困惑, 库缓存(Library Cache)中有一些运行的异常缓慢并且代价高昂的SQL,但是只能在源代码中添加提示才能解决问题.
从Oracle8.1开始,你不再需要重写SQL以添加提示了,可以在不调整代码的情况下使得提示生效.这个特性就是存储概要,也即执行计划稳定性,它的原理也很简单:存储信息到数据库中,告诉数据库”如果发现一条SQL语句与XXX长得像,就将这些提示放到如下这些位置”.
实际上,这将给你如下三种可能的好处.首先,可以优化那部分代价昂贵的语句.其次,如果存在一些Oracle需要花费很长时间进行优化(而不是执行)的其他语句,可以利用它来节约时间并降低优化阶段的争用.最后,它为了提供了一个使用新的cusror_sharing参数的机会同时又不用付出失去最优执行路径的损失.
在Oracle8中让它起作用有几个问题需要处理(在Oracle9中大部分哦都去掉了), 但是,通常都可以很容易的利用这个特性.
背景/概述
为了展示如何善用存储概要,我们将从一个包含无法修改源代码的存储过程开始, 显然, 这个存储过程会包含一个运行异常无效的SQL.
我们将看到,我们可以如何捕捉SQL语句以及它在数据库中的当前执行路径的细节,发现一些提示来提高这个SQL的性能,然后, 并且使得这条语句在将来的任何时候运行的时候都使用我们指定的提示.
在下面的展示中, 我们将创建一个用户,在这个用户的Schema中 一张表,并且创建一个存储过程来访问这张表-但是仅仅为了有趣-我们将在这个存储过程上使用工具wrap, 以致我们无法对这段代码做逆向工程.
这个演示将默认存储概要框架已经在数据库创建是自动安装了.
初步配置
创建一个用户并使其拥有如下权限:create session,create table,create procedure,create any outline,以及alter session. 以此用户登录并运行以下脚本来创建表.
create table so_demo (
n1 number,
n2 number,
v1 varchar2(10)
)
;
insert into so_demo values (1,1,’One’);
create index sd_i1 on so_demo(n1);
create index sd_i2 on so_demo(n2);
analyze table so_demo compute statistics;
接着,需要如下代码来创建存储过程以访问这个表. 创建一个名为c_proc.sql的脚本并包含以下内容:
create or replace procedure get_value (
i_n1 in number,
i_n2 in number,
io_v1 out varchar2
)
as
begin
select v1
into io_v1
from so_demo
where n1 = i_n1
and n2 = i_n2
;
end;
/
当然可以直接运行c_proc.sql脚本来创建这个存储过程,但是,为了测试效果,到操作系统中运行如下命令:
wrap iname=c_proc.sql
返回的信息应该是:
Processing c_proc.sql to c_proc.plb
运行难以理解的脚本c_proc.plb而不是c_proc.sql来创建存储过程, 你将会发现, 在user_source视图中再也找不到目标SQL 语句的任何一点蛛丝马迹.
这个应用到底想做什么?
现在, 我们已经有了想要假装运行的应用了,或许还可以考虑将sql_trace打开来看看它到底在做什么. 毋须吃惊, 这个SQL语句运行一个全表扫描来得到想要的数据.
在这个小小的测试中, 全表扫描可能是最有效的选择了,但是,我们假定当Oracle使用and-equal选项将我们的单列索引组合起来的执行路径可以获得最佳性能.
使用存储概要来解决这个问题,答案就很简单了. 实际上,有多种方法来实现我们想要达到的目的,因此, 不要将这个例子当作终极策略. Oracle一直在不断推出新特性以使得工作更加轻松,在这儿描述的方法在将来的版本中将无可避免的变得过时.
你想要应用如何去做?
让Oracle按照我们想要的去做需要分三个阶段:
必须不断的停止/开始新的会话以确保pl/sql 没有缓存这个游标. 存储概要仅仅在游标被解析的时候才能被创建与应用, 因此必须确保已经存在的相关游标已经关闭.
因此创建一个会话,并执行以下命令:
alter session set create_stored_outlines = demo;
接着运行一小段匿名块来执行这个存储过程,例如:
declare
m_value varchar2(10);
begin
get_value(1, 1, m_value);
end;
/
然后停止收集执行路径(不然接着要运行的部分SQL也将出现在存储概要的表中,使得使得事情变得更加复杂).
alter session set create_stored_outlines = false;
为了看到我们活动的结果,查询以下视图可以让我们看到Oracle为我们创建并保存的存储概要的细节.
select name, category, used, sql_text
from user_outines
where category = ‘DEMO’;
NAME CATEGORY USED
—————————— —————————— ———
SQL_TEXT
——————————————————————————–
SYS_OUTLINE_020503165427311 DEMO UNUSED
SELECT V1 FROM SO_DEMO WHERE N1 = :b1 AND N2 = :b2
select name, stage, hint
from user_outline_hints
where name = ‘ SYS_OUTLINE_020503165427311′;
NAME STAGE HINT
—————————— ———- ——————————–
SYS_OUTLINE_020503165427311 3 NO_EXPAND
SYS_OUTLINE_020503165427311 3 ORDERED
SYS_OUTLINE_020503165427311 3 NO_FACT(SO_DEMO)
SYS_OUTLINE_020503165427311 3 FULL(SO_DEMO)
SYS_OUTLINE_020503165427311 2 NOREWRITE
SYS_OUTLINE_020503165427311 1 NOREWRITE
我们可以看到,有一个类目为demo有且仅有一个存储概要,研究这个存储概要的sql_text将发现它与我们原来的PL/SQL源中的SQL类似但又不完全一致. 这一点非常重要, 只有在将要运行的sql_text与保存在存储概要中的sql_text非常接近的时候, Oracle才会使用这个存储概要. 实际上, 在Oracle8i中, 这个SQL必须完全匹配, 这也是最初使用存储概要时的一个致命的问题.
从列表中可以看出,存储概要仅仅是一组提示, 这些提示描述Oracle运行特定SQL将要采取的行动. 这个执行计划使用了一个全表扫描操作-哪怕是简单到只是一个全表扫描, Oracle也使用了大量的提示来确保它的执行.
注意,存储概要总是归属于一个类目;在这个例子中是demo类目,这是我们在最初的alter session命令中指定的. 如果我们最初的命令中仅仅指定True而不是demo的话,将会发现存储概要虽在的类目为default.
存储概要也拥有名字, 并且这个名字必须在整个数据库中保持唯一.任何两个存储概要都不能拥有同一个名字, 即使它们是由不同的用户产生的.实际上,存储概要没有属主,它们只有创建者. 如果你创建一个存储概要并且刚刚好与我将要运行的一段SQL语句匹配,接下来Oracle将应用你的这一组提示到我的文本上-即使这些提示在我的Schema中是完全无意义的. (这给我们提供了一种完全不同的伪装存储概要的选项,这将在另外一篇文章中介绍). 你可能已经注意到,当Oracle自动生成存储概要的时候,它的名字有一个简单的格式-包含一个到最近的微秒的时间戳.
接着调优我们的问题SQL, 我们判断, 如果我们能够注入提示/*+ and_equal(so_demo, sd_i1, sd_i2) */,Oracle将使用我们期望的执行路径,因此我们明确的创建如下存储概要:
create or replace outline so_fix
for category demo on
select /*+ and_equal(so_demo, sd_i1, sd_i2) */ v1
from so_demo
where n1 = 1
and n2 = 2;
这个语句创建了一个显示命名为so_fix的存储概要到我们的demo类目.通过指定谓词name = ‘SO_FIX’来查询user_outlines和user_outline_hints,可以看到这个存储概要到底长啥样.
NAME CATEGORY USED
—————————— —————————— ———
SQL_TEXT
——————————————————————————–
SO_FIX DEMO UNUSED
select /*+ and_equal(so_demo, sd_i1, sd_i2) */ v1
from so_demo
where n1 = 1
and n2 = 2
NAME STAGE HINT
—————————— ———- ——————————–
SO_FIX 3 NO_EXPAND
SO_FIX 3 ORDERED
SO_FIX 3 NO_FACT(SO_DEMO)
SO_FIX 3 AND_EQUAL(SO_DEMO SD_I1 SD_I2)
SO_FIX 2 NOREWRITE
SO_FIX 1 NOREWRITE
请特别注意, FULL(SO_DEMO)所在的行已经被替换成了AND_EQUAL(SO_DEMO SD_I1 SD_I2),这也正是我们想要看到的.
现在,我们必须交换这两个存储概要.我们希望每次Oracle看到原来的文本的时候都使用我们的新的提示列表,我们必须欺骗Oracle(来达到这一点).视图user_outlines与user_outline_hints是由schemaoutln中的两个表(分别为ol$和ol$hints)生成的,我们将不得不直接修改这两张表; 这意味着要使用outln登录到数据库或者使用包含更新这两张表的权限的账户登录.
幸运的是,outln schema里面的这两张表不包含任何引用完整性约束.方便的是,表ol$(outline)与表ol$hints(hint)之间的关系是通过存储概要的名称(存储在列ol_name中)来定义的.因此,通过非常仔细地检查存储概要的名称,我们可以通过在ol$hints表上替换两个存储概要的名称来交换它们的提示,就像下面的SQL这样:
update outln.ol$hints
set ol_name =
decode(
ol_name,
‘SO_FIX’,'SYS_OUTLINE_020503165427311′,
‘SYS_OUTLINE_020503165427311′,’SO_FIX’
)
where ol_name in (’SYS_OUTLINE_020503165427311′,’SO_FIX’)
;
侵入一个如此接近Oracle内核的内容,特别是在一个手册中给出注释,你可能会感觉到一点的不自在-但是这个更新操作实际上是经过Oracle官方认可的:参见Metalink Note: 92202.1 Dated 5th June 2000.然而,这个注释还有一点没有提及, 还需要做第二个更新操作来确保与每个存储概要相关的提示的数量保持一致.如果没有做这件事,你将发现部分存储概要将在export/import的时候被破坏或毁坏.
update outln.ol$ ol1
set hintcount = (
select hintcount
from ol$ ol2
where ol2.ol_name in (’SYS_OUTLINE_020503165427311′,’ SO_FIX’)
and ol2.ol_name != ol1.ol_name
)
where
ol1.ol_name in (’SYS_OUTLINE_020503165427311′,’SO_FIX’)
;
一旦交换操作完成, 你就可以登录一个新的会话,告诉Oracle开始使用存储概要,重新运行这个存储过程并退出;并再次使用sql_trace来检查Oracle具体如何操作这条SQL语句的.告诉Oracle使用这个(侵入)的存储概要的方法是执行以下命令:
alter session set use_stored_outline = demo;
通过检查跟踪稳健,你将发现这条SQL现在使用的是and_equal路径. (如果你使用tkprof来处理并explain这个跟踪稳健,你将发现输出结果显示了两个相互矛盾的路径. 第一条路径显示实际发生and_equal路径,这是正确的结果;第二条路径可能显示为一个全表扫描,因为存储概要在tkprof在针对跟踪到的SQL语句运行explain plan的时候可能不会被启用).
从开发环境到生产环境
到目前为止,我们已经创建好一个outline,我们还需要将其迁移到生产环境中去.还有很多关于存储概要的小功能可以帮助实现这一点. 例如,可以重命名这个存储概要,将其从开发环境导出,并导入到生产系统中,检查它是否能在生产环境的一个’test’类目中正常工作,接着将其迁移到生产类目.可用的命令如下:
alter outline SYS_OUTLINE_020503165427311 rename to AND_EQUAL_SAMPLE;
alter outline AND_EQUAL_SAMPLE change category to PROD_CAT;
为了处理将存储概要从开发环境导出并导入到生产系统,可以通过利用在exp的参数文件中添加一个where从句来实现,因为,我们可能会有一个如下的导出参数文件:
userid=outln/outln
tables=(ol$, ol$hints, ol$nodes) # ol$nodes exists in v9 only
file=so.dmp
consistent=y # very important
rows=yes
query=’where ol_name = ”AND_EQUAL_SAMPLE”’
Oracle9中的改进
当开始深入使用存储概要的时候, 还有很多细节需要注意,在Oracle8中,在使用存储概要可以做什么以及它如何工作方面有一些使人烦恼的充满限制的特性.幸运的是,很多这种问题在Oracle 9中都已经解决.
- 最琐碎也最明显的缺陷是,在Oracle 8中,只有当存储概要中的SQL语句与将要运行的语句完全匹配的时候才会被使用. 在Oracle 9中,有一个”标准化”的操作来缓解这个匹配需求;在进行比较之前,SQL文本会被转换成大写,并去掉其中的空白字符(一般包含空格,换行,回车以及tab 分隔符). 在不同的SQL语句之间存在微弱的差别的情况下,这个功能提高了使用同样的存储概要的机会.
- 当存储概要需要处理一个更加复杂的涉及到多个查询块的执行路径时,还有一些问题-在Oracle 9中这些也已经通过引入第三张表存在于outln schema的表ol$nodes解决掉了.它可以帮助Oracle突破ol$hints中的提示列表,并在输入的SQL的合适的子项之间实现交叉引用. 这当然是个好事情. 然而,这将给在两个存储概要之间交换提示这种策略带来一些负面效应, 因为ol$hints这张表还获取了文本长度与偏移量的多方面的细节.当升级到Oracle 9的时,有必要使用另外一种方法来大量生成存储概要,例如,包含经过手工特别处理的数据集的第二schema,或缺失的索引,或包含嵌入正在使用的提示的存储视图来代替文本中引用的表.
- Oracle 9中引入的另外一个特性是,新增了大量的管理存储概要的支持,其中包含一个可以允许直接修改存储概要的包的初始版本.然而更重大的改进是,新增了一个选项,为在生产系统的操作执行计划提供了更好程度的安全性.虽然没有人喜欢在生产环境做实验,但有时生产环境是唯一的场所-包含合适的数据分布以及数据规模-来让你确定一段特定SQL语句的最优执行计划. 在Oracle 9中,可以创建一份outln表的虽有拷贝,并提取”公共”存储概要到里面以做”私有”的实验,而不会出现不小心将私有的存储概要对最终用户代码可见的风险.就我个人来讲,我会考虑将它作为杀手锏,但我也可以想象有时它可能成为一种必需. 在一个不那么危险的级别上,如果你有一个大规模的UAT或者测试系统,这就是一个可被用来独立测试的特性了.
限制
这篇文章给你提供了足够多的信息来开始测试存储概要;但是在你开始将这项技术应用到生产环境之前,必须明白以下几点.
- 首先,在Oracle8i中,outln的用户的默认密码是一个众所周知的密码,并且这个帐户有一些非常危险的权限.你必须修改这个帐户的密码.在oracle 9中,你将发现这个帐户的状态是locked.
- 其次,用来保存存储概要信息的表是创建在system表空间中的.对于一个生产系统来讲当你开始创建存储概要的时候你将发现你在system表空间中使用了大量的空间.将这些表迁移到一个属于它们自己的表空间,这是个好主意.很不幸,这其中有一个表包含一个long类型的列,因此你可能不得不使用exp/imp来将这些表移动到一个新的表空间.
- 最后,当使用存储概要对于解决致命的性能问题异常有效时,还会涉及到另外的代价.如果有存储概要被激活,针对每一个新解析的SQL语句Oracle都将检查是否存在一个相关的存储概要. 如果系统中有大量的SQL语句没有对应的存储概要,那么就需要权衡从少量的包含存储概要的SQL语句得到的好处是否能够抵消这部分额外代价.不过, 这是一个仅仅在存在更加严重的性能问题的系统才可能出现的问题.
结论.
存储概要可能会非常有用.当你无法通过修改源代码或者改变索引策略时,存储概要可能是仅有的可以让一个第三方应用有效运行的方法.
将这个想法推至极限,如果你仍然必须面对将一个系统从基于规则的优化方法到基于成本的优化方法的话,存储概要可能是是成本最低的并且无风险的选项.
如果要最大程度的受益于存储概要,那么Oracle 9提供了多项改进以允许支持更多类型的SQL语句,降低额外开销,并为你提供更大的灵活性来进行测试,操作以及安装存储概要.
朋友让我找出版社维权,我说不必了,这本书已经有了修订版的《深入解析Oracle》,而且已经出版了3年多,书的销售使命早已经完成了,那么现在,如果有更多的人可以通过电子版看到这本书,也未尝不是一种功德,所以,我同样上传一份在本站,供需要的读者下载。
深入浅出Oracle 下载
注意:这个电子版非我制作,如有PDF质量问题,我并不负责。
那么这个电子版来自何处呢?
我猜想是从出版社流出的,因为第一书中的插图都是彩色版的,显然并不是从纸介质扫描而来;第二,这个完全排印版本,我手中都是没有的,是出版社的最终稿。
如果有人知道确实的来源,我很有兴趣,完全是兴趣。
不过无论如何,如果这本书在以前或者以后,能够让你获得一点点有用的知识,那都是我愿意看到的。
-The End-
相关文章|Related Articles
- 《Oracle DBA手记》- 第二章PDF版本下载
- 《Oracle DBA手记》一书到货上架
- IBM小型机的内存deconfigured - 数据库之风险
- 《Oracle DBA手记》一书勘误表
- 《Oracle DBA手记》- 24小时小样到手
评论数量(12)|Add Comments
本文网址:http://www.eygle.com/archives/2010/02/headfirst_oracle_download.html
2010-01-31 Sun
作者:Fenng 发布在 dbanotes.net.
且说前一段时间听淘宝的黄裳讲解淘宝网站架构发展的时候,说起 2004 年底淘宝为何从 PHP 向 Java 转移的事情。为何转换,他阐述了几个理由,其中一个是非常有趣的:当时的 PHP 缺少一个 IDE。而合适的 IDE 能够有效提升规模化软件开发的效率。
我们知道 eBay 在 2002 年的时候也在 Sun 技术团队的帮助下,将整个应用架构从 C++ 迁移到 J2EE 。也就是 eBay 内部所说的 V3 版本(refer)。
最近一件有趣的事情是,据说腾讯的财付通在招聘 Java 方面的高手,"参与系统架构选型",要把底层架构从 C/C++ 迁移到 Java 架构上来。另外,百付宝的后台技术据说也是基于 C++ 的(最开始的时候只是一两个人写核心代码)。我相信,现在百付宝或许规模还比较小,总有一天,也要面临向 Java 的迁移。这和阿姆达尔定律有点类似,要得到更大的计算能力,就要尽量减少整个系统中的非并行的环节。只是一两个人能搞定的地方,再加入更多的开发人员也是无济于事的,除非,改变协作的模式。
去年接触到的一些国内的电子商务公司,有些已经在进行技术架构上的变迁,当然,多数是从 Windows 平台迁移到 LAMP 平台,究其原因,也无非是成本与效率,而后者,更为大家所看重。当然,也有一些顽固派,比如京东,仍然固守原来的手工作坊技术模式。
如果单兵作战的话,很多程序高手会说,"用什么语言都是无所谓的"。但是如果是团队协作开发的话,用什么语言,影响则是不一样的。对于电子商务网站来说,语言的选择意味着不同的架构路线、不同的开发框架、不同的测试框架、不同的部署流程,最后更为主要的是不同的开发效率,意味着可以把更多的开发资源并入到当前的环节中。
事实上,对于一个高速发展中的网站,每隔18 或 36 个月,几乎总要有一次架构上变革的镇痛。没有这种变革的勇气,意味着以后也不会有人敢做这个尝试。没有这种镇痛,就不会有成长。
变化的节奏最后影响一切。编程语言的选择并非无关紧要,短期看来似乎影响不大,从长期来看,决定最终的竞争结果。这就是我要说的。
--EOF--
最近文章|Recent Articles
本站赞助商:豆瓣网
评论数(10)|添加评论 | 最近作者还说了什么? Follow Fenng@Twitter
本文网址:http://www.dbanotes.net/review/choose_programming_languages_important.html
DBA Notes 理念: 用简约的技术取得最大的收益...
作者:Fenng 发布在 dbanotes.net.
最近看了不少以前不愿意看的书,《谁说大象不能跳舞?》是其中之一。这是一本教科书,讲述的是如何挽救一家走向衰败的大公司。
所处的位置不同,不同的人阅读这本书会有不一样的体会。给我印象最深的是郭士纳初入 IBM 所采取的策略,"我们只有很少的时间用来找出问题,大部分时间、精力和关注点都将用于解决问题和采取行动上。"
问题本质
新的 CEO 上任之前从众多人的建议中就已经抓住了问题的本质(收到众多建议的时候如何过滤重点?):IBM 不缺乏能人和天才,公司也不缺致胜战略,新领导人要从"战略"和"文化"等方面推行改革入手。这个改革,体现在具体行动上,是后面的"热烈拥抱"计划,说白了,也就是"拥抱用户",倾听用户的声音,解决用户的问题,赢取客户信任。然后才是财务方面的止血,最后才涉及到远景规划。能从千万重关系中抓住这些关键点,这是核心能力的提现。
对待人才的策略,也就是如何对待现有管理层,郭士纳也是自有一套。在第一次会晤管理人员的时候就主动传递了这样的信号: "IBM 历来是个人才济济的地方...只有如果有必要的时候,才会从外部引入人才"。但是我相信,这样的策略恐怕只有针对 IBM 等少数公司才会有效。多数公司不能照搬--如果问题的本质抓不住的话。(实际上,郭士纳后来还是招聘了不少曾经和他合作过的管理人员进来。)
对于这只管理团队,也不是真的没有问题 ,当时的 IBM 比较严重的官僚气是存在更多关心公司内部部门之间利益争夺而不是关注竞争对手的情况。任何一家大公司都会有既得利益者,这一点大家都会有共鸣吧。
"大象跳舞"
这本书的书名有多重隐喻。其命名或许和 TIME 杂志的这篇 Can This Elephant Dance? 有关。"大象跳舞"是什么意思? 对于 IBM 这样的庞然大物来说,跳舞意味着优雅、协调,意味着摆脱笨拙。而一旦大象能够做到以这一点,那么竞争对手自然不足为惧,因为问题来自自身而不是外界。
"Elephant Dance" 应该是个证券行业常用语,大致是"大盘股活跃,反复上涨"之意,从这个角度上来说,郭士纳也做到了,IBM 股价在他的任内也是一路上涨。
--EOF--
乱翻书,不求速进,但求有所得。
最近文章|Recent Articles
本站赞助商:豆瓣网
评论数(0)|添加评论 | 最近作者还说了什么? Follow Fenng@Twitter
本文网址:http://www.dbanotes.net/review/Elephant_Dance.html
DBA Notes 理念: 用简约的技术取得最大的收益...
2010-01-30 Sat
作者:Fenng 发布在 dbanotes.net.
在 Twitter 上看到笑来和几个推友说起关于提供下载为何不用更通用的 ZIP 文件格式而用 7z 的格式(refer)。这个倒是挺有趣的话题,刚好我也是 7-Zip 的用户,对这个不习惯也由来已久了,也一直不喜欢这个方式。
7-Zip 的默认压缩文件格式为"7z" (扩展名是 .7z) ,就是这个微小的差异给用户添加了很大的麻烦。设想一下,你用 7-Zip 压缩了一个文件,扩展名为 foo.7z ,传给了你的朋友(非IT人士),而你的朋友用的是 WinRAR,这是压缩软件市场上的主流,他看到这个格式之后,他会如何反应? 换个应用场景,如果一个普通用户,从网络上下载一个软件,下载完毕之后发现默认没有软件能打开这个 .7z 为扩展名的文件,他会如何做?
必须要承认,7z 压缩格式有很多优点,而 7-Zip 是个很好的压缩工具软件,但在预设格式上的这个事儿,不折不扣的是在挑战用户习惯。或许有人支持这样的做法,一个支持观点是 7z 格式压缩比更高。这是个很好的理由,不过,那么一点点的压缩比收益,考虑到当前个人用户所用设备的存储能力以及网络支撑能力等,对于单个用户来说,无法抵消使用习惯带来的麻烦。除非全世界都是 7-Zip 的用户,很可惜,现在的 WinRAR 仍然是市场绝对的主流,而 Zip 与 RAR 格式也是事实上的标准。另一种支持观点是现在所有主流压缩软件都支持 7z 格式了,所以使用是合理的。的确,主流压缩软件可能支持了 ,但是,绝大多数计算机用户不知道这个事实,和他们不知道没什么本质区别。或许,会有人认为这是 7-Zip 发展用户的一种独特的手段,如果是的话,那恐怕这是最拙劣的营销方式,形同绑架用户一样。
如果不是市场的绝对主导者,任何挑战用户习惯的的行为无疑是危险的。相比 WinRAR 和 WinZip 来说,作为开源软件的 7-Zip ,只需要使用习惯和前两者一样,而功能甚至都未必那么强,就会赢取大量用户。但是给用户习惯設置障碍的做法无疑是不可取的。如果有人不同意,那么还记得"兼容机"这个词汇吧 ?
开源软件应该多考虑使用习惯上的"兼容性",做网站也是一样,有多少人在设计网站的过程中真的尊重用户的遗留习惯? 而你是如何做的呢?
--EOF--
最近文章|Recent Articles
本站赞助商:豆瓣网
评论数(16)|添加评论 | 最近作者还说了什么? Follow Fenng@Twitter
本文网址:http://www.dbanotes.net/opensource/7-zip.html
DBA Notes 理念: 用简约的技术取得最大的收益...
1.JOB 进程
Job queue processes are used for batch processing. They run user jobs. They can be viewed as a scheduler service that can be used to schedule jobs as PL/SQL statements or procedures on an Oracle instance. Given a start date and an interval, the job queue processes try to run the job at the next occurrence of the interval.
Job queue processes are managed dynamically.Dynamic job queue processes can run a large number of jobs concurrently at a given interval. The job queue processes run user jobs as they are assigned by the CJQ process. Here's what happens:
-
The coordinator process, named CJQ0, periodically selects jobs that need to be run from the system
JOB$table. New jobs selected are ordered by time. -
The CJQ0 process dynamically spawns job queue slave processes (J000...J999) to run the jobs.
-
The job queue process runs one of the jobs that was selected by the CJQ process for execution. The processes run one job at a time.
-
After the process finishes execution of a single job, it polls for more jobs. If no jobs are scheduled for execution, then it enters a sleep state, from which it wakes up at periodic intervals and polls for more jobs. If the process does not find any new jobs, then it aborts after a preset interval.
The initialization parameter JOB_QUEUE_PROCESSES
represents the maximum number of job queue processes that can
concurrently run on an instance. However, clients should not assume that
all job queue processes are available for job execution.
2.RAC环境中的JOB调度进程 (link)
Each RAC instance has its own job coordinator. The database monitoring checks that determine whether or not to start the job coordinator do take the service affinity of jobs into account. For example, if there is only one job scheduled in the near future and the job class to which this job belongs has service affinity for only two out of the four RAC instances, only the job coordinators for those two instances will be started.
3.JOB的实例调度 (link)
Because you can create jobs at the instance level, cluster level, or cluster database level, jobs can run on any available host in the cluster database.
You can administer Enterprise Manager jobs at both the database and instance levels. For example, you can create a job at the cluster database level and the job will run on any active instance of the target Oracle RAC database. Or you can create a job at the instance level and the job will only run on the specific instance for which you created it. In the event of a failure, recurring jobs can run on a surviving instance.
相关文章|Related Articles
- MMAN - Oracle 10g的Memory manager进程
- 关于ocssd进程的三言两语
- 10g QMON Architecture及AQ_TM_PROCESSES
- MMNL进程与ORA-07445 ktsmg_get_threshold
- Oracle进程:LMS 进程与Oracle RAC
评论数量(1)|Add Comments
本文网址:http://www.eygle.com/archives/2010/01/rac_job_queue.html







