Archive for February, 2008

利用子查询更新字段

Friday, February 29th, 2008

今天在做数据更新时,打算将某个帖子下面的所有回复排定楼层,测试发现结果不对。
update sq_forum_reply s set floor = (
                                   select row_number() over(partition by thread_id order by gmt_create)
                                   from sq_forum_reply t
                                   where s.id = t.id
                                   and t.thread_id =20013990
                                   and floor is null
                          ) where thread_id=20013990 and floor is null;
查看执行计划发现,原因是子查询根据要更新的当前行的id去查询匹配记录,这样子查询每次只能查到一条记录,所以排序始终等于1。
 修改语句后:
update sq_forum_reply s set floor = (
  select rn from (
  select id,row_number() over(partition by thread_id order by gmt_create) rn
  from sq_forum_reply [...]

Parallel Table Scans

Thursday, February 28th, 2008

        对于超大表的扫描,一般倾向于使用Parallel,让多个slave进程扫描,返回完整的结果集,ORACLE里面并行是可以手工模拟的,通过表的盘区分布,我们可以获得表的rowid的分布范围,然后启动多个会话,每个会话处理一个范围,如果表的盘区分布在多个磁盘上,CPU个数也允许的情况下,效果是非常好的,但是这种基于rowid范围搜索的机制,是不太适合用stripe的
       
        比如一个表空间有4个datafile,存储正好是4个DISK组成的stripe,stripe size 为128K,那么这4个datafile 创建的时候就注定了以128K的分片散落在4个disk上,然后在表空间上创建表,假设是uniform的让盘区均衡在4个datafile,实际上他的单个extent也是跟随这他的datafile落在了4块DISK上,此时如果使用Parallel,多个slave进行rowid范围扫描来返回数据,逻辑上看到的从表的block1扫描到blockn是连续的,但硬件磁盘却是4个磁头在疯狂的交叉使用,每个slave都要4个磁头为他工作,为了真正的让多磁盘为Parallel服务,就要尽量的保证数据文件上的block在物理磁盘上是尽量连续的,每个磁盘上分一个大的范围,这样多进程扫描起来,每个关注自己的那个磁头,避免交叉调用,才是最优的
        马上就要接手数据仓库了,管理的数据库从G变T,心里到真是有些惶惶的,以后关于大数据量的迁移,处理肯定不少,又是一个新的挑战

如何增强幸福感?

Thursday, February 28th, 2008

管理好自己的期望
做好自己的事情

UTF8字符集下如何做数据订正

Tuesday, February 26th, 2008

在utf8字符集的数据库中如何做数据订正.这个问题对我们DBA来说是比较现实的.
矛盾在于当数据库是UTF8时, 我们用Windows的操作系统如何input到数据库一个UTF8的文本.
经过多次的探索, 发现有三种方式.
1. 当Windows是简体中文操作系统时, 一个普通的txt文件(或者sql文件)都是ZHS16GBK格式的,
这个时候如果我们期望输入数据库的UTF8文本都是属于ZHS16GBK字符集时
(简单的说就是我们想输入简体中文或繁体中文时),
直接走SecureCRT 输入的中文都可以自动被转化为UTF8的格式.
与做普通字符集的数据订正没有区别.
2.当Windows是简体中文操作系统时, 如果我们期望输入数据库的UTF8文本不属于ZHS16GBK字符集时,
有两种方法把真正的UTF8字符输入给数据库
第一种:
把需要输入的文本保存为UTF8格式,  然后本机的NLS_LANG=AMERICAN_AMERICA.UTF8,
然后用SQLLDR到数据库中, 就可以了.
第二种:
把需要执行的SQL文件保存为UTF8格式, 然后SCP到对应的服务器上, 服务器的NLS_LANG=AMERICAN_AMERICA.UTF8,
然后在sqlplus里面用@操作符来调用这个SQL文件, 就可以了.
最后一种方法比较简便, 我举个例子说明一下:
‘アイウエオ’这串字符是半角的日文, 不属于ZHS16GBK字符集.
那把如下的语句保存为名为test.sql的文件
select ‘アイウエオ’, dump(’アイウエオ’,1016) from dual;
文件保存的格式选择为utf8.
然后scp到服务器上.
[admin@japan_db1 jonathan]$ env|grep NLS_L
NLS_LANG=AMERICAN_AMERICA.UTF8
ops$admin@JAPAN>l
1* select ‘アイウエオ’, dump(’アイウエオ’,1016) from dual
ops$admin@JAPAN>@test
SP2-0042: unknown command “” - rest of line ignored.
‘アイウエ��  DUMP(’アイウエオ’,1016) 
アイウエオ  Typ=96 Len=15 CharacterSet=UTF8: ef,bd,b1,ef,bd,b2,ef,bd,b3,ef,bd,b4,ef,bd,b5 
Elapsed: 00:00:00.00
ops$admin@JAPAN>spool off

08年——给team兄弟,以及我自己

Tuesday, February 26th, 2008

承担更大的责任
体现更大的价值
获得更大的成长

compute statistics

Thursday, February 21st, 2008

在9i里面测试一下,create index/alter index rebuild 的同时,加上 compute statistics,表也会同时被分析。
这样就会比较矛盾:
如果这样做,新建的index统计信息会比较好,oracle会更好的判断是否走这个index。
但是表的统计信息此时也变了,因为和这表相关的sql还是比较多的,造成很多sql都重新解析,sql走错执行计划的机率也就变大。
如果不这样做,而是先create,然后再estimate statistics,然后再选择一个合适的sample再estiamte 一下。
这样对表的统计信息没有影响,相对影响较小。
但是新的index在创建完到分析之前这段时间,统计信息是不全面的。也会造成执行计划走错的可能。
10G对此作了修改,create index/alter index rebuild 的同时,加上 compute statistics,表不会被分析。

关于UTF8字符集的话题

Wednesday, February 20th, 2008

UTF8字符集几乎包含了世界上所有的语言字符,应用程序需要在同一页面显示多种语言时,我们往往会选择将数据库的字符集定为UTF8,然而,这个字符集在使用的时候,会有一些困惑          
          1.客户段NLS_LANG与数据库一致的时候,数据存取不需要转码,所以多语言问题只要NLS_LANG=UTF8就搞定
           NLS_LANG保持与数据库一致,oracle客户段软件确实不会对数据进行转码,但他更不会关心你输入的数据格式是否真的和数据库匹配,比如我windows的语言区域是简体中文,对应的字节编码是zhs16gbk,那么他就会把zhs16gbk编码原封不动的存入utf8数据库,明明想要馒头的你却给我砖头,但我还是通吃,只不过日后你再想把这部分东西当馒头用,就会遇到麻烦
[oracle@japdev_new ~]#export NLS_LANG=AMERICAN_AMERICA.UTF8
japan@JAPDEV>select value from v$nls_parameters where PARAMETER = ‘NLS_CHARACTERSET’;
VALUE
—————————————————————-
UTF8
japan@JAPDEV>insert into myword values(’垃圾’);
1 row created.
japan@JAPDEV>select dump(word) from myword;
DUMP(WORD)
——————————————————————————————————————————————————
Typ=1 Len=4: 192,172,187,248
1 row selected.
现在找个zhs16gbk的数据库,存入同样的数据
oracps@:/home/oracps>export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
SQL> select value from v$nls_parameters where PARAMETER = ‘NLS_CHARACTERSET’;
VALUE
—————————————————————-
ZHS16GBK
SQL> insert into myword values(’垃圾’);
1 row created.
SQL> select dump(word) from myword;
DUMP(WORD)
——————————————————————————–
Typ=1 Len=4: 192,172,187,248
可以看到两个的编码都是ZHS16GBK,因为我们的WINDOWS直接输入字符,他本身不是UTF8格式的,这个时候你必须告诉ORACLE,你在用他的子集与他交互,转码是必须的
[oracle@japdev_new ~]#export NLS_LANG=AMERICAN_AMERICA.ZHS16GBKjapan@JAPDEV>select value from v$nls_parameters where PARAMETER = ‘NLS_CHARACTERSET’;
VALUE
———————————————————————————–
UTF8
japan@JAPDEV>insert into myword [...]

08春节回家纪事

Thursday, February 14th, 2008

     这次春节回家的经历只想用一个词来形容了:折腾!
      2月1号的机票,由于是第一次坐飞机(本人比较土),而且是早上7:50起飞,所以早上四点就“拼死”从暖和的被窝里面爬起来。穿衣服,洗脸,刷牙15分钟全部搞定,拎上包就往门外跑,到小区门口看了下表,4:20。刚好有一辆空的出租车经过,立马叫下来了。心想这么顺利,这次回家估计会一帆风顺了。到武林门民航售票处乘坐大巴的时候才4:40不到,最早到机场的大巴得5:30才有。决定和其他人一起拼车去了机场(每人30),一路还算顺利。只是到机场太早(5:20左右),还没几个人在。
      等了一个小时后在自助值机终端上换了登机牌,后来想想又还是到国航的值机柜台那边托运了一个小包,师傅(Jacky)说这是素质问题。7:20准时登机了,当大家听到登机通知后都很兴奋,因为最近几天到长沙的飞机很多都晚点或直接取消。登机通道上贴满了我们公司的广告:

      可刚登上飞机不久,大家的所有兴奋就被长沙机场临时关闭的消息给浇灭,所有人不得不先下机到候机大厅等候消息。大约一个小时后,国航工作人员又通知长沙机场估计得下午5点以后才能开放,安排我们到萧山这边爪力的明日宾馆休息。听到这个消息后大家心马上又凉了一大截,都安排到宾馆了,估计当天是走不了了,可大家也没办法,有点放休息总算好的了。
      到宾馆后,杭州天外也开始下雪了,而且有越来越大的趋势,大家心里也越来越担忧了:要是杭州也关了那就更麻烦了,结果到下午四五点左右的时候,果然听到了杭州萧山机场关闭的通知。一直到第二天下午4:30吃晚饭的时候,机场方面通知,说晚上7:00左右可能可以安排我们走,大家听到这振奋人心的消息那个激动啊,都在考虑着到长沙后是住还是连夜打车走,住又怎么住(据说长沙整个城市的宾馆已经全部爆满了)?吃完晚饭大家都很快回到房间收拾东西等待好消息。大约7:10分左右我们房间突然接到电话让下楼,说要走了。我和室友马上拎着包就往楼下冲。下楼后看到大厅里面已经有一大群人在里面争吵着什么,看看门外,却没有国航的大巴来接我们。后来才知道,原来不是国航通知我们可以走了,而是我们里面的人得到消息,说在我们之后滞留的到长沙的飞机已经走了,而之前被指留下来的我们却没有任何安排,大家火了,围着以为国航的工作人员要求马上安排到机场。在大家的围攻下,国航的那位MM实在顶部住压力,不断打电话,大家看她也算尽心,就慢慢冷静下来。可没想到,一个不注意,那位MM就偷偷溜了,这下终于完全惹怒大家了。大家马上自发租车打车到机场(当时大约过去了3/4的人),大家都集合到了一起,打算直接拿着之前的登机牌过安检先进候机厅再说。不知道是安检门提前知道消息还是怎么回事,大家到门口的时候,安检门全部关闭着,安检工作人员以及公安和武警都离门口远远的。没办法,大家又全部折回国航值机柜台,要求见他们的经理,开始没有人搭理,大家火了,开始大吼“长沙,我们要回家!”,声音越来越大。过了十多分钟后,终于来了位自称是国航在萧山机场的头的“范经理”,一到柜台前,还没有开口说话,就被站在最前面的几位指着大骂了将近五分钟没有说话。后来大家给出解释为什么我们没走反而让我们之后的人走了,他开始借口说班机型号不同,没办法载下我们这班的所有人,后来被大家识破(两班同时间点的飞机,人数都是差不多的),又是一顿大骂。后来大家让他承诺马上开始安排飞机让大家走,好不容易得到解释,说后面只要有飞机,肯定第一班就走我们,让大家等一个小时后给我们消息,才总算平息一点。
      到这时候,整个机场在我们那班乘客的带动下,到处都开始喊口号了。那场面真是越来越壮观了,有些人都已经跳上值机柜台了。当时在去洗手间路上看到一黑老外跳上柜台,叽里呱啦对立面的工作人员嚷嚷了半天,可惜当时手边没有相机没拍下来。
      一个小时很快到了,可迟迟没看到那位“范经理”的身影,也没有其他任何国航的工作人员来给我们答复,大家开始躁动了,慢慢了又开始吼了起来,这时候旁边一群广州班机的乘客也开始和我们一样彼此呼应。动静越来越大,眼看着柜台要被推到了,电脑要被砸了,终于又出现了一位领导模样的人,“某书记”:

某书记在武警的陪护下正和我们交涉。大家也不管他是啥书记不书记的,开始就是一顿大骂,然后要求马上安排飞机。书记毕竟还是书记,估计还有点小权力,问旁边的工作人员有没有飞机在,答复说刚好很快又一架长沙飞过来的320,要降落了。“好,那就这架了!”。听到“某书记”的这句话后,大家才开始慢慢平静下来。然后就是重新换新的登机牌了,准备过安检进候机厅了。
      这时候旁边广州的人不舒服了,看到我们的问题解决了,他们的问题没有人关,开始往前冲撞值机柜台了,可这时候书记已经在武警陪同下走开了,他们只能不断的冲撞柜台。我换了登机牌到安检门口的时候,发现门口很多公安武警在关安检入口的铁栏门,还没明白啥事,只听刚进去的室友在里面大叫,快进来,要关门了。可等我钻到门口的时候,门已经关了,当时心里那个急呀。就在这时候,旁边不远处有个从里面出来的门开了,两个工作人员准备从里面出来,我马上冲过去乘关门的武警还没完全关门的时候冲了进去,那武警被我撞的原地转了个圈后再我身后大喊,我理也没理就直接跑到里面的安检口去安检了。就这样,总算进候机厅了。估计那武警看我去了安检口,就没再追过来了。
      进去后才发现我们这班机的人才进来十来个人,大家登机牌上面印的时间、登机口等全部一样,还以为是被耍了。这时候过来一工作人员告诉我们大家到26号登机口等,11:00登机,大家才又安心一点。可进去等了很久以后,也没见一个人进来,大家感觉有点不对劲了。我到安检门口去看了下。好家伙,门口全是人,里面两排公安和武警,外面大群人想冲进来。仔细听了下,才知道是广州那班机和其他一些班机的人堵住了安检口,说不给他们安排好飞机就不让其他人进来了。

      我们在里面的也只好等着干着急,也没啥其他办法,只能让那边慢慢处理了。大概过了2个小时后,才见我们的人慢慢过来。大约在1:40左右总算登机了,坐上飞机大家脸上都是欢喜的笑容。有人提议唱歌,马上就有人响应开始唱上了。在飞机上等了大约半小时后,飞机顺利起飞了(约2:30了)。闹了半天,大家终于慢慢安静下来,大部分人都睡着了。
      在很多人刚刚睡着的时候,突然传来了机长的广播:…由于长沙机场大雾,飞机无法降落,我们将飞回杭州萧山机场…大家听到这突如其来的消息,一个个都傻眼了。好不容易才上飞机,现在又遇上长沙机场大雾,难道真是老天要捉弄大家吗?大家马上意识到回杭州后航空公司可能会让大家下飞机,以后就不知道到什么时候才会有飞机安排给我们了,于是一致表示坚决不下飞机。过了大约30分钟后飞机又降落在萧山机场了(大约是4:10左右)。开始“漂亮MM”们只是让大家先在飞机上面休息,等待通知。没过多久,航空公司的人上飞机来了,先给大家解释了一会儿,然后让大家下飞机去休息。大家任由他说了很久,没有一个人理会,都靠在座椅上面休息着,第一轮游说宣告失败。又过了大约30分钟,又增加了一位大家,两人一起一个一个对机上乘客游说,结果还真有三人给游说动了,马上大家一片唏嘘,一哥们又坐了下来,走了一男一女。后来后面的人吧上来的两位游说工作人员给轰到前舱了。大约又过了30分钟,那男的又回来了,还用威胁的口吻说:既然你们要在上面休息不愿意下去那就让你们在上面,机组人员都下去了,一哥们笑说那些“漂亮MM”留下和大家聊天就可以了。“漂亮MM”也会下去,而且不会有食物,不会有水,你们自己看着办。大家一听火了,最后硬生生把那哥们给赶下了飞机,机组人员也没有全走。就这样,大家在飞机里面休息了大约2个小时后,在飞机上看到太阳开始升起来了:

      在休息了一两个小时之后,大家稍微恢复了点精神,有的开始联系长沙的朋友问那边的天气情况,有的给家人打电话报平安。大约过了一个小时左右后,开来了三辆辆车,一辆给飞机做安检维护的,两辆机场巴士,被轰下去的工作人员又来了,说长沙机场可以降落了,飞机现在要做例行安检维护和加油,大家需要先下飞机待15分钟,大家问我们要被拉到哪?对方说就在机场停机坪里面,会停在大家眼睛能看到这架飞机的地方的。估计他们心里都清楚,这架飞机不再我们的视野范围内,我们肯定是不会愿意下飞机的。后面都比较顺利,在大家又回到飞机上面的时候大约是10:15左右。先给大家分发了水和食物,然后十一点飞机起飞了,一路顺利:

      下飞机,领行李,买到常德的机场大巴,全部弄完后大概13:30了,又等了一个小时的大巴车,14:30出发前往常德。路上比较通畅,高速路面都是干的。不过司机开的还是很小心,平时两个半小时的路程,走了四个小时才到常德,打车到桃源的时候大约7:20了。总算回家了啊!

阿里巴巴DBA出品