Tip: 看不到本站引用 Flickr 的图片? 下载 Firefox Access Flickr 插件 | AD: 订阅 DBA notes -- ![]()
2008-08-19 Tue
Fenng(dbanotes) posted a photo:
本次杭州OpenSolaris/OpenSource User Group的活动主题是“体验基于OpenSolaris的Web/企业应用”,主要分享嘉宾为Unix-Center.net社区积极分子黄立伟和知名博客dbanotes.net 博主冯大辉,分享的主题分别为“我的OpenSolaris学习路程”和“设计可扩展的面向互联网应用的MySQL数据库”等。届时来自Sun的 OpenSolaris工程师和推广人也会到现场,与大家一起讨论。OSUG是一个开发交流的场所,我们期望与会者都能够畅所欲言,与他人分享自己的点滴心得,形成一个“知识共享”的氛围。
【活动信息】
Fenng(dbanotes) posted a photo:
本次杭州OpenSolaris/OpenSource User Group的活动主题是“体验基于OpenSolaris的Web/企业应用”,主要分享嘉宾为Unix-Center.net社区积极分子黄立伟和知名博客dbanotes.net 博主冯大辉,分享的主题分别为“我的OpenSolaris学习路程”和“设计可扩展的面向互联网应用的MySQL数据库”等。届时来自Sun的 OpenSolaris工程师和推广人也会到现场,与大家一起讨论。OSUG是一个开发交流的场所,我们期望与会者都能够畅所欲言,与他人分享自己的点滴心得,形成一个“知识共享”的氛围。
【活动信息】
Shared by PahudI was looking for an example of how to write a MySQL UDF for my upcoming book "Writing Web Applications in Perl, Memcached, MySQL and Apache", and decided using Curl would be fun. Maybe there are some philosophical issues of why not to do it. But I can do it, and I did do it. So be it ;) Once I started the idea, I had to at least finish it. I hate not finishing something.
mysql的UDF真有意思
The single function is http_get(). It's very simple -- it just fetches a url (doesn't yet take the "http" part, it's _that_ simple). This severely needs to be fleshed out.
So, the proof in the pudding is at: http://patg.net/http_get.txt
A Launchpad project: https://launchpad.net/curludfs
Code: http://patg.net/downloads/curl_functions_mysql-0.1.tar.gz
I'd entertain anyone wanting to contribute!
Shared by Fenng
Sohu 的技术一瞥
在进入搜狐之前,我的 python 经验十分有限。就是会做做 base64.decodestring;学习 pymsnt 的时候接触了一下 twisted;以及,也是比较搞笑的一点,我用 python 最熟的地方居然是 windows 下的开发——访问注册表,用wxPython写界面,用ctypes访问DLL...

搜狐邮件中心开发以前是分成两个小组,一拨C/C++程序员,一拨Java程序员,技术上两者间没什么共同语言。因此我力主引入 python,是想弥合双方的技术范围,让每个程序员,都可能尽多的去接触 E-Mail 的所有业务领域。
一开始是 Twisted 应用,某 java 程序员用它实现了一套监控系统,实时注册IP黑名单系统;MTA 那里则是用它来做 tcptable 查找表的接口。
后来 MTA 那里更夸张的用 pymilter 粘合postfix 和过滤系统,直到我们的某供应商提供了 API 后才不得不改回 C
虽然计划增加 Python 的应用范围,但在规划 AjaxMail 的时候,一开始的确是打算沿用 Java 开发的。原因是三点:
A. 不管 Python 有多少优点,但都绝不应该抛弃以前的旧代码
B. 现有WEB开发人员的知识结构完全是基于Java的
C. 不管 Python 在语言方面有多少优点,但由于主要的业务逻辑都在 Javascript 上,后台究竟用什么语言开发反而是无所谓了。换句话说,Python带来的好处不明显,但风险是极高的
转折点出现在 10 月,两个主力 Java 程序员离开了团队,一个去了微软,一个去了新加坡。我的选择就变成:
1. 招Java程序员,从0开始熟悉现有的代码,学习邮件业务,然后摸索着前进
2. 依赖以前的关系,找几个邮件系统很熟悉的C程序员,用Python或者PHP(类似的事情我在04年干过一次,用PHP替换了eyou.com的CGI)或者什么什么开发,但肯定不是JAVA。
还有一点,我自认永远也不会太深入Java,不可能带着程序员在这条道路上走远。
说起来有点儿造化弄人,我心里确实想全面铺开Python,但理智上还是选择保守,可现实把我推向自己真正想去的地方。
关于这个选择我想更重要的是:万一不得已重头再来,怎样才能尽可能的降低风险呢?
1. 经验。我在这个领域8年了,技术上能做到什么样子还是有把握的。
2. 人才。如果不是因为有一个很得力的程序员,俺就要被迫亲自操刀了;虽然走了两个人,但配了一对更好的组合。
3. 信心。把自己的信心带给团队所有人,消除大家的不确定性。
4. 兼容。代码虽然有变化,但数据格式基本没有变,老的Java代码仍然还是可以使用——我想它应该至少还有半年的生命期。
To be, or not to be. 不管怎么选择,都要事先准备好面对接下来的挑战。
延伸阅读:lighttpd 2.0
John Halamka, CIO of Harvard Medical School and Beth Israel Deaconess Medical Center, was one of the keynote speakers at this summer’s Red Hat Summit. In this video, he explains how open source is critical to the healthcare industry and talks a little about his implanted RFID chip. Learn more about how Beth Israel saved $200,000 and reduced downtime to nearly zero.
The single function is http_get(). It's very simple -- it just fetches a url (doesn't yet take the "http" part, it's _that_ simple). This severely needs to be fleshed out.
So, the proof in the pudding is at: http://patg.net/http_get.txt
A Launchpad project: https://launchpad.net/curludfs
Code: http://patg.net/downloads/curl_functions_mysql-0.1.tar.gz
I'd entertain anyone wanting to contribute!
这两天关于刘翔退赛,大家有很多评论。有支持的,也有批评,而且现在已经发展到了支持和批评的双方开始相互攻击了。
也许换作另外一个人退出比赛,大家都不会有这样的评论。但正因为他是刘翔,是代表着中国人田径梦想的刘翔,几年来国人给他了太多太多的期盼,同时也因为“出镜率”太高,所以他早已经不是一个普通的运动员,他是一个代表着中国人梦想的公众人物。他的一言一行,一举一动不就能象一个普通人那样随意。普通人可以勾三搭四,试问哪个公众人物敢?
这就是公众人物与普通人的区别!
很多人并非在批评他的退赛,而是批评他的退赛方式,普通运动员可以这样,而他不可以。
前几天还传出他试跑的成绩不错,一再地给大家更多的希望,到了赛场上却突然伤势严重。难道中国的队医真的弱到临到上场了还不能判断出他可不可以参加比赛?如果真的不行可以提前退赛,不要把大家的希望提到了最高点,然后再突然的摔下去,这种做法太不负责任。
不管到底是什么原因,即使退赛,也要正面地给大家一个交代,难道真的不能走110米,哪怕是很多人搀扶着!就这样什么也不说,头也不回的走下去,到现在也没有给大家一个正面的答复,让人觉得真的很失望。
没人会强迫他怎么样,也没有人有权利强迫他怎么样。但是作为一个负责任的人,一个承担着很多人梦想和期盼的公众人物,作为一个爷们,做事情一定要有担当!答应的事情却没有完成,是不是应该正面地说声对不起!
我想任何一个普通人都会说的。
在进入搜狐之前,我的 python 经验十分有限。就是会做做 base64.decodestring;学习 pymsnt 的时候接触了一下 twisted;以及,也是比较搞笑的一点,我用 python 最熟的地方居然是 windows 下的开发——访问注册表,用wxPython写界面,用ctypes访问DLL...

搜狐邮件中心开发以前是分成两个小组,一拨C/C++程序员,一拨Java程序员,技术上两者间没什么共同语言。因此我力主引入 python,是想弥合双方的技术范围,让每个程序员,都可能尽多的去接触 E-Mail 的所有业务领域。
一开始是 Twisted 应用,某 java 程序员用它实现了一套监控系统,实时注册IP黑名单系统;MTA 那里则是用它来做 tcptable 查找表的接口。
后来 MTA 那里更夸张的用 pymilter 粘合postfix 和过滤系统,直到我们的某供应商提供了 API 后才不得不改回 C
虽然计划增加 Python 的应用范围,但在规划 AjaxMail 的时候,一开始的确是打算沿用 Java 开发的。原因是三点:
A. 不管 Python 有多少优点,但都绝不应该抛弃以前的旧代码
B. 现有WEB开发人员的知识结构完全是基于Java的
C. 不管 Python 在语言方面有多少优点,但由于主要的业务逻辑都在 Javascript 上,后台究竟用什么语言开发反而是无所谓了。换句话说,Python带来的好处不明显,但风险是极高的
转折点出现在 10 月,两个主力 Java 程序员离开了团队,一个去了微软,一个去了新加坡。我的选择就变成:
1. 招Java程序员,从0开始熟悉现有的代码,学习邮件业务,然后摸索着前进
2. 依赖以前的关系,找几个邮件系统很熟悉的C程序员,用Python或者PHP(类似的事情我在04年干过一次,用PHP替换了eyou.com的CGI)或者什么什么开发,但肯定不是JAVA。
还有一点,我自认永远也不会太深入Java,不可能带着程序员在这条道路上走远。
说起来有点儿造化弄人,我心里确实想全面铺开Python,但理智上还是选择保守,可现实把我推向自己真正想去的地方。
关于这个选择我想更重要的是:万一不得已重头再来,怎样才能尽可能的降低风险呢?
1. 经验。我在这个领域8年了,技术上能做到什么样子还是有把握的。
2. 人才。如果不是因为有一个很得力的程序员,俺就要被迫亲自操刀了;虽然走了两个人,但配了一对更好的组合。
3. 信心。把自己的信心带给团队所有人,消除大家的不确定性。
4. 兼容。代码虽然有变化,但数据格式基本没有变,老的Java代码仍然还是可以使用——我想它应该至少还有半年的生命期。
To be, or not to be. 不管怎么选择,都要事先准备好面对接下来的挑战。
延伸阅读:lighttpd 2.0
前天协助SA排错时,通过tbsql sql发现了使用oreder by rowid做排序的sql,我很好奇这种写法,为什么业务逻辑会通过rowid来排序来实现,常常这种疑惑浪费了我很多时间。
先确认两个问题:
1.为什么会使用rowid来排序
2.一个普通的分页sql,物理读排在第一,为什么每次需要消耗356个的物理读
--------------- ------------ -------------- ------ -------- --------- ----
5,043,897 14,149 356.5 7.7 744.89 53095.33 2800676544
SQL> select/*+ordered use_nl(t1 t2)*/ *
9 from (select rid, rownum as linenum
10 from (select rowid as rid
11 from auc_table
12 where username = 'abc123456789'
13 and approve_status in (0, 1, -9)
14 and ends > SYSDATE
15 order by starts asc,rowid )
16 where rownum <= 100) t1,
17 auc_table t2
18 where t1.linenum >= 1
19 and t1.rid = t2.rowid;
引江枫的论断:
oracle9204版本有这个问题:因为不稳定的排序,同样值的记录的位置在排序后不是固定的。假设两条记录,1,a和1,b,按1排序,那么在第一页的时候,可能最后一条是 1 ,a,翻到第二页,本来第一条应该是1,b的但是因为排序不稳定,可能第一条还是1,a,这样1,b就没有显示出来了
通过讨论可以确认,使用rowid是为了保证分页取数据显示正常,以防不稳定的排序导致有些记录漏掉显示,有些却显示不了,如果我们能保证每次分页都能取到正确的数据,那不就可以去掉order by rowid。
1.统计username所占的索引块数。
from auc_table
where username = 'abc123456789'and approve_status in (0, 1, -9)and ends > SYSDATE;
1 row selected.
Execution Plan
--------------------------------------------------------
SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=45)
0 SORT (AGGREGATE)
1 INDEX (RANGE SCAN) OF 'IDX_auc_USERNAME' (NON-UNIQUE) (Cost=4 Card=5 Bytes=225)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
5055 consistent gets --差不多我们可以推断这个用户的索引占用了5000个左右的块。
0 physical reads
0 redo size
493 bytes sent via SQL*Net to client
656 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
从上面的结果我们可以看出,这个id占用索引块大概在5000个左右,而且走的索引扫描,没有回表。
order by rowid是为了避免不稳定的排序带来分页sql取值丢失的问题, 如果我们只根据索引来取数据的话,索引中的数据相对位置是不变的,这样是不需要排序,也就没有排序稳不稳定的问题,我们要做的就是根据分页在索引中从头到尾一直把数据取出来而已,没必要通过rowid大小来保证取数据的正确性。
去掉order by rowid排序,性能会有多大的提高呢,我们来对比一下性能。
1.使用order by rowid排序,取第一页
9 from (select rid, rownum as linenum
10 from (select rowid as rid
11 from auc_table
12 where username = 'abc123456789'
13 and approve_status in (0, 1, -9)
14 and ends > SYSDATE
15 order by starts asc,rowid )
16 where rownum <= 100) t1,
17 auc_table t2
18 where t1.linenum >= 1
19 and t1.rid = t2.rowid;
100 rows selected.
Execution Plan
-----------------------------------------------------
SELECT STATEMENT Optimizer=CHOOSE (Cost=23 Card=5 Bytes=1875 )
0 NESTED LOOPS (Cost=23 Card=5 Bytes=1875)
1 VIEW (Cost=18 Card=5 Bytes=100)
2 COUNT (STOPKEY)
3 VIEW (Cost=18 Card=5 Bytes=35)
4 SORT (ORDER BY STOPKEY) (Cost=18 Card=5 Bytes=290)
5 INDEX (RANGE SCAN) OF 'IDX_auc_USERNAME' (NON-UNIQUE) (Cost=4 Card=5 Bytes=290)
1 TABLE ACCESS (BY USER ROWID) OF 'auc_table' (Cost =1 Card=1 Bytes=355)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
5161 consistent gets =5055(索引块)+100(行块), 如果加上rowid排序的话,应该是把这个username全部数据都要扫描一遍,在排序
62 physical reads
0 redo size
14132 bytes sent via SQL*Net to client
722 bytes received via SQL*Net from client
8 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
100 rows processed
2.去掉order by rowid排序,也是只取第一页:
9 from (select rid, rownum as linenum
10 from (select rowid as rid
11 from auc_table
12 where username = 'abc123456789'
13 and approve_status in (0, 1, -9)
14 and ends > SYSDATE
15 order by starts asc )
16 where rownum <= 100) t1,
17 auc_table t2
18 where t1.linenum >= 1
19 and t1.rid = t2.rowid;
100 rows selected.
Execution Plan
----------------------------------------------------------
SELECT STATEMENT Optimizer=CHOOSE (Cost=7 Card=5 Bytes=1875)
0 NESTED LOOPS (Cost=7 Card=5 Bytes=1875)
1 VIEW (Cost=2 Card=5 Bytes=100)
2 COUNT (STOPKEY)
3 VIEW (Cost=2 Card=5 Bytes=35)
4 INDEX (RANGE SCAN) OF 'IDX_auc_USERNAME'
(NON-UNIQUE) (Cost=4 Card=5 Bytes=290)
1 TABLE ACCESS (BY USER ROWID) OF 'auc_table' (Cost =1 Card=1 Bytes=355)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
926 consistent gets --应该是只取到前面100条的数据就退出了,实际上这个逻辑还是有点大,我以为只用100多一点就够
44 physical reads
0 redo size
13963 bytes sent via SQL*Net to client
722 bytes received via SQL*Net from client
8 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
100 rows processed
同样的功能,不同的实现方式性能相差还是很大的,对于我们这种业务量及其繁忙的系统,7.7%的物理读,如果能优化下来,也是相当可观的。
2008-08-18 Mon
2008-08-17 Sun
AnySQL.net
DBA notes
Oracle & Starcraft
eagle's home
Give you some color to see see!
AnySQL.net English
Oracle Scratchpad
Oracle Life
OracleDBA Blog---Please enjoy the pain which is unable to avoid!
Uploads from Fenng(dbanotes)
Chanel [K]
xzh2000的博客
Oracle Security Blog
ERN空间
Eddie Awad's Blog
MySQL Performance Blog
The Tom Kyte Blog
Delicious/Fenng/oracle
AIXpert
O'Reilly Databases
Red Hat Magazine
DBASupport
DB2 Magazine 中文版
developerWorks 中国 : 技术文章 , 教程 AIX
Pythian Group Blog » Log Buffer
车东[Blog^2]
blue_prince
玉面飞龙的BLOG
此生 今世
人生就是如此
Orange Tiger 木匠 的 移民生活
生活帮-LifeBang
Hey!! Sky!
dba on unix
Oracle Notes Wiki
Brotherxiao's Home
柔嘉维则@life.oracle.eng
Fenng's shared items in Google Reader
jametong's shared items in Google Reader
缥缈游侠-logzgh
Tanel Poder's blog: Core IT for geeks and pros
DBA Tools
ilonng
yangtingkun
Oracle & Unix
Inside the Oracle Optimizer - Removing the black magic
Ricky's Test Blog
DBA@Taobao
存储部落
Think in 88
Alibaba DBA Team
Oracle Team @SNC
淘宝数据仓库团队
OracleBlog.cn
中国雅虎_站长天下_www.dbaleading.com_原创文章


