Oracle Database 11gR2 性能调整与优化

[美] Richard Niemiec 著

杨中 朱波 吕学勇 译

北 京

Richard Niemiec 11g Release 2 Performance Tuning Tips & Techniques ISBN:978-0-07-178026-1 Copyright © 2012 by McGraw-Hill Education. All Rights reserved. No part of this publication may be reproduced or transmitted in any form or by any means, electronic or mechanical, including without limitation photocopying, recording, taping, or any database, information or retrieval system, without the prior written permission of the publisher. This authorized Chinese translation edition is jointly published by McGraw-Hill Education (Asia) and Tsinghua University Press Limited. This edition is authorized for sale in the People’s Republic of China only, excluding Hong Kong, Macao SAR and Taiwan. Copyright © 2013 by McGraw-Hill Education (Asia) and Tsinghua University Press Limited. 版权所有。未经出版人事先书面许可,对本出版物的任何部分不得以任何方式或途径复制或传播,包括但不限于 复印、录制、录音,或通过任何数据库、信息或可检索的系统。 本授权中文简体字翻译版由麦格劳-希尔(亚洲)教育出版公司和清华大学出版社有限公司合作出版。此版本经授权 仅限在中华人民共和国境内(不包括香港特别行政区、澳门特别行政区和台湾)销售。 版权©2013 由麦格劳-希尔(亚洲)教育出版公司与清华大学出版社有限公司所有。 北京市版权局著作权合同登记号 图字:01-2012-3835 本书封面贴有 McGraw-Hill Education 公司防伪标签,无标签者不得销售。 版权所有,侵权必究。侵权举报电话:010-62782989 13701121933

图书在版编目(CIP)数据 Oracle Database 11gR2 性能调整与优化/(美)尼米克(Niemiec,R.) 著;杨中,朱波,吕学勇 译. —北京:清华大学出版社,2014 书名原文:Oracle Database 11g Release 2 Performance Tuning Tips & Techniques ISBN 978-7-302-33905-2 I. ①O… Ⅱ . ①尼… ②杨… ③朱… ④吕… Ⅲ. ①关系数据库系统 Ⅳ. ①TP311.138 中国版本图书馆 CIP 数据核字(2013)第 217394 号

责任编辑:王 军 李维杰 封面设计:牛艳敏 责任校对:曹 阳 责任印制:

出版发行:清华大学出版社 网 址:http://www.tup.com.cn,http://www.wqbook.com 地 址:北京清华大学学研大厦 A 座 邮 编:100084 社 总 机:010-62770175 邮 购:010-62786544 投稿与读者服务:010-62776969,[email protected] 质 量 反 馈:010-62772015,[email protected] 装 订 者: 经 销:全国新华书店 开 本:185mm×260mm 印 张:65.75 字 数:1812 千字 版 次:2014 年 1 月第 1 版 印 次:2014 年 1 月第 1 次印刷 印 数:1~4000 定 价:128.00 元 ——————————————————————————————————————————— 产品编号:

中文版推荐序

理查德·尼米克的书《Oracle Database 性能调整与优化》在国际 Oracle 业界享誉多年,现在清 华大学出版社推出了该书最新版本(11gR2)的中译本。译者都是来自 Oracle 公司的技术专家,群英 荟萃,各显其能;译文信、达、雅齐备,精彩纷呈。汉语读者会感觉很惬意,再也不必去啃原文了。 我和理查德是美国普度大学的校友。我 1986 年毕业于计算机科学系,他 1987 年毕业于电机 与计算机工程系。在美国,普度大学常被誉为“工程师的摇篮”,凡是有工程师的地方都少不了普 度人的身影。人类第一个踏上月球的尼尔·阿姆斯特朗、中国的“两弹一星”元勋邓稼先就都毕 业于普度。 从普度大学毕业后,我去贝尔实验室就职,来到了芝加哥;而理查德本来就是芝加哥人,毕 业后回家乡创办了终极软件资讯公司(TUSC),专门提供 Oracle 业务解决方案。那段时间里,我正 负责主持旅美中国科学家工程师协会、北京大学美中地区校友会的活动,和各类企业、团体打交 道比较多,知道理查德的公司被业界誉为“Oracle 领域的海豹突击队”,是一支为很多企业用户解 决了难题的攻坚队伍。凭借娴熟的技术和对商务的敏锐直觉,他带领着 TUSC 很快地跻身于 Inc. 500 强之列。Inc. 500 强和人们更为熟知的财富(Fortune)500 强不太一样。Fortune 和 Inc.都是美国 最主要的商务杂志,但侧重点却不同:Fortune 着眼于巨型跨国公司,Inc.则面向成长中的私营企 业。所以,Fortune 500 强排名看的是营业额,而 Inc. 500 强看的则是增长速度;在 Inc. 500 强中 企业家个人所发挥的作用更为举足轻重。TUSC 不仅成了 Oracle 的合作伙伴,理查德本人还荣任 了国际 Oracle 用户协会的会长。2007 年,母校普度大学给理查德颁发了“杰出电机与计算机工程 师奖”。这是普度每年只颁发给五、六名杰出校友的荣誉,曾获此殊荣的华人包括中国工程院院士、 中科院计算所前所长李国杰,以及为第四代移动通信核心技术做出了重大贡献的高通公司副总裁 厉隽怿。 理查德一向重视“品格”,强调品格和创新、才能、知识一样,是把企业在业务和技术两方 面都引向成功的关键因素。没有品格就好像没有灵魂。很多技术专家创新、才能、知识俱备,唯 独忽略了品格,以致难成大器。以他的见识,理查德把优秀的品格归纳为:诚信、自制、主动、 无私、热情、道德勇气、生理勇气、坚忍不拔和灵活变通等多重维度。这些名词,皆为大家所熟 知,然而知易行难。理查德结合杰出人物的生活经历深入分析品格的重要,使这部分内容成了美 国 Oracle 用户大会上最受欢迎和重视的主题之一。在为本书中文版所写的序言里,他历数中华历 史先贤,并以西方的品格标准衡量这些先贤的言行,结果是人同此心,心同此理:按西方的价值 观和品格观来评判,中华先贤同样是了不起的。理查德的话激励我们,要像中华历史先贤那样重 视和发展品格,即使是作为一名普通的数据库工程技术人员也绝不例外。只有这样,我们赶超世 界最先进水平的努力才不会徒劳无功。 技术,一般说来都有两个层面:有人工智能可以取代的,也有人工智能取代不了的。后者与 其说是技术,不如说更像是一种艺术。这就是当我们谈论知识产权时,为什么把已有的技术称作 Prior Art 的原因;而要说明某产品具备了最新技术时,我们用 State-of-the-Art 这个词来描述它。 很多厂商把自家的产品标榜为 Turn-Key System,意思是用钥匙一拧就好使,用户大可不必操心如 何安装使用。而像数据库这样的复杂系统,Turn-Key 其实是不可能的,调优势在必行,而且无法 用人工智能完全取代。既然是艺术层面的技术,大师和工匠之间就有着天壤之别了。作为一代

II Oracle Database 11gR2 性能调整与优化

Oracle 调优大师,理查德的经验是其他书籍不可替代的。他在绪言中说“如果通读全书并应用其 内容,您将跻身于最顶尖 1% Oracle 调优专家的行列。”这好像是个充分条件。我来补充一句必要 条件吧:如果您想跻身于最顶尖 1% Oracle 调优专家的行列,那就得通读全书,领悟其精髓,并 应用到您的工作实践中去。

阮祖望 原摩托罗拉网络系统部中国研发中心总工程师 北京大学软件与微电子学院教授

中 文 版 序

不久前我走访了中国,到 2013 年 7 月于上海举行 的 Oracle 全球大会上演讲,还在珠海及上海的很多公 司里做了演说。几年前我就在北京、上海和杭州做过 演说。我体会最多的一点乃是中国的很多公司里都有 Oracle 方面的领路人,通过在大银行、证券交易所、 电信业、电子商务业、物流业、制造业和我所见到的 许多其他行业里运用 Oracle 的最佳技术,这些领路人 正在将亚洲推向加速发展和令人振奋的未来。他们成 功的秘诀乃是以训练有素的 Oracle 技术专家来应用 Oracle 的技术,而在业务和技术两方面都不断成功的关键乃是将创新、才能、知识和品格四者融 为一体。很多出色的技术专家具备了其中的前三者,却忘记了发展这第四者。而正是品格促动了 持久的变更,这些变更使所有人都能受益,而不仅仅是使少数人受益。在 Oracle 内部我看到了很 多这样的领路人,与此同时我看到很多管理人员、DBA 和开发人员利用 Oracle 的技术来为他们 自己的公司创造业务优势,我还看到用户组领路有方,教会人们使用数据库一体机、Oracle Database 12c、Oracle 融合中间件及融合应用,等等。 中国历史上,展现伟大品格的故事和真实人物比比皆是。孔夫子曰:“君子谋道不谋食。”蔺 相如所展示的,不仅有完璧归赵的诚信,还有原谅廉颇的道义上的勇气。感觉岁月艰难的时候, 我们可以来看看苏武的生理之 勇:他宁肯以皮衣上的羊毛、 草、雪和鼠类充饥,也不肯向 敌人屈服。我们可以看到花木 兰将军的自我控制力及她对父 亲的极度尊重。刘备热心招募 关羽和张飞的远见令人叹服, 聘请大战略家诸葛亮时他也领 导有度。孙子的用兵原则举世 闻名,他同时还阐明了力量来 源于智慧、人道、诚信和纪律。 来自芝加哥大学的李政道生于上海,在我的老家芝加哥,大家都知道这位诺贝尔奖金获得者的学 识。诸葛亮作为战略大师的智慧有口皆碑,而他又因睿智、冷静、忠心和富于革新精神而著称于 世。在杭州,李清照对其亡夫的敬重为世人所共知1,她也因自己的诗词大作而闻名于世。我们都 希望具有如赵云一般的忠实,他不仅重返敌阵救出过刘备的家人,也重返敌阵救出过张著2。赵云 一次次地向我们展现了品格的魅力。孔融 4 岁时就表现出无私的品质,把最大的梨让给了哥哥。

1 译者注:赵明诚和李清照夫妻恩爱,才子佳人。赵亡故于金兵战乱之中后,李历尽艰辛来到杭州,整理、完成和出版了赵的 《金石录》遗稿,使他名垂青史。 2 译者注:张著是蜀汉的普通部将。

IV Oracle Database 11gR2 性能调整与优化

他会因机智而闻名,亦将非常成功。请求蔺相如宽 恕的时候,廉颇这样了不起的将军表现出了谦恭和 有深度的品格。若像这些各界的领路人一样发展品 格,则技术知识将与品格相辅相成,使我们所做的 一切产生持久的影响。这种有深度的品格造就了挺 过严峻考验、坚持到胜利的韧劲,正像孙中山医生3 在战胜挑战、使自己成为中国的共和之父及首任总统时所表现出来的坚韧不拔的精神那样。他的 话:“四海一家”表明他预见到了未来实现全人类伟大目标时全球范围内的大团结。坚韧乃心灵之 力量,使您能够借助勇气和品格来挺过痛苦和逆境。努力构建自己品格的时候,应时时扪心自问: 倘若这些领路人们置身于您所面对的挑战之中,他 们又将如何作为呢?于是您就能够像他们那样在生 活中胜出了。 清华大学出版社在中国出版界独占鳌头,由他 们来做出版商,我十分感谢并感到非常荣幸。我要 感谢那些将我的技术著作翻译成汉语的人们,因为 有了他们的帮助我才能成功和胜出。若非他们出色 的技术能力及品格,您可能就读不到这部书了,所 以他们的确是送了份大礼给您!我要感谢吕学勇,他在此项工程中发挥了非常重要的作用。事实 上,正是学勇邀我出面来华演讲,并借此来对他的国家产生影响的。他是很具才干的 Oracle 专家, 还是位做任何事情时都充分体现出品格魅力的绝佳领路人。学勇翻译了本书中的好几章。我还要 感谢这绝佳的翻译团队。在中国,杨中是位出色的领路人,也是您所能遇到的最聪明的 Oracle 技 术权威之一;朱波是卓越的技术专家,也是极好的而又富于热情的人。杨中和朱波也翻译了书中 的很多章。黄凯耀、董志平和李贺鑫在本书的翻译上也花了时间,使得您能在最高的层面上欣赏 和学习 Oracle。见到他们时,别忘了感谢这些 Oracle 的领路人啊! 在中国,我有幸遇到了很多友善的人。 Oracle 全球大会上,有人帮助我找到了分 会场,也有人感谢我来分享技术题材。即 便是周末去天主教堂的时候,我也同样受 到了基督徒伙伴们热情的接待。我由衷地 感觉在中国所做的一切都受到欢迎,而这 或许正是中国将持续地与世界分享的伟大 之处吧!中国了不起的传奇和领路人不仅 使它自己获益,而且使全世界都获益。我 们在一起将能成就许多大事!!

3 译者注:孙中山早年毕业于香港的西医书院,并为贫穷的病人义诊,因此被尊称为孙中山医生。

Preface for Chinese Readers

I recently traveled to China to speak in Shanghai at Oracle OpenWorld in July 2013. I also spoke in Zhuhai and at many companies in Shanghai. A few years back I spoke in Beijing, Shanghai, and Hangzhou as well. What I learned most while I was there is that China has many Oracle leaders at many companies. These leaders are driving Asia to an accelerating and exciting future by implementing the best Oracle technology at the biggest banks, stock exchanges, telecom, internet shopping, logistics companies, manufacturing, and many others that I saw while I was there. Their secret to success was implementing Oracle technology with highly trained Oracle technologists. The key to sustained success in both business and technology is the combination of innovation, talent, knowledge, and character. Many great technologists have the first three, but forget to also develop the fourth. Character is what drives lasting change that helps everyone, not just a select few. I saw many such leaders within Oracle while I saw many executives, DBAs, and developers leveraging Oracle technology to create business advantages for their company. I also saw great user group leadership teaching others to leverage things like Exadata, Oracle 12c Database, and Oracle Fusion Middeware and Fusion Applications.

China’s history is full of stories and actual leaders that show great character. Confucius tells us “The object of the superior person is truth, not subsistence.” What Lin Xiangru shows is not only his integrity in returning the jade, but also his moral courage in forgiving Lian Po. When we think times are tough for us, we can look to the physical courage of Su Wu, who would not surrender and instead ate wool from his coat, grass, snow, and rodents. We see the self control of General Hua Mu‐Lan as well as her incredible respect for her father. The enthusiasm of Liu Bei is admirable as his foresight in recruiting

VI Oracle Database 11gR2 性能调整与优化

Guan Yu and Zhang Fei. Liu Bei also shows his leadership in recruiting a great strategist Zhuge Liang. Master Sun Tzu not only shows us principles for using force that are known around the world, but also shows that strength comes from wisdom, humanity, integrity, courage, and discipline. Even in my home city of Chicago we know the knowledge of the noble prize winner from the University of Chicago, Li Zheng‐Dao, who was born in Shanghai. The wisdom of Zhuge Liang as a master strategist is legendary, but he is also known as wise, calm, loyal, and innovative. Li Qingzhao’s respect for her husband after he died makes her well‐known in Hangzhou, but she is also known for her great poetry. We would all like to have the loyalty of Zhao Yun where he not only goes back for Liu Bei’s family, but also for Zhang Zhu. Zhao Yun shows us that character is displayed over and over again. The unselfishness of Kong Rong is evident even at four years old where he gives the largest pears to his older brothers. Later he would become known for his wit and would become very successful. The humility of even a great warrior like Lian Po in asking forgiveness from Lin Xiangru shows the depth of his character. When we develop the character as each of these leaders did in each area, we will complement our technical knowledge with character and make a lasting impact in everything that we do. We can see that this depth of character leads to great fortitude to excel during great challenges as Dr. Sun Zhong Shan did to help himself becoming Father of China and its first President. His quote: “The whole world is one family” shows that he saw a global solidarity in the future to achieve greater goals for all humanity. Fortitude is the strength of mind that allows you to endure pain or adversity with courage and character. You should always strive to build your character by asking what these leaders would do if they were in your day to day challenges, and then you will be able to excel in life as each of them did.

Tsinghua University Press is the best in China and I am very grateful and honored to have them be the publisher. I must thank those who have helped me to succeed and excel by translating my technical work into Chinese. You would not be reading this book if it was not

VII for their great technical ability as well as their character. They have given you a great gift indeed! I would like to thank Steven Lu who played a very important role in this project. In fact Steven is the one who asks me to come out and make an impact in China by presenting in his country. He is a talented Oracle professional, but also a wonderful leader overflowing with character in everything he does. Steven translated several chapters of the book. I would also like to thank the incredible team. Steven Yang is a great leader in China and one of the smartest Oracle gurus you’ll ever meet; Ricky Zhu is a great technologist, but also a wonderful and enthusiastic person to be around. Steven and Ricky also translated many chapters in the book. Kaya Huang, Cary Dong, and Harrison Li were the others that put in the time so that you could enjoy and learn Oracle to the highest level. Thank all of these Oracle leaders when you see them!

I am blessed to have met so many great people in China. At the Oracle OpenWorld conference, there were people helping me to sessions, thanking me for coming, and sharing technology stories. Even on the weekend, I went to the catholic church while I was in China and again was met with open arms by fellow Christians. I truly felt welcomed in everything that I did in China and this may be the true greatness that China will continue to share with the world. The great stories and leaders of China not only benefit China, but the whole world. Together we can & will do great things!!

译 者 序

理查德·尼米克(Rich Niemiec)是蜚声国际数据库界的性能优化大师。2005 年,他的技术文章 “Statspack 高级调优”被译成汉语引入中国,深受国内 Oracle 数据库 DBA 和应用程序开发人员 的欢迎。2007 年和 2013 年,他作为 Oracle 全球大会的演讲嘉宾两次来到上海,并在北京、上海、 杭州和珠海等地为很多 Oracle 的重要客户举办了技术讲座,在中国的 Oracle 业界产生了十分积极 的影响。 《Oracle Database 性能调整与优化》一书是理查德的代表作,多年来畅销于北美,在中国也 有 9i 和 10g 版的汉语译本出版发行。11g 是 Oracle 数据库十分重要的版本,因为具有划时代意义 的 Exadata 数据库一体机迄今只能运行在 11g 版本的环境下。在《Oracle Database 性能调整与优化》 的 11gR2 版本中,理查德介绍了 Exadata 数据库一体机,也介绍了活动数据卫士(Active Data Guard, ADG)、真正应用测试(Real Application Testing,RAT)等 11g 版本新选件,还介绍了只读表(Read Only Table)、不可视索引(Invisible Index)、结果集缓存(Result Cache)等 11g 版本新特性。 了解 Oracle 11g 版本的新内容、掌握数据库的优化方法并且在 11g 版本的环境下对其灵活运 用,这些都是中国 Oracle 数据库用户和工程技术人员的迫切需求。而理查德 11gR2 版本的《Oracle Database 性能调整与优化》,既可以用作介绍 11g 版本新产品和新特性的大纲,又可以用作数据库 性能优化的教科书;因为含有大量成熟的脚本,该书还是非常实用的 DBA 日常工作手册。一书 多用,这对于上述有需求的群体来说,无疑是极好的选择。不过这样一部巨著的汉语翻译工作, 绝非仅凭一人之力即可完成的任务。为了向国内读者及时提供高质量的译本,我们几名来自 Oracle 公司的专业技术人员组成了一个翻译小组,利用工作之余的时间努力攻关。杨中、朱波、吕学勇 完成了其中的大部分工作: 杨中:本次翻译活动的倡议者和联络人,翻译了第 2、4、8、9、11 章并和朱波合作翻译了第 15 章;翻译了附录 A 并帮助李贺鑫翻译了附录 B 和 C。 朱波:翻译了第 1、3、5、6、10 章并和杨中合作翻译了第 15 章。 吕学勇:翻译了中文版序、作者简介、来自全球的赞誉、绪言、致丽贾娜、致谢、技术审校 者介绍、第 7、12、16 章和封底,还帮助分析、翻译了全书各章中的疑难句子。 此外,黄凯耀翻译了第 14 章,董志平翻译了第 13 章,李贺鑫帮助翻译了附录 B 和 C。 此书的翻译过程中,翻译小组先读者之忧而忧,不放过任何一处疑点,常常为了把一条命令 或一个参数彻底搞清楚而去查阅资料,与其他专家讨论,甚至和书的原作者越洋商讨。我们在测 试环境下运行了原著中很多解释得不够清楚的脚本,并对运行结果进行了认真的分析和比对。由 于中西方文化的差异,原著中的一些内容可能使读者感到困惑,另外还有不少地方表述得模糊。 对于这些,我们都尽可能地加了译者注。而对于发现的错误、不当之处或有争议之处,我们也大 多同原作者进行过沟通,并尽力在译文中做了修正。 非常感谢理查德为此中文版写下了热情洋溢的序。他在美国普度大学读书时的校友,原摩托 罗拉网络系统部中国研发中心总工程师、北京大学软件与微电子学院的阮祖望教授也为此译本写 了推荐序。阮教授的序能让我们了解理查德的工作,也能让大家充分认识数据库性能调整与优化 的重要性。 感谢清华大学出版社的王军编辑,他在此书编辑过程中所表现出来的热心、耐心和敬业精神

X Oracle Database 11gR2 性能调整与优化

令我们十分感动;李维杰编辑则做了大量具体的文稿处理工作。同他们合作,让人非常愉快! 陈长青、陈伟林、韩南、黄小满和刘亦龙等 Oracle 公司的同事,分别对书中的技术内容发表 过他们的专家意见,为本书的翻译贡献了力量。 在翻译过程中所遇到的涉及西方生活和思想的问题,也困扰了我们整个翻译组。Jay Edwards 和他的太太 Nancy Edwards,还有 Mary Dopart 女士,对我们的问题做了不厌其烦的解答。另外几 位来自美国和加拿大的朋友也在这方面出了力,只是他们来去匆匆,想记下他们的名字来都未能 如愿。在此我们由衷地感谢这些北美朋友的帮助! 翻译组的每个成员都深深地感谢我们的家人,他们陪伴我们走过了一段辛苦的历程。没有他 们的理解与支持,本次翻译工作的成果是难以设想的。 理查德为我们的中译本作序时提起了赵云,称赞他“不仅重返敌阵救出了刘备的家人,也重 返敌阵救出了张著。”国人几乎没有不知道赵云和刘备大名的,来自大洋彼岸的理查德不仅知道他 们,竟然还知道张著获救,他的博学、博爱及对中国的关注由此可见一斑。翻开史籍,其实张著 也是位勇敢的将军,只是名气没那么大、欠了些磨砺而已。开疆拓土和御敌护国固然都少不得赵 云那样浑身是胆的常胜将军,但更少不得一批像张著那样奋不顾身的中坚力量。广大的中国 Oracle 用户群,普遍依靠的正是“张著”这类敢打敢拼而大有潜力的青年将军,所以应该特别重视他们、 重视对他们的锻炼和培养。如果今天的张著读过理查德数据库性能优化的书后受到启发,且自强 不息,最终成长为赵云一样的大英雄,我们翻译组就可以开心地后读者之乐而乐了。

来自全球的赞誉

''Rich continues to be one of the foremost authorities on tuning the Oracle Database. His collection of tuning tips and tricks is a must-have for any database professional. '' —Judy Sim, Chief Marketing Officer, Oracle

“理查德一直都是数据库性能调优领域中最杰出的权威之一,他所收集的调优技巧和诀窍是 数据库专业人员务必要掌握的。” —Judy Sim,Oracle 首席营销官

''Another 'must have' technical reference for the Oracle professional. Rich's books provide invaluable insight that allows you to get the most out of Oracle and push it to the limit and beyond. '' —Matt Swann, Vice President of Software Development, Amazon.com

“这部新书是 Oracle 专业人士所必备的技术参考手册。理查德的书提供了无价的洞察力,使 您能从 Oracle 中获取最大的收益,并把获取到的东西发挥到极限乃至超限。” —Matt Swann,亚马逊软件开发副总裁

''This is a timely update of Rich's classic book on Oracle Database performance tuning to cover hot new topics like Database 11g Release 2 and Exadata. This is a must-have for DBAs moving to these new products. '' —Andrew Mendelsohn, Senior Vice President, Oracle Database Server Technologies

“这是对理查德 Oracle 数据库性能优化之经典著作的及时更新,以涉及诸如 11gR2 版数据库 和 Exadata 等最新的热门课题。此书是行将使用这些新产品的 DBA 们所必备的。” —Andrew Mendelsohn,Oracle 数据库服务器高级副总裁

XII Oracle Database 11gR2 性能调整与优化

''Packed with tips and tuning tricks, Rich draws from a lifetime of Oracle experience. This book is essential reading for every Oracle DBA who wants to stay current with the nuances of Oracle Database performance tuning. '' —Sohan DeMel, Vice President of Product Strategy,

“这本书汲取了理查德毕生的 Oracle 经验,充满了各种调优的技巧和诀窍。对于每个力求对 Oracle 数据库性能优化领域里任何变化都了如指掌的 DBA 而言,此书是他不可或缺的读物。” —Sohan DeMel,Oracle 公司产品战略副总裁

''Rich makes most complex concepts in Oracle simple and interesting. His deep passion to educate everybody is unique in all his books. I remember 12 years back when I started learning Oracle reading Rich Niemiec books, and even today I consider his books the most reliable source in decision making. No DBA library in this world is complete without Rich Niemiec books. '' —Shiv Iyer, Founder & CEO, Ask DB Experts, Bangalore, India

“理查德把 Oracle 中最复杂的概念变得简单而有趣,他的著作里有一种深切和独特的诲人不 倦的热情。12 年前初学 Oracle 的时候读到了他的书,而今我依然把他的书作为决策时最为可靠的 依据。如果天下哪个 DBA 文库里少了理查德·尼米克的著作,那它就不是个完备的文库。” —Shiv Iyer,印度班加罗尔 Ask DB Experts 公司创始人兼首席执行官

''When I was a junior DBA in Chicago sixteen years ago, Rich Niemiec's brilliant and unique DBA/developer topics exposed me to the wonderful world of performance tuning. In today’s era of Oracle Exadata when hardware and software are engineered to work together, I found Rich still at the forefront of this technology. '' —Steven Xueyong Lu, iTech Consultant Lead, Oracle China

“16 年前的我还是芝加哥城里一个初出茅庐的 DBA,理查德·尼米克才华横溢、独一无二 的 DBA/developer 讲义展现在我眼前的却是一片性能优化的神奇天地。如今已是 Oracle Exadata 软硬件一体机的时代了,而我发现理查德依然走在这门技术的最前沿。” —吕学勇,Oracle 中国区 iTech 顾问经理

''Tuning Oracle Databases is a science. When I need to have an answer to any tuning issue, I always turn to Rich's Oracle Tuning Books. Whether it is 9i, 10g, or 11g, I know I can find the correct solution to the problem. '' —Stan Novinsky, Senior Oracle DBA/VMware Engineer, the Johns Hopkins University Applied Physics Laboratory

“Oracle 数据库调优是一门科学。每当需要针对调优问题给出答案时,我都会求助于理查德 的 Oracle 性能优化的书。无论是 9i、10g 还是 11g 的问题,我都确信可以从中找到正解。”

—Stan Novinsky,约翰·霍普金斯大学应用物理实验室高级 DBA/VMware 工程师

来自全球的赞誉 XIII

''To every difficult problem exists a simple solution; this is what I’ve learned from Rich's books'' —Ghazi Ben Youssef, MBA, Senior Oracle DBA, Sogique, Canada

“针对每个困难的问题都有一个单纯的答案,这是我从理查德的书中了解到的。”

—Ghazi Ben Youssef,加拿大 Sogique 公司工商管理硕士、高级 Oracle DBA

''If you could buy only one book on Oracle 11gR2 this is the one to have in your DBA arsenal. If it's not on your shelf, consider yourself unarmed. Rich does an excellent job of piecing the puzzle of performance tuning in an easy to follow outline. '' —Jerry D. Robinson Jr., Sr. DBA, Northrop Grumman

“如果您只能买一本 Oracle 11gR2 方面的书,那么就应该把这本书填充进您的 DBA 武器库 里。书架上缺了这本书,就自认是手无寸铁吧!理查德干得漂亮:按照一份不难遵循的纲要,拼 出了一幅性能优化的拼图。” —Jerry D. Robinson Jr.,Northrop Grumman 公司高级 DBA

''I admire Rich for his knowledge on Oracle Technology. This book from him is another masterpiece useful for anyone who would like to excel in Oracle Performance Tuning. The book encompasses Rich's rich Oracle expertise and experience and is a must read for all Oraclelites. '' —Hardik Bhatt, Chief Information Officer, City of Chicago

“我很佩服理查德在 Oracle 技术方面的知识,他的这部书是对那些想在 Oracle 性能优化领域 里出头的人十分有助的又一力作。这部书包含了理查德丰富的 Oracle 知识和经验,是所有‘Oracle 籍’人所必读的。” —Hardik Bhatt,芝加哥市政府首席信息官

''If you need the best tuning DBA: call Rich Niemiec! Or get his Oracle tuning book'' —Julian Dontcheff, Senior Oracle Database Administrator, Nokia Corporation, Finland

“如果您急需最好的性能调优 DBA,那就去找理查德·尼米克好了!或是搞一本他性能调优 的书。” —Julian Dontcheff,芬兰诺基亚公司高级 Oracle 数据库管理员

''There is nothing more rewarding than to see someone from your family succeeds in life. Rich being from our Purdue Upward Bound Family has brought much pride to us with not only with his expert Oracle technology knowledge but also with his caring attitude and dedication to help others! '' —Joseph Flores, Director Upward Bound, Purdue University Calumet

“没有比看到自家人在生活中获得成功更让人满足的事情了。理查德作为普度大学低收入家 庭学生向上助学金获得者大家庭里的一员,不仅仅因为专家级的 Oracle 技术知识,更因为关心他 人的态度和帮助他人的奉献精神而使我们为他深感自豪!”

—Joseph Flores,普度大学盖莱默校区向上助学金主任

XIV Oracle Database 11gR2 性能调整与优化

''Rich Niemiec is a phenomenal entrepreneur with incredible depth of knowledge regarding Oracle applications. '' —Prof. Gerald Hills, Coleman Chair of Entrepreneurship, University of Illinois at Chicago

“理查德·尼米克是不同寻常的企业家,他在 Oracle 应用程序方面的知识深度让人惊羡。”

—Gerald Hills,美国伊利诺大学芝加哥校区教授,科尔曼企业家主席

''We have learned much from Rich. '' —Nguyen Hoang, Information Expert, Ministry of Finance, Viet Nam “我们从理查德处获益匪浅。” —Nguyen Hoang,越南财政部信息专家

''Rich Niemiec had the courage to make his dreams come true. Through hard work and determination he overcame obstacles and serves as a role model for all students in TRiO Pre-College Programs. His knowledge and passion go beyond computers; he seeks to inspire others to have the courage to make their dreams come true too! '' —Bobbi Jo Johnson, Upward Bound Advisor, UW-Sheboygan

“理查德·尼米克有使梦想成真的勇气,他以刻苦的工作和坚定的信念克服障碍,为所有领 取低收入家庭助学金的大学预科生树立了榜样。他的知识和热情超越了电脑,他力求在他人身上 也激发出使梦想成真的勇气来。” —Bobbi Jo Johnson,美国威斯康星大学希博伊根分校向上助学金顾问

''The best Oracle Tuning book that I ever read is from Rich Niemiec and I would recommend his book to anyone who needs a better understanding about performance tuning and to enhance their skills in Oracle. '' —Shaharidan Karim, Sr DBA, Commerce Dot Com Sdn Bhd, Malaysia

“Oracle 性能优化方面,我所见过的最好的书籍就是理查德·尼米克的大作了,我要把他的 书推荐给所有打算对性能优化作更深入了解、提高自己 Oracle 技能的人们。” —Shaharidan Karim,马来西亚商务部 Dot Com 私人有限公司高级 DBA

''Rich's boundless passion for technology combined with his zeal to share provides him the unique advantage to create a profound product that is rich in every way—he provides an insider's view that you cannot afford to miss. '' —Anil Khilani, Global Technical Lead, Oracle Corporation

“对技术的无限激情和对分享的热诚给了理查德以独特的优势:他创造的产品在各方面都是 丰富多样的。他是了解内幕的人,他的意见您忽略不起啊!” —Anil Khilani,Oracle 公司全球技术组长

来自全球的赞誉 XV

''Back in the time before MetaLink when Oracle Support was measured in hold time and pounds of manuals, I was lost in the darkness between unrealistic expectations and unreasonable demands. And then there was Rich. Years later, Rich is still a beacon whose insights light the path to my own discovery. '' —Fran Koerner LAOUG Treasurer, DIRECTV, Oracle DBA

“回想起 MetaLink 之前的时代,Oracle 技术支持是以保存时间和成磅重的手册来计量的,我 迷失在不切实际的期望和不合理的要求之间的一片黑暗之中了。这时理查德出现了。多年后,理 查德仍然是一盏明灯,其洞察力照亮了我的自我发现之路。” —Fran Koerner LAOUG Treasurer,DIRECTV,Oracle DBA

''Developers take note: Tuning is not just for DBAs. The proven techniques Rich explains in this book will help you create the most efficient application possible. Every developer who works with the Oracle database should own and read this book. '' —Peter Koletzke, Quovera

“开发人员请注意:优化不仅仅是 DBA 的事!理查德在本书中讲解的成熟技术将帮助您创 建最有效的应用程序,每个使用 Oracle 数据库的开发人员都应该拥有此书并熟读它。” —Peter Koletzke,Quovera 公司

''Michelangelo tells us that our problem is not aiming too high and missing but in aiming too low and hitting every time. With a master like Rich on your bookshelf, you can aim high with confidence. '' —Ronan Miles, British Telecommunications, London

“米开朗基罗告诫说:我们的问题并非目标太高、高不可攀,而是目标太低,唾手可得。如 果书架上有理查德这等高手的书,您就可以去信心满满地制定高目标了。” —Ronan Miles,伦敦英国电信

''Rich Niemiec's record as an expert speaks for itself. His diverse and extensive skills in Oracle technology with infinite possibilities, impacts various aspects of life's application. '' —Albert Nashon Odhoji, Project Coordinator, THE SLUMCODE GROUP, Nairobi, Kenya

“理查德·尼米克的专家记录说明着一切。他在具有无限可能性的 Oracle 技术方面的多样、 广泛的技能,影响着实际生活的方方面面。” —Albert Nashon Odhoji,肯尼亚内罗毕 SLUMCODE 集团项目协调员

''Rich doesn't just know Oracle—he is THE Oracle! '' —Dennis Remmer, MD, E2 Australia, National President, Australian Oracle User Group (AUSOUG) “理查德不仅仅了解 Oracle,他就是全部的 Oracle!” —Dennis Remmer,澳大利亚 Oracle 用户组(AUSOUG)主席

XVI Oracle Database 11gR2 性能调整与优化

''Rich is not only a subject matter expert with Oracle technologies, he is also an outstanding author and friend. He consistently contributes his time, knowledge, and professional experience with the Oracle user community by introducing new features or helping others in need of support. Its individuals like Rich who truly make an impact for the greater good in the Oracle community. '' —Richard Stroupe, President, TRS Consulting Inc., Co-author Oracle Database 10g Insider Solutions “理查德不仅仅是 Oracle 技术方面的论题专家,他还是杰出的作家和朋友。他持之以恒地将 自己的时间、知识和专业经验奉献给 Oracle 用户社区,介绍新功能或者帮助那些需要支持的人。 正是像理查德这样的人,对 Oracle 社区的“大我”发挥着实实在在的影响。” —Richard Stroupe,TRS 咨询公司主席,Oracle Database 10g Insider Solutions 合著者

''The knowledge and skills from Mr. Niemiec are an unique experience within tuning issues. '' —Filipe Texeira de Souza, Systems Manager, Rio de Janeiro City Hall’s Secretary of Education, Brazil “从尼米克先生处获得的知识和技能是性能调优方面独到的经验。” —Filipe Texeira de Souza,巴西里约热内卢市政府教育统筹局局长、系统经理

''Rich is a true expert in Oracle tuning. He not only masters the theory and tools, but is also able to perform insightful analysis of real-world problems and present the results in a way that makes sense even to people not so experienced with database technologies. This is important since business people are getting more and more interested in IT performance in general—as they really should. '' —Jussi Vira, Manager, SAP Technologies and Infrastructure, Nokia Corporation “理查德是 Oracle 性能优化方面的真正专家,他不仅掌握了理论和工具,还能对现实环境中 的问题进行精辟分析;他展现的结果,使在数据库技术方面没什么经验的人都能明了。这一点很 重要,因为总体说来商务人员对 IT 性能越来越感兴趣——他们理当如此。” —Jussi Vira,诺基亚公司 SAP 技术和基础设施经理

''Rich Niemiec is the Oracle expert on tuning and we can all learn from Rich. '' —Dr. Oleg Zhooravlev, CEO, Adit information Technologies, Israel “理查德·尼米克是 Oracle 性能优化方面的专家,我们大家都可以向理查德学习。” —Oleg Zhooravlev 博士,以色列 ADIT 信息技术首席执行官

''Someone said that smart people learn from their mistakes while wise people learn from others' mistakes. When involved in performance and tuning issues I think that both smart and wise ones can learn from the vast and valuable experience Rich has documented within these pages. '' —Maurizio Bonomi, Italy “有人曾经说过:聪明人能借鉴于自己所犯过的错误,而智者能借鉴于他人所犯过的错误。 当涉及性能和调优方面的问题时,我认为聪明人和智者都可以从理查德在这些篇章中介绍的丰富 而宝贵的经验中学到东西。” —Maurizio Bonomi,意大利

“上帝眷顾着我们大家,赋予我们做到最好的才智。”

致丽贾娜——挚爱……

最美丽的玫瑰啊,你在那儿!难忘那一天,上帝把你展现在我的面前。丽贾娜,你是严寒冬 夜里温暖我心灵的光,是带给我真幸福的心肝宝 贝儿,是让我充分发挥并取得成功的秘诀。黄砖 路通往钻石梦和翡翠城1,路上满是世俗、华尔街、 大公司和快速致富指南一类的东西,而丽贾娜从 未想过要走这条路。和她在一起的漫漫人生途中, 有太空山上的惊险,也有西湖边漫步的愉悦。旅 途终归是旅途,并非短程赛跑,也并非重要人物 的议事午餐会。有丽贾娜伴在身边,这一路都美 妙、精彩、不枯燥,感觉就是不一样。尽管时时 经历些艰难,常常遭遇到挑战,她和我却始终恩爱如初。 在 Oracle 这片天地里,当以 NASCAR(全国运动汽车竞赛协会)的速度和对手比拼时,想要放 慢速度谈何容易?丽贾娜和我相伴着走过了从食不求甘、租花办婚礼,直至安居乐业、高枕而无 虞的一段路。我们希望别人也来认识通往幸福的途径,而在这条途径上却要一路善待他人,简单 快乐,以至要为应对挑战而伤脑筋。有上帝引领,我们跟随着就是了,未来绝少是如人们自己想 象的那般样子。督促他人改变和成功往往是最艰难的差事。完美难求,我们全力以赴吧!丽贾娜 始终希望那些像我们一样在困境中长大的孩子们,能够凭借受教育而为自己赢得更好的前程,她 认为教育是在生活中获得成功的关键。当我们干得不错、得以放缓脚步的时候,她立即开始帮助 他人来认识这条成功之路。教育胜过力量,它充满变化,充满见识,并为我们提供了美好的未来。

1 译者注:“绿野仙踪”是获得了奥斯卡奖的歌舞大片,讲述小女孩桃乐丝被龙卷风刮到鲜花盛开的 OZ 国、又沿着黄砖路去翡 翠城向魔法师求愿的童话故事。

XVIII Oracle Database 11gR2 性能调整与优化

最重要的是,它不仅助您成功于当下,还助您成功于世界变革之际,而这样的变革必将贯穿于您 的一生之中。别了,翡翠城的宽门2,丽贾娜才真正称得上是 OZ 国里指点迷津的魔法师3啊(连她 的车牌号都以 OZ 开头)!尽管澳大利亚人非常友善,我们却没有选择坐在悉尼歌剧院的前排座位 里听音乐会,而宁愿回家,到 Cracker Barrel4店子前廊的摇椅上坐观树叶变化千般。 “生活里简单的事往往又是生命中最美妙的事”,随着时间的推移,丽贾娜教我懂得了这样 的道理。她嘛,总是 ● 更喜欢大众餐厅里的早餐,而不是蒂芙尼的早餐 ● 喜欢一把薄荷糖,胜过喜欢酒心巧克力 ● 喜欢南瓜咖啡,胜过喜欢唐培里侬香槟王 ● 喜欢去奥布韦斯奶品店来上一杯梦幻香草奶昔,胜过喜欢提拉米苏(我也一样!) ● 喜欢比克圆珠笔,胜过喜欢万宝龙镶钻笔 ● 宁愿小猫一大群外加一条大狗(斯巴达克斯),也不愿第五大道上禁止带宠物 ● 喜欢清晨自己驾车,带着孩子、喝着咖啡、听着广播电台 KLOVE 节目的音乐,更胜过 搭乘由专职司机驾驶的豪华轿车 ● 更愿意去“安德森太太乡村庭院”餐厅里品尝苹果饼,而不愿去参加高级商务午餐会 ● 喜欢自制的南瓜饼涂上鲜奶油,胜过喜欢法式焦糖布丁 ● 喜欢秋天色彩缤纷的树叶和清新的空气,胜过喜欢烈日当头、熙来攘往的海滨 ● 喜欢在阳光灿烂的日子里参加为圣母玛利亚雕像加戴花冠的仪式,胜过喜欢参加辣味午 餐 5 千米赛跑(那辣椒可是真过瘾!) ● 更喜欢搭马车逛密歇根大道,而不是搭出租汽车 ● 更喜欢徒步走过悉尼大桥的顶拱(攀登大桥),而不是由顶拱底下的车道开车过桥 ● 更喜欢在大堡礁潜水及在夏威夷冲浪,而不是闲坐在泳池边 ● 更喜欢沿着考艾岛的海滨漫步前往夏威夷式宴会,而不是去保罗的餐厅5用晚餐 ● 喜欢漫步西湖边,胜过喜欢搭观光车回旅馆 ● 喜欢轻快地走在千禧公园里,一路看烟花;胜过喜欢拉把椅子来,坐观北滩景 ● 在零下二十度的天气里赶去观看芝加哥熊队和绿湾包装工队的足球赛(那可是我的主意) ● 喜欢坐跳楼机,至少要坐旋转椅吧?(或者什么都不坐……这又是我的主意) ● 更喜欢在零下气温的天气里看完熊队和包装工队的足球赛后去“野火”餐厅里用餐,而 不是闷在家里看电视转播 ● 无悔于普度大学的糖果店之行,那可是千金难买的啊! Oracle 复杂、艰深而神秘。真正令人兴奋的时刻随着我们的第一个孩子牙牙学语、蹒跚学步 而开始,老大的后面还紧跟着老二、老三和老四。丽贾娜对丈夫的爱被她要让孩子们生活得更好 的责任心所超越了,而这种责任心是出乎于伦理道德、出乎于要让孩子们受到良好教育的承诺, 也是出乎于她仁慈待人的天性。上帝眷顾着我们大家,使我们每个人都可能获得做到最好的才智。 丽贾娜始终致力于从孩子们身上发掘出深藏着的潜力来,更重要的是,她以母亲那特有的爱和理

2 译者注:耶稣说:“你们要进窄门。因为引到灭亡,那门是宽的,路是大的,进去的人也多;引到永生,那门是窄的,路是 小的,找着的人也少”。 3 译者注:“绿野仙踪”中被龙卷风刮到 OZ 国的小女孩桃乐丝去翡翠城求魔法师指点归途。历尽艰辛回到家后,连声感叹“哪 里都比不上家里好”。 4 译者注:这是一家分布在美国各地的餐厅连锁店,开在临近公路的地方;一半餐厅一半商店的复合式经营,不管到了哪里, 店门口都有一长排手工打造的摇椅。 5 译者注:芝加哥最老牌的法式餐厅。

XIX

解来为孩子们引路,而雅各、卢卡斯、荷莉安和梅丽莎也总是让我们感到自豪。 丽贾娜并非完人,然而对我来说,她的确是非凡的领导者。她身上展现出了如下诸般特质: ● 正直诚实:她深爱他人,对他们负责,不负自己的信念 ● 生理勇气:最艰难的时候,她是位了不起的母亲(普天下的父母都经历过这样的时日,他 们为此而获得帮助和赞颂是理所应当的) ● 主动性:她以创业的精神从无到有地创办了“基石青年女子学习中心” (www.cornerstonewomen.org),而这也是出于对那些有此需求的人们的爱 ● 精神勇气:为建成“基石青年女子学习中心”,她承受政治异议的勇气令人惊异 ● 无私:她与他人分享己之所有,无论自己“初有的”还是“仅有的”,她都不吝惜 ● 灵活变通:她总是以厚道的态度和朝前看的愿望来面对不同意见 ● 坚韧:看似无路可走时,她上上下下、左左右右、里里外外地找,总能找到路(她从父母 那里传承了极为罕见的韧劲) ● 尊重:她尊重同事和周围所有的人 ● 谦逊:她多年来都生活在我的影子中,并没有人知道在 TUSC 跻身 Inc. 500 强公司之列 的过程中她帮过我多少忙 ● 刚毅:她出于信念和远见而工作。尽管面对障碍,她却有着凭借勇气和品格闯过最难之 难关的毅力,而且还帮助我来做到这一点 普度大学的糖果店把我带到了最亲爱的宝贝儿——丽贾娜的身旁,她给周围的人们以希望, 并照亮了通往美好未来之路:她是一位守护者。

作 者 简 介

Rich Niemiec 是全球知名的 IT 专家,他是 Oracle ACE 总监和 Oracle 认证大师。TUSC 公司 始创于 1988 年,总部在美国芝加哥,而 Rich 曾是 TUSC 的首席执行官和创始人之一。TUSC 是 致力于 Oracle 业务解决方案的系统集成商,跻身于全美发展速度最快的 500 强之列,在美国各地 有 10 家分号。目前,Rich 是 Rolta TUSC 和 Rolta 国际企业信息和通讯技术公司的主席,并且是 Rolta 国际董事会的常务顾问。TUSC 曾是 Oracle 公司在 2002、2004、2007、2008 和 2010 年的年 度合作伙伴,Rolta TUSC 则是 Oracle 公司 2011 年的年度合作伙伴。Rolta 公司是全球地理空间信 息化解决方案市场中的领头羊,同时对来自于基础设施、电信、电力、机场、国防、国土安全、 城市发展、城镇规划和环保等各业的需求提供信息化服务。 Rich 曾任全球 Oracle 用户协会(IOUG)主席,也是现任的美国中西部 Oracle 用户协会(MOUG) 主席。过去的 30 年里,他为宏扬 Oracle 技术而频频发表演说,足迹几乎遍及了美国所有的主要 城市,还到过很多国际大都市。他 6 度被评为 Oracle 合作者/全球用户大会最佳演讲人,10 度被 评为中西部用户大会最佳演讲人,还被评为了 Oracle 全球大会最佳演讲人。过去的 25 年间,他 为很多名列财富 500 强的客户设计过系统架构并实施过优化,这些客户中包括 ACT、玛氏公司、 麦当劳、诺基亚、Navteq(MapQuest)、密西根大学、AT&T 和百事可乐。他既可以开展教学又可 以提供咨询,在执行方向、数据库管理和架构、性能优化、项目管理和技术教育等方面的经验尤 为丰富。他是全球最早荣获 Oracle 大师认证(OCM)的 6 强人之一,经常和 Oracle 开发团队一道工 作,特别是在 beta 测试的过程中。2007 年,他撰写的《Oracle Database 10g 性能调整与优化》一 书被评为 Oracle 丛书中的最畅销书,在此之前,该书的 8i 和 9i 版也分别被评为性能优化类中的 最畅销书。 Rich 的名字于 1998 年被列入美国企业家名人堂。2006 年他荣获全国贫困家庭学生成功者奖, 2007 年又荣膺普度大学校友杰出电机和计算机工程师奖。

技术审校者简介

过去的 15 年间,Janet Stern 在 Oracle 公司的许多岗位上任过 职,工作重点是培训和文档,而这些最新文档是为诸如流(Streams)、 真正应用集群(Real Application Clusters,RAC)以及面向 Exadata 的 服务质量(Quality of Service,QoS)管理等 Oracle 最先进特性而创建 的。这样的阅历使她对 Oracle 数据库性能优化有着独到的见地。不 需要忙于 Oracle 文档的时候,她就在家里照料三个孩子、丈夫、三 只猫和她那条名叫 Jeb 的狗。 Michelle Malcher 是在数据库开发、设计和管理方面有着多年经验的 DBA 团队首领。她可以驾驭非常大的数据库环境,并且专长于安全性、 性能调优、数据建模和数据库结构。作为一名 Oracle Ace 总监,她乐于分 享最佳实践方面的知识,而这些知识都是牵涉到实际数据库环境的。她工 作的重心是设计、实施和维护那些支持业务和重要业务流程的稳定、可靠、 安全的数据库环境。她是全球 Oracle 用户协会(IOUG)的董事会成员,目 前还任该机构的教育署署长。她为 IOUG 的 Select Journal 杂志和一本名 为 Oracle Database Administration for the Microsoft SQL Server DBA(McGraw-Hill/Oracle 出版社,2010) 的书撰写文章,并且还是《Oracle Database 11g 初学者指南》的合著者之一。

译 者 简 介

杨中 清华大学计算机科学与技术系学 士、硕士,从 2004 年起在甲骨文研究开 发中心工作,现任数据库核心研发产品 线的高级经理,专注于 Oracle 数据库尤 其是一体机 Exdata 上的性能优化。参与 了国内外许多客户的 Exadata 项目,解 决棘手的性能问题,经常与客户分享经 验、心得,在 2010 年北京 Oracle Open World 上发表主题演讲“Oracle 数据库 性能终极揭密”和“最新真实世界性能 挑战”。 感谢妻子欧阳婷长久以来的相知相伴。在本书翻译的艰苦阶段,我们的宝宝茗烨呱呱降生, 为我们二人带来从未经历过的欢喜。婷承担了大部分抚育幼子的任务,再次感谢我生命中的两位 挚爱对我的全部支持!

XXIV Oracle Database 11gR2 性能调整与优化

朱波 2007 年6 月加入 Oracle 数据库研发 部门,参与 Oracle RAC 数据库多个版本 (10gR2、11gR1、11gR2 等)的研发工作, 对 Oracle RAC、ASM 等技术有深入理 解。2011 年 10 月至今服务于 Oracle 亚 太区售前技术支持 iTech 部门。支持过 国内、香港、日本和美国等地的众多客 户。工作之余乐于分享和与同行交流, 有关这些内容可以在他的个人博客 www.rickyzhu.com 上找到。 在本书的翻译过程中,我的妻子和七岁的儿子给了我最大的理解和支持,在这里要特别感谢 他们!

吕学勇 北京人,在美国留学、生活、工 作二十余年,从 AT&T 贝尔实验室开 始了数据库应用开发的职业生涯。在 芝加哥期货交易中心,为世界首架电 子期货交易平台编写过数据库应用程 序。涉足 Oracle DBA/应用程序开发 领域后,热衷于算法理论在数据库性 能优化方面的应用,曾以在 Oracle 公 司的《技术通讯》杂志上分析典型案 例为趣事。目前在 Oracle 深圳任 iTech 顾问经理。 与妻子智红结缘于加拿大温哥华,闲暇时喜欢到世界的各个角落去远足。傍晚时分,她起火 煮饭,和在家里一样。还要准备好次日的行程用品,然后就看着我心无旁骛地为报社撰稿,并在 我与读者分享的远方见闻和感受中,偶尔插一句她的话。

致 谢

本书的目的,主要是想帮助初级和中级的 Oracle 专业人士了解 Oracle 系统及更好地优化它。 书里也介绍了不少专家主题,但首要的任务却是帮助那些被性能问题折磨得十分沮丧的专业人士, 他们希望得到有助于改善数据库性能的朴实建议。本书的目标很单纯:提供装满此类建议的武库, 在各种不同的情况下您都可以利用这些建议来使系统快起来。 我要感谢 Janet Stern 美妙绝伦的技术编辑工作,来自 Oracle 的她绝对是非常棒的科技大师, 我简直不能奢望可以找到比她更好的技术编辑了! 她为每章都增添了宝贵的内容,并认真梳理了 每一个细节,她是我所认识的最敬业、最能干的 Oracle 专业人士之一。我也要感谢 Michelle Malcher 帮助技术编辑了本书靠后面的一些章节,没有 Michelle 出色的工作,我们就不可能把事情完成得 如此快和好。我要感谢 McGraw-Hill 的高级策划编辑 Paul Carlstroem,他带我走过本项目的每一 步骤时,都是风度翩翩,指导有方(需要他的时候,他有叫必到);感谢 McGraw-Hill 的策划协调 员 Stephanie Evans,他使我们一路下来都保持着正确的方向。McGraw-Hill 的高级营销经理——Ian Au,是极好的共事者和出色的推动者。Melinda Lytle 在协调所有艺术产品方面做了出色的工作。 谢谢您,Lisa McClain,您使我开始着手这项工作并很早就制定了方向。感谢我的清样编辑—— LeeAnn Pickrell,她确实把本书提高到了一个新水平上。LeeAnn 采用了使本书更加直观的标准, 改善了书的连贯性,让句子更清晰并带了几分莎士比亚的风格,她以这些来确保本书的易读性, 确实把它变成了一部对读者更为有益的书。最后,感谢 Scott Rogers 和 Jeremy Judson,因为我告 诉您们说几星期后就可以交货而实际上拖了两年,但您们还是让我的书获得了通过。

感谢在下述章节中提供了帮助的人: ● Mike Messina,您更新了第 1 章的很多内容,测试了第 2 章中的查询并更新了 b-level 部 分,感谢您的工作。您的工作价值无边,您是难得的 Oracle 人才! ● Kevin Loney,感谢您先前更新第 2 章的工作。

XXVI Oracle Database 11gR2 性能调整与优化

● Sridhar Avantsa 更新了第 3 章并做了很多补充。此外,Bill Callahan 和 Nitin Vengurlekar 先 前更新了第 3 章。 ● Lucas Niemiec 测试了第 4 章中的脚本,Craig Shallahamer、Randy Swanson 和 Jeff Keller 先 前做过注释和更新。 ● Anil Khilani、Prabhaker Gongloor(GP)、David LeRoy、Martin Pena、Valerie Kane 及 Mughees Minhas,感谢您们在 Enterprise Manager 屏幕截图以及第 5 章的信息方面的帮助。 ● Warren Bakker,感谢您对第 6 章所做的极好的更新和补充,感谢 Mark Riedel 和 GregPucka 先前对这一章的帮助。 ● Mark Riedel 对第 7 章做了极好的更新。感谢 Lucas Niemiec 在“要诀”方面的额外研究 工作。 ● Rama Balaji 协助更新了第 8 章,Connor McDonald 和 Rob Christensen 在先前的注释和 版本方面提供了帮助。 ● Mike Messina 帮助将 Real Applications Testing 和 SQL 性能分析器补充到了第 9 章,加拿 大的 Joe Holmes 为第 9 章提供了高级信息。哥伦比亚国立大学麦德林分校的 Francisco Javier Moreno、Guillermo L. Ospina Romero 和 Rafael I. Larios Restrepo 协助了第 9 章的测 试。Roger Schrag 提供了第 9 章中连接方面的部分原始信息。 ● Bob Taylor 通过对第 10 章的更新又一次出色地完成了工作,Joe Trezzo 和 Dave Ventura 对先前的版本提供了帮助。 ● 与 Madhu Tumma、Brad Nash、Jake Van der Vort 和 Kevin Loney 对第 11 章作出贡献的同 时,Richard Stroupe 对该章做了极好的补充。 ● Rama Balaji 帮助更新了第 12 章里的很多内容,Kevin Gilpen、Bob Yingst 和 Greg Pucka 也作出了贡献。 ● Graham Thornton,感谢您对第 13 章的更新和所做的极好补充,Kevin Gilpen 对先前的版 本提供了帮助。澳大利亚的 Steve Adams 过去曾经是技术编辑,并且写过很多 X$脚本。 ● Hollyann Niemiec 做了第 14 章中引述的工作,Robert Freeman 和 Kevin Loney 为第 14 章 先前的版本提供了帮助。 ● Brad Nash 对第 15 章先前的版本提供了更新,Lucas Niemiec 在 11gR2 上对该章的查询进 行了测试。 ● Doug Freyburger 对第 16 章做了极好的更新,Judy Corley、Mike Gallagher 和 Jon Vincenzo 更新过先前的版本。 ● Lucas Niemiec 对附录 A 中的所有查询做了测试并针对 11gR2 做了更新。 ● Jacob Niemiec 对附录 C 中的所有查询进行了测试并针对 11gR2 做了更新。 ● Melissa Niemiec 对前言部分提供了思路、引述和建议。

致 谢 XXVII

感谢那些和我的生活有重大关系的 Oracle 人士: ● 感谢 、Bruce Scott 和 Ed Oates 创造的伟大数据库及前瞻性思维, 您们开创了有史以来最具创新力的企业! ● IOUG(国际 Oracle 用户组)使我这许多年来的 Oracle 生活从容了许多。 ● Andy Mendelsohn,感谢您对一些十分棘手的问题提供了答案,并且驾驭这一无与伦比的 Oracle 数据库不断达到新的水平。 ● Judith Sim,您是把 Oracle 推向顶峰的公司领导人之一,感谢您的帮助! ● Thomas Kurian,感谢您使融合中间件出名,并把 Oracle Applications 提高到新的水平。 ● Mary Ann Davidson,感谢您的领导才能并维持 Oracle 的安全。 ● Ted Bereswill,您使我们在 Oracle 合作伙伴计划中成为真正的伙伴! ● Tom Kyte,您是至上的 Oracle 技术大师! ● Angelo Pruscino、Kirk McGowan 和 Erik Peterson,没有你们三位,就没有 RAC;没有 Angelo,RAC 将会是一团糟。感谢 Dan Norris 和 Phil Stephenson 在 Exadata 方面的帮助。 ● Justin Kestelyn,您用 OTN 教育了全世界。 ● Tirthankar Lahiri 在 bufffer cache 方面的工作做得多漂亮! ● Bruce Scott,感谢您付出时间来接受专题文章的采访,并且发来罕见的 Oracle 创始人的 照片。

除了上面感谢过的人之外,还要感谢下述在某种意义上为本书的这一版出过力的人们: David Anstey、Eyal Aronoff、Mike Ault、Janet Bacon、Kamila Bajaria、Roger Bamford、Greg Bogode、Mike Broullette、Don Burleson、Bill Burke、Rachel Carmichael、Tony Catalano、Rob Christensen、Craig Davis、Sergio Del Rio、Dr. Paul Dorsey、Kim Floss、Mark Greenhalgh、K. Gopalakrishnan、Tim Gorman、Kent Graziano、Damon Grube、Roman Gutfraynd、Vinod Haval、 Gerry Hills、Steven Hirsch、Nguyen Hoang、Pat Holmes、Scott Heaton、Jeff Jacobs、Tony Jambu、 Tony Jedlinski、Ron Jedlinski、吉志刚、Jeremy Judson、Dave Kaufman、Mike Killough、Peter Koletzke、 Tom Kyte、Mike La Magna、Vinoy Lanjwal、Steve Lemme、Jonathan Lewis、Bill Lewkow、Kevin Loney、吕学勇、Scott Martin、Connor McDonald、Sean McGuire、Ronan Miles、Cary Milsap、Ken Morse、Shankar Mukherjee、Ken Naim、Arup Nanda、Frank Naude、Pradeep Navalkar、Albert Nashon、 Aaron Newman、Dan Norris、Stanley Novinsky、Cetin Ozbutun、Tanel Poder、Venkatesh Prakasam、 Greg Pucka、Heidi Ratini、Steve Rubinow、Chuck Seaks、Bert Spencer、Craig Shallahamer、Burk Sherva、 Judy Sim、Richard Stroupe、Felipe Teixeira de Souza、Randy Swanson、Megh Thakkar、George Trujillo、 Madhu Tumma、Gaja Krishna Vaidyanatha、Jake Van der Vort、Murali Vallath、Shyam Varan Nath、 Dave Ventura、Sandra Vucinic、Lyssa Wald、Milton Wan、Graham Wood、Tom Wood、杨 中 、Pedro Ybarro、Ghazi Ben Youssef 和 Dr. Oleg Zhooravlev. 我要感谢一生中两个最好的搭档:Brad Brown 和 Joe Trezzo。 我们组成了一个兄弟大乐队!我要感谢 TUSC、 Rolta、Piocon 和 WhittmanHart(现在都是全球 Rolta 公 司)里所有的人,他们每天都刻苦工作,力求完美。感谢 Barb、Karen、Sandy、Kim 和 Amy 使我们保持理智,感 谢 Tony、Dave、Barry、Burk、Bill、Bob、Janet、Terry、 Heidi、John、Matt 和 Mike 的领导才能和留给我的美好

XXVIII Oracle Database 11gR2 性能调整与优化

记忆,感谢 KK、Ben、Mark、Sohrab、Vinay、Blane、Jack、Dave 和 Rif 把我们带到那个全球性 的天地中去,感谢 Sanjay、Narendra、Nimesh 和所有使我们在世界的另一边保持头脑清醒的人 们。我要感谢 Eric Noelke 和 Mike Simmons 给了我在 Oracle 里的第一份工作,还要感谢 Matt Vranicar 在我刚去的时候帮我搞懂了索引。虽然不能去向 Rolta 里的近 4000 人一一致谢,但我还 是要感谢大家每日里使世界变得更好的工作!

我要感谢那些来自 Rolta TUSC 的、在本书写作过程中协助过我的人们(这是一个超级巨星的 小清单): Barbara Allen、Stacy Allen、Ravishankar Ananthanarayana、Lalit Anapu、Andy Anastasi、Nilton Aquino、Jyotin Arora、Manu Arora、Hiranya Ashar、Sridhar Avantsa、Steve Babin、Rohit Badiyani、 Warren Bakker、Rama Balaji、Mathi Balasubramaniam、Bruce M. Bancroft、Bill Banze、Otis Barr、 Roger Baroutjian、Chris Baumgartner、Roger Behm、Vinny Belanger、Matthew Berrisford、Bobby Bhandari、Sohrab Bhot、Donald Bieger、Paul Bobak、John Bogdue、Greg Bogode、Keith Braley、 Jessica Brandenburg、Christopher Brinkman、Bob Britton、Bradley David Brown、Deborah Bryda、 Mike Butler、Eric Kamplin、Alain Campos、Bolton Carroll、Tony Catalano、Matthew Chance、Bharat Chitnavis、Bob Christensen、John Clark、James Clarke、Mike Cochran、Liz Coffee、Randy Cook、 Judy Corley、Joselle Cortez、Dick Coulter、Matt Cox、Janeen Coyle、Darrel Craig、Keith D’agostino、 Janet Dahmen、Terry Daley、Prithis Das、Don Davis、David deBoisblanc、Brian Decker、Hank Decker、 Mario Desiderio、Dinesh De Silva、Ernie DiLegge、Robert Donahue、Dan Dosmann、Melloney Douce、 Barb Dully、Brian Dunnells、Christopher Dupin、Ben Eazzetta、Melissa Eazzetta、Marcus Eidson、 Phillip Ellington、Reida Elwannas、Phil Estep、Mark Fate、Andy Fiesman、Robert Filtzkowski、Robin Fingerson、Newton “Fletch” Fletcher、Yvonne Formel、Dave Fornalsky、Joshua Forrest、Stacie Forrester、 Sergio Frank “Power Surge”、George Frederick、Doug Freyburger、Jan Gabelev、Steve Galassini、John Gallacher、Chris Gamble、David Gannon、Laxmidhar Gaopande、Michael Garcia、Nimesh Gawad、 Biju George、Santhosh George、Brad Gibson、Brad Gillespie、Kevin Gilpin、Agenor Gnanzou、Martin

致 谢 XXIX

Goodfriend、MK Govind、Chelsea Graylin、Dexter Greener、John Griebel、Ignacio Guerrero、Narendra Gupta、Brian Hacker、John Halsema、Scott Heaton、Andrew Henderson、Katy Heng、Kristina Henning、 Allwyn Henry、Mark Heyvaert、Karen Hollomon、Amy Horvat、Vijayashankar Hosahalli、Sharon Howard、Thomas Huelsman、Mohammad Jamal、Cyndi Jensen、Rif Jiwani、Shafik Jiwani、Benjamin Johnson、Kimberly Johnson、Cristin Jones、Monica Jones、Kimberly Joyce、William Kadlec、Sudhir Kalavagunta、Joanna Kalgreen、Sandeep Ohri、Anil Kalra、Palaniappan “Palani” Kasiviswanathan、 Dave Kaspar、Dorraine Keim、Karen King、Nicholas King、Bruce Kissinger、Robert Koester、Kirby Kraft、Kiran Kulkarni、Sampath Kumar、Matthew Kundrat、Thomas Kuruvilla、Deborah Kuznik、 Felix LaCap、Lynn Lafleur、Wendy Lamar、Bob Landgren、Bob Landgridge、Randy Lawson、Bill Lewkow、Jack Leahey、Brad Linnell、Lawrence Linnemeyer、Paul LoBue、Scott Lockhart、George Loewenthal、吕学勇、Andy Mackintosh、Dana MacPhail、Chris Madding、Tim Mahoney、Gregory Mancuso、Suganya Manoharan、Claude Mariottini、Donald Martin、Daniel Martino、Chip Mason、 Grant Materna、Joe Mathew、Chris McElroy、Brendan McGettigan、Patrick McGovern、Kamlesh Mehta、 Carlos Mendez、Rey Mendez、Subodh Mendhurwar、Prakash Menon、Andy Merrett、Mike Messina、 Matt Metrik、Brian Michael、Eric Mies、Melissa Miller、Michael Milner、Quadeerullah Mohammed、 John Molinaro、Patrick Monahan、Albert Moreno、Sanjay Narkar、Ravishankar Narayanan、James Nash、 Eric Noelke、Mark O‘Dwyer、Gary Ohmstede、Sandeep Ohri、Steven Ostendorf、James Owen、David Pape、Breanne Parker、John Parker、Mohan Parna、Charlotte Partridge、Amit Haresh Patel、Ashvinkumar Patel、Jitendra Patibandla、Reggie Peagler、Vishnuvardhan Reddy Peddamaru、Mark Pelzel、Gregg Petri、 Greg Pike、Caleb Pingelton、Eric Potts、James Powell、Lynne Preston、Preetha Pulusani、Mohammed Quadeer、Karen Quandt、Kathleen Quinn、Sriram Rajagopalan、Aakash Rami、Samir Rane、Heidi Ratini “Trinity”、Douglas Resler、Aleksandr Reyderman、Mark Riedel、Holly Robinson、Jeremy Rogers、 Randy Rogers、Rob Rolek、Sean Ryan、Sherry Safranski、Mirinda Sandoval、Alwyn Santos “The Machine”、Satinath Sarkar、John Sasser、Leon Saverus、Vinay Sawarkar、Blane Schertz、Louis Schoeller、 Steven Schuld、Chad Scott、John A. Senatore、Ahsan Shah、Girishan Shanmugam、David R. Shearin、 Sharon Sherley、Burk Sherva、Makarand Shete、Jeremy Simmons、A.P. Singh、Aditya Singh、KK Singh、 Karan Singh、Ronak Sitafalwalla、Dave Sligting、David Smith、Molly Smith、Karen Smudde、Patrick Spaulding、Laura Sprowls、Stephanie Spurrier、Ed Stayman、Jack Stein、Michael Stevenson、Cheryl Stewart、Jerzy Suchodolski、Sreedhar Swayampakula、Srikalyan Swayampakula、Michael Tarka、 William Tate、Atul Tayal、Bob Taylor、Sameer Satish Thawani、Chris Thoman、Leo Thomas、Bryan Thompson、Graham Thornton、Thomas Tisdale、Bill Toebbe、Renee Townsend、Joseph Conrad Trezzo、 Dave Trch “Torch”、Joel Tuisl、Tom Usher、Amit Vaidya、Hiten Valia、Lynne VanArsdale、Chandrasekar Vellala、Dave Ventura、Tejinder Vohre、Matthew G.Vranicar、Ashrith R. Vuyyuru、Sandra Wade、 Randy Warner、John Watson、John Weicher、Joyce Wheeler、John Whitaker、Barry Wiebe、James Williams、Nicole Wilson、Mark Wittkopp、Mark Woelke、Gary Wojda、Lisa Wright、Bob Yingst、 James Zadrovicz 及 Julian Zambra。

XXX Oracle Database 11gR2 性能调整与优化

还要感谢那些对我的生活产生了影响的人们: Sandra Hill、Floyd & Georgia Adams、Kristen Brown、Lori Trezzo、Sohaib Abbasi、Michael Abbey、Ian Abramson、Jeff &Donna Ackerman、Steve & Becky Adams、Keith Altman、Judson Althoff、 Joe Anzell、Joe Arozarena、Ian Au、Mike Ault、Paster James C. Austin、Jim Basler、Nicholas Bassey、 John Beresniewicz、Hardik Bhatt、Ronny Billen、Jon & Linda Bischoff、Keith Block、George Bloom、 Melanie Bock、Mike Boddy、David Bohan、A.W. Bolden、Rep. Henry Bonilla、Rene Bonvanie、Stephen Boyle、Gary Bradshaw、Ted Brady、Barry Brasseaux、Aldo Bravo、J. Birney & Julia Brown、John Brown、Karen Brownfield、Sam & Rhonda Bruner、Bill Burke、Ashley Burkholder、Lillian Buziak、 Dan Cameron、Bogdan Capatina、Rachel Carmichael、Monty Carolan、Christina Cavanna、Sheila Cepero、Edward Chu、Sonia Cillo、Dr. Ken Coleman、Margarita Contreni、Mike Corey、Peter Corrigan、 Jason Couchman、Stephen Covey、Shanda Cowan、Richard Daley、Sharon Daley、Nancy Daniel、 Barb Darrow、Jeb Dasteel、Mary Ann Davidson、Tom Davidson、Elaine DeMeo、Tony DeMeo、Sohan DeMel、Jose DiAvilla、Julian Dontcheff、Mary Lou Dopart、Joe Dougherty Jr.、Bob & Lori Dressel、 Carl Dudley、Carlos Duchicela、Ben & Melissa Eazzetta、Matt Eberz、Jeff Ellington、Lisa Elliot、Brian Embree、Buff Emslie、Dan Erickson、Chick Evans Jr.、Lisa Evans、Dr. Tony Evans、Mark Farnham、 Tony Feisel、Dick Fergusun、Julie Ferry、Stephen Feurenstein、Ted & Joan File、Caryl Lee Fisher、 Lee Fisher、Charlie Fishman、Tim & Jan Fleming、Flip、Joe Flores、Andy Flower、Mark Fontechio、 Heidi Fornalsky、Vicky Foster、Rita Franov、Kate Freeman、Doug Freud、Mike Frey、Dr. Susan Friedberg、Sylvain Gagne、Karen Gainey、Mike Gangler、Fred Garfield、Charles Gary、Sharon Gaudet、 Julie Geer-Brown、Jenny Gelhausen、Len Geshan、George Gilbert、Tom Goedken、Mark Gokman、 Alex Golod、Laverne Gonzales、John Goodhue、Ellen Gordon、Kevin Gordon、Greg Gorman、Dennis Gottlieb、Joe Graham Jr.、Cammi Granato、Tony Granato、John Gray、Kent Graziano、Alan Greenspan、 Carrie Greeter、Sarah Grigg、Ken Guion、Mark Gurry、Eric Guyer、Pasi Haapalainen、Steve Hagan、 Rebecca Hahn、John Hall、Don Hammer、Rick & Tammy Hanna、Robert Hanrahan、Bob Hausler、 Jim Hawkins、Marko Hellevaara、、John Hernandez、Bob Hill、James Hobbs、Stacy Hodge、 Kristin Hollins、Pat Holmes、Napoleon Hopper Jr.、Howard Horowitz、Jerry Horvath、Dan Hotka、 Rich Houle、Maureen Hoyler、Ellie Hurley、Laura Hurley、Jerry Ireland、ShivIyer、Suman Iyer、 Roger Jackson、Jeff Jacobs、Ken Jacobs “Dr. DBA”、Tony Jambu、Don & Dianne Jaskulske、Amit Jasuja、Corey Jenkins、Bobbi Jo Johnson、Steve Johnson、Jeff Jonas、Shawn Jones、Michael Jordan、 Michael Josephson、Jeremy Judson、Mark Jungerman、Valerie Kane、Emily Kao、Ari Kaplan、Stephen Karniotis、Tom Karpus、Dr. Ken & Cathy Kavanaugh、Maralynn Kearney、John Kelly、Robert Kennedy、

致 谢 XXXI

Kate Kerner、Anil Khilani、Ann Kilhoffer-Reichert、John & Peggy King、Martin Luther King Jr.、Jan Klokkers、George Koch、Jodi Koehn-Pike、Fran Koerner、Sergey Koltakov、Larry Kozlicki、Mark & Sue Kramer、Paul C. Krause、Mark Krefta、Ron Krefta、Dave Kreines、Thomas Kurian、John Krasnick、 Mark Kwasni、Paul Lam、Donald Lamar、Marva Land、Ray Lane、Karen Langley、Jari Lappalainen、 Carl Larson、John Lartz、Brian Laskey、Deb LeBlanc、Margaret Lee、Sami Lehto、Herve Lejeune、 Steve Lemme、Coleman Leviter、Troy Ligon、Cheng Lim、Victoria Lira、Juan Loaiza、Quan Logan、 Jeff London、Xavier Lopez、Bob Love、Senator Dick Lugar、Dave Luhrsen、James Lui、Lucas Lukasiak、 Barb Lundhild、Liz Macin、Tony Mack、Ann Mai、Tom Manzo、Paul Massiglia、Lisa McClain、 Donna McConnell、Stephen McConnell、Kirk McGowan、Carol McGury、Dennis McKinnon、Amanda McLafferty、Mary Elizabeth McNeely、Gail McVey、Ehab & Andrea Mearim、Margaret Mei、Sara Mejia、Kuassi Mensah、Scott Messier、Kelly Middleton、Regina Midkiff、Debbie Migliore、Mary Miller、 Jeff Mills、Mary Miner、Justine Miner、Jal Mistri、Dr. Arnold Mitchem、John Molinaro、Congresswoman Gwen Moore、Matt Morris、Ken Morse、Solveig Morkeberg、Bill Moses、Jane Mott、Steve Muench、 Brad Musgrave、Francisco Munez、Minelva Munoz、Scott Myers、Ken Naim、Shyam Nath、Cassie Naval、Bill Nee、Paul Needham、Marie-Anne Neimat、Scott Nelson、Phil Newlan、Olli Niemi、Cindy Niemiec、Dr. Dave & Dawn Niemiec、Mike Niemiec、Regina Sue Elizabeth Niemiec、Robert & Cookie Niemiec、Dr. Ted & Paula Niemiec、Merrilee Nohr、Robin North、Rick Norris、Stan Novinsky、Perttu Nuija、Cheryl Nuno、Julie O’Brian、Shaun O’Brien、Jon O’Connell、Barb O’Malley、Anne O’Neill、 Mike Olin、Francisco Martinez Oviedo、Rita Palanov、Jeri Palmer、Bharat Patel、Jignesh Patel、Arlene Patton、Ray Payne、Steve Pemberton、Monica Penshorn、Dr. Mary Peterson、Michael Pettigrew、Elke Phelps、Chuck Phillips、Mary Platt、Lisa Price、Megan Price、John Quinones、John Ramos、Gautham Ravi、Sheila Reiter、Frank Ress、Denise Rhodes、Elizabeth Richards、Aisha Richardson、Dennis Richter、 Arnold Ridgel、Wendy Rinaldi、Anne Ristau、Tom Roach、George Roberts、Jerry D. Robinson Jr.、 Mike Rocha、Ulka Rodgers、Charlie Rose、Chuck Rozwat、Leslie Rubin、Steve Rubin、Mike Runda、 Joe Russell、Mike Russell、Katy Ryan、Theresa Rzepnicki、Stan Salett、David Saslav、Terry Savage、 Rami Savila、Nanak Sawlani、Ed Schalk、Ed Scheidt、Douglas Scherer、Scott Schmidt、Jeff Schumaker、 David Scott、Kevin Scruggs、Mike Serpe、Guner Seyhan、Allen Shaheen、Lewei Shang、Smiti Sharma、 Dr. Austin Shelley、Muhammad Shuja、Julie Silverstein、Judy Sim、Mike Simpson、Angela Sims、 Sinbad、David Sironi、Dinu Skariah、Linda Smith、Mark Smith、Mary Ellen Smith、Peter Smith、 Congressman Mike & Keta Sodrel、Peter Solomon、Marc Songini、Julie Sowers、Anthony Speed、Jeff Spicer、Rick Stark、Cassandra Staudacher、Bill Stauffer、Leslie Steere、Phil Stephenson、Thomas Stickler、 Bob Stoneman、Bob Strube Sr.、Bob Strube Jr.、Olaf Stullich、Burt & Dianna Summerfield、Cyndie Sutherland、Inna Suvorov、Matt Swann、Mary Swanson、Michael Swinarski、Matt Szulik、Vijay Tella、 David Teplow、Marlene Theriault、Margaret Tomkins、Susan Trebach、Eugene (EGBAR) & Adrienne (Sky’s the Limit) Trezzo、Sean Tucker、David Tuson、Vicky Tuttle、Razi Ud-Din、Paul Ungaretti、 Pete Unterlander、Lupe Valtierre、Petri Varttinen、Angelica Vialpando、Jussi Vira、Jarmo Viteli、 Matt Vranicar、Oleg Wasynczuk、Lori Wachtman、Bill Weaver、Jim Weber、Mike Weber、Huang Wei、 Dale Weideling、Erich Wessner、Steve Wilkenson、Dennie Williams、Donna Williams、Sherry Williams、 John Wilmott、Marcus Wilson、Jeremiah Wilton、Greg Witek、Wayne Wittenberger、Ron Wohl、 Marty Wolf、Randy Womack、Marcia Wood、Chris Wooldridge、Don Woznicki、David Wright、吕 学勇,Stan Yellott、Janet Yingling Young、Ron Yount、吉志刚,Tony Ziemba、Mary Ann Zirelli、

XXXII Oracle Database 11gR2 性能调整与优化

Edward Zhu、Chris Zorich 及 Andreas Zwimpfer.

感谢购买此书并致力于提高您自己的技能。托尼神父曾经告诉了我在生活中所需要知道的一 切:“没有什么事情大到了连上帝都处理不了,也没有什么事情小到了上帝根本就不去留意。” 上面列举过的人们都对我的人生和这部书产生过或多或少的影响,感谢他们持续不断的努力!

追忆: 最后,我会铭记近几年间我们失去的 Oracle 界朋友。Chris Madding“大哥”是优秀的经理、销售,而他是更为优秀的人 道主义者。他曾不知疲倦地创办和经营“小小信仰基金会”, 以帮助有特殊需要的儿童,我们的团队将永远怀念他!我们还 失去了 4 位高科技界的巨擘:史蒂夫·乔布斯一向是最有远见 的革新家,他创造了若干世上最神奇的器具。每当人们自以为 知道苹果行将推出什么样产品的时候,他们都会再次超过人们 的预期。Ken Olsen 在 1957 年创办了 DEC。DEC 有多么重要 呢?Oracle 最初就是为 DEC PDP-11 而编写的!微软首版的 Basic 则是在 DEC PDP-10 上编写的。颠峰时期的 DEC 是排在 IBM 之后的第二大科技公司。Dennis Richie(贝尔实验室的二人搭档之一,另一位是 Ken Thomson) 带给了我们 C 语言和 UNIX 操作系统。Jim Gray 是解释如何构建数据库的天才,他编著了《事务 处理:概念与技术》一书。我们同样会怀念 Bobby Patton。 终有一天,我们的工作完成了,上帝带我们回家去。我们很快就会“和天使们一起跑在金子 作成的街道上”,我期待着这一天的到来。但在它来到之前,我们要继续有所作为,靠我们互相 之间极好的行为,确保上帝通过我们来讲话!通过不断提升诚信、知识、血气之勇、忠诚、克制、 热情、无私、机智、道德之勇、尊重、谦卑和主动性,可以确保我们有毅力面对任何艰难的挑战。 当然,别忘了:信心,希望与爱……“其中最伟大的是爱”。以品格和一颗善待他人的心来影响 这个世界——这就是我的人生目标。

绪 言

“为他人而活,才活的值得。” —阿尔伯特·爱因斯坦 第 5 维度像 Exadata 的磁盘空间一样广阔,但对于那些不相 信它的人们来说,它就像是在计算机程序中遇到的无穷循环一样: 来得太早了些,让他们措手不及。这第 5 维曾经仅仅是幻想中的 维度而已,我们梦想着其中单个的数据库上就带有成百万 TB 的 数据和载体。在那样的奇境里,开发人员编写的任何查询都不会 因超时而受罚,也不会成为匿名 kill -9 命令的受害者;速度和磁 盘空间都不再(那么)重要。这一维度现已成真,我把它称作“EB 地带”吧! 无论我们是否喜欢,也不管我们是否做好了准备,勇敢的新 世界正朝着我们疾步走来。从 8 位计算和 256 字节内存访问中我 们就看到了这个世界最初的微光。接下来,16 位计算和 64KB 内 存、1MB 扩展内存 Windows 系统将这微光变成了更强的光焰。 32 位计算搭建起了 GB SGA 的殿堂,而正值我们昂首阔步迈向它之际,互联网的时代到来了,我 们随之看到川流不息的万盏车灯把条条高速路照得通明。目前的科技已经发展到 64 位计算,并且 要抛开 32 位互联网小天地留下的 4GB 最大寻址范围的包袱。在 64 位计算中,可寻址空间的理论 极限(2 的64 次幂)已变为 16EB(艾字节)或18,446,744,073,709,551,616 字节(264 字节)。而今,16EB(18 后面跟着 18 个零)正凝视着我们,等待我们将其惊人的能力利用到贯穿着我们生活的方方面面中 去。我们现在有的乃是 EB 级的数据库,而不再是 TB 级的了(1 个 EB 是 100 万 TB),11g 数据库 在规模上能够达到整整 8EB!登录到 PB 级的 SGA 上面去吧,别再用 GB 级的 SGA 了(1 个 PB 是 1000 TB);这一跃可绝不止上了一级台阶,计算能力再也不是每 18 个月才翻一番(摩尔定律)了。 我们并非只想从地球跃向月球,我们正在跃向天际,跃向遥远的恒星,跃向 TB 的 100 万倍呢!

XXXIV Oracle Database 11gR2 性能调整与优化

直接可寻址 间接/扩展可寻址 4 位 16 640 8 位 256 65,536 16 位 65,536 1,048,576 32 位 4,294,967,296 64 位 18,446,744,073,709,551,616

Oracle 以 10g 版和能够扩展到 8EB(8EB 或 800 万 TB)规模的数据库引领我们踏上 EB 之地, 不过那时并没有买家:哪怕是仅能容纳 1EB 的硬件,也还没有人能筹到足够的资金来买呢!有些 客户把早期的 PB 级硬件在视频方面派上了用场,一些华尔街交易所在短线利得的领域里使用了 TB 级硬件,但购买 EB 级硬件的代价实在是太高了,犹如飞得太靠近太阳,就终归难免于难一样1。 事实真相是:在过去的 20 年间,硬件公司未能跟上 Oracle 向前发展的脚步。 对 Sun 的收购使 Oracle 永远地改变了竞争格局,终于可以飞得靠太阳近些又不必担心被烤得 焦头烂额了。网格计算把 DBA 铸成了钢铁侠(Larry 可是在“钢铁侠 2”里现了身的呦,如果您还 未看过那部影片的话。小罗伯特·唐尼2甚至从他的工作站上访问 Oracle 网格,以确定坏蛋们所在 的位置),这再一次印证了好莱坞梦幻与现实生活之间,相隔得并不似我们想象得那么遥远。连最 后的决战都发生在 Oracle 圆顶大厦里,并以钢铁侠战胜坏蛋而告终(我们已经在计算机世界里看过 这部电影,Oracle 一次次地胜出)。Exadata 和其他 Oracle 硬件(从第 1 章里略窥一斑,从第 11 章 中了解详情)如今已与 Oracle 数据库设计、制造在一起,提供了让人们难以置信的容量和性能。您 的未来无可限量,世界的未来无可限量!天空再也不是极限了:借助于 Oracle 11g,您已经把它 远远地甩在了身后。 Oracle 是如何成就了这些的呢?他们会被其他公司赶上吗?假定您于 1977 年借助关系型数 据库和 Codd 的非专利理念办起了公司,那是 Codd 所贡献的最佳理念了,而软件专利在当时尚未 获得承认。1977 年时 Codd 仍在 IBM 供职,而他的理念却帮助有史以来第一个商业化的关系型数 据库在市场上打败了 IBM。您从天底下最好的大学里聘用最好的人才,并使他们以悬梁刺股的干 劲发愤工作;您付给他们双倍于其他公司里的年俸(若是销售,则要三倍的年俸了),但他们务必 要兢兢业业、成绩卓然。您的首个客户是非商业性的——美国中央情报局,于是安全成了您做事 的特点:产品经过的各个途径都有安全性方面的考虑,每个产品开发人员的头脑中都有安全性的 意识,Oracle 智囊团中的每一份子都为了安全性的问题而煞费苦心。您最早的商业客户是美国银 行和赖特帕特森空军基地,所以您从一开始就知道该如何为大企业提供服务了。您比 Sun 晚 8 天 上市,比微软早一天出山,而那两位总是跟在您的后面挑战强大的、连名字里都有“生意”二字 的 IBM3。那时的 IBM,一统着财富 1000 强,一统着整个 IT 业,一统着大楼把角高级办公室里 的那些 CEO、CFO、CTO、CIO 们(这些人都得让着 IBM 的高级销售三分)。但后来风向变了,新 公司以新的 IT 能力迎击挑战,出现了互联网时代的 4 骑士:Oracle、Cisco、EMC 和 Sun。4 骑士 如今变成了 3 个,不久后可能还要变为一个。Oracle 收购了 Sun,新的一轮观念转换开始了:摩 尔定律告诉人们说硬件的能力每 18 个月翻一番,但 Larry 的定律却说:“那不够快!”于是 Oracle 买下了 Sun,并在两年之后推出了 Sun 有史以来最快的硬件。作为新的 Sun“成员”,多线程 T4 芯片的速度是 T3 芯片的 5 倍,但那仅仅是硬件速度激增的开始(Oracle SuperCluster 机器有 4 台服

1 译者注:古希腊神话中的伊卡洛斯,借助蜡翼而升空;但因飞得过高,离太阳太近,蜡翼为太阳融化,坠海而死。 2 译者注:美国著名演员兼歌手,在“钢铁侠 2”中饰天才发明家东尼·史塔克。 3 IBM 是 International Business Machines Corporation 的缩写形式,其中的 Business 为“生意”之义。

绪 言 XXXV

务器,每台服务器由 4 片 T4 组成;每片 T4 有 8 核,每核有 8 个线程,总共有 1200 个线程)。新 的 SuperCluster 机器和 Exadata 产品线一起,无疑使我们快上至少几千倍!硬件能力每 18 个月才 翻一番的老黄历就不必再念下去了。有了 Exadata 扩展存储和压缩,可以将几百个这样的机柜串 联起来达到 8EB(当然得借助于压缩技术)。Oracle 和Sun 的结合还仅仅是个开始,有了新的 T4 Sparc 芯片,Exadata、Exalogic、Exalytics、StorageTek、PeopleSoft、Hyperion、TimesTen、MySQL、Java、 JD Edwards、Tangosol、BEA 及其他各路诸侯,好戏大概刚刚在开锣吧!

Oracle RDBMS 的发展史 1970 Edgar Codd 博士发表了关系数据模型的理论。 1977 Larry Ellison、Bob Miner、Ed Oates 和 Bruce Scott 以 2000 美元的启动资金组建了 Software Development Laboratories(SDL)。Larry 和 Bob 来自于 Ampex,他们当时正 负责一个代号为“Oracle”的美国中央情报局项目,Bob 和 Bruce 着手于数据库方面的工作。 1978 美国中央情报局是他们的首个客户,而该产品并未 在市场上发布。SDL 更名为 Relational Software Inc (RSI)。 1979 RSI 的首个商业版软件上市——以汇编语言写成 的版本 2 数据库(没有发布版本 1,因为担心人们不愿购买首 版的软件)。首个商业版的软件卖给了赖特帕特森空军基地, 那是市场上的首个商业 RDBMS。 1981 生产了首个工具 Interactive Application Facility (IAF),那是 Oracle SQL*Forms 工具的前身。 1982 RSI 更名为 Oracle Systems Corporation (OSC),接着又简化为 Oracle Corporation。 1983 发布了以 C 语言编写(这使得软件可移植)的第 3 个版本,Bob Miner 在支持基于汇编的 第 2 版软件的同时,写了一半的代码,而 Bruce Scott 则写了另外一半的代码,这是首个 32 位的 RDBMS。 1984 发布了版本 4,同时发布了最早的工具(IAG-genform、IAG-runform、RPT)。版本 4 是 首个具备读一致性的数据库。Oracle 被移植到了 PC 机上。 1985 发布了版本 5,有了最早的运行在 VMS/VAX 环境中的 Parallel Server 数据库。 1986 Oracle 于 3 月 12 日上市(Microsoft 上市的前一天,Sun 上市的后 8 天),股票以 15 美 元开盘,以 20.75 美元收市。这一年里还推出了 Oracle Client/Server,那是第一个客户端/服务器架 构的数据库。Oracle 5.1 版发布。 1987 Oracle 成为最大的 DBMS 公司。成立了 Oracle Applications 组,推出了首个 SMP(对称 多处理结构)数据库。 1987 Rich Niemiec、Brad Brown 和 Joe Trezzo 在 Oracle 工作期间,为 NEC 公司实施了首个 客户端/服务器架构下的生产环境应用程序,环境是运行 Oracle 软件的加强版 286 机器,上面有 16 个并发的客户端/服务器用户。 1988 发布 Oracle V6。首次有了行级锁,数据库热备份。Oracle 公司从 Belmont 搬到 Redwood Shores。推出了 PL/SQL。 1992 发布 Oracle V7。 1993 推出了 Oracle GUI 客户端/服务器开发工具,Oracle Applications 从字符模式转变为客 户端/服务器方式。

XXXVI Oracle Database 11gR2 性能调整与优化

1994 Bob Miner —— Oracle 数据库技术背后的天才,因患癌症去世。 1995 首次开发出了 64 位数据库。 1996 发布 Oracle 7.3。 1997 推出 Oracle 8 以及 Oracle 应用服务器,推出了 Web 应用程序。Oracle 是首个 Web 数 据库。为支持数据仓库而推出了 Discover 等 Oracle BI 工具。对工具提供 Java 本地化支持。 1998 主 RDBMS(Oracle 8)首次移植到 Linux 上,发布了 Application 11。Oracle 是首个支持 XML 的数据库。 1999 发布 Oracle 8i。将 Java/XML 集成到了开发工具中。Oracle 是首个有 Java 本地化支持 的数据库。 2000 推出了 Oracle 9i 应用服务器,这是首个带有中间层高速缓存的数据库。发布 E-Business Suite,基于 Oracle Mobile、Oracle 9i Application Sever Wireless 和 Internet File System (iFS)的无线数 据库。 2001 发布 Oracle 9i(9.1)。Oracle 是首个在真正应用集群(RAC)上运行的数据库。 2002 发布 Oracle 9i Release 2(9.2)。 2003 根据 Winter Group 的调查,在按规模而排在前 10 位的数据库中,法国电信局的 Oracle 数据库以 29TB 的规模而名列榜首。 2003 Oracle 10g 问世,专注于网格、加密备份、自动调整和 ASM。 2005 根据 Winter Group 的调查,Amazon 的 Oracle RAC 以 25TB 的规模跻身于按规模而排 名的 10 强数据库之列。 2005 Oracle 收购 PeopleSoft(包括 JD Edwards)、Oblix(身份管理解决方案)、Retek(零售软件, 花费 6.3 亿美元)、TimesTen(内存数据库)和 Innobase(InnoDB Open Source)公司。 2006 Oracle 收购 Siebel(花费 58 亿美元)、Sleepycat Software(开源软件)和 Stellant(内容管理) 公司。通过推动开源,Oracle 提供了对 Red Hat Linux“坚不可摧”的支持。 2006 Oracle 10g Release 2 问世于秋季(本书的前一版就是基于那一版本的数据库)。 2007 Oracle 花费 33 亿美元收购 Hyperion 公司。Oracle 11g 问世(2009 年发布了 11gR2)。 2008 Oracle 推出 Exadata 产品,收购 BEA。 2009 Oracle 发布 11gR2 版,收购 Sun(包括 Java、MySQL、Solaris、硬件、OpenOffice 和 StorageTek)。

2010 Oracle 推出 MySQL Cluster 7.1、Exadata X2-8 和 Exalogic、发布 11.2.0.2 版。 2011 Oracle 11gR2(11.2.0.4)发布(所有 Exadata 生产线全用 11gR2),Oracle 11g Express 版发 布(2011 年 9 月 24 日)。Oracle 推出 Exalytics、SuperCluster、Oracle Data Appliance、Exadata Expansion Rack 以及 Oracle Cloud 12c。 2014 预测发布 12cR2 版数据库。

绪 言 XXXVII

显然,Oracle 是在广度、能力和品格等诸方面都已经很成熟的公司,公司的领袖们已经无须 向腰包里塞入更多的钞票了(他们早就赚下了万贯家私)。他们有创新的能力,并总是聘请像 Larry Ellison 那样有远见的领袖,像 Bob Miner 那样不声不响的推动者,还有像 Bruce Scott 那样巨星级 的开发人员。从他们的每一位雇员身上总能找出诸如富于创意或富于改革精神等特殊的品质来, 他们聘用的都是独特的、聪明绝顶的、有强大推动力的和富有革新精神的人。从 Larry 的风格说 起吧,他有从人们身上挖掘潜力的能耐,而这样的潜力往往连人们自己都意识不到。待人们立下 了汗马之功,有功必赏也是 Larry 的能耐。Oracle 还拥有天才 Bob Miner,他的大丈夫气概和“蓝 领”般刻苦工作的精神激励着开发团队里所有追随他的人。Oracle 经营得出色,是因为有像 那样的领导人均衡着各方面的工作,有总是以“量你也赶不上我们”的超高 速驱动营销的 Judith Sim,也有 Andy Mendelsohn 和他极具才智的团队,他们发明路上的弯道4, 保证了产品的成功交付。Thomas Kurian 和他日益壮大、成绩超众的团队在不断寻求着应用集成和 使企业更加成功的新途径,再有就是 Mary Ann Davidson 默默无声的安全性勇士们。还有更多我 不认识的人和记不起来的人(别忘了 Jenny、Mary Ann、Tania 和她的团队,他们像强力胶一样地把 一切黏合在一起)。 万维网走红以前,Oracle 就把一切都存到了万维网上,并且在 Linux 流行之前很久即重写了 在万维网上和在 Linux 应用服务器上运行的全部应用程序。“如果万维网不是下一个最好的好东 西,那我们就完蛋了。但如果它真是下一个最好的好东西,我们可就是金牌明星了!”新闻界闻知 Larry Ellison 这段关于万维网的评论后,大喜过望并立即引用。金子随着互联网的热潮滚滚而来, 在硅谷掀起了一波新的加州淘金热,Oracle 得以出售各种各样的掘金工具。但 10 年后,很多企业 却濒临破产。1929 年的股灾之后,破了产、等着被收购的公司俯拾皆是;是通用电气公司出头买 下了全部破了产的梦想和现金短缺的企业,使自己在随后的 80 年中像鹤立鸡群的巨人,至今仍然 延续着强势。在当今的经济不景气、无增长和物价上涨的情势下,是 Oracle 出头买下了 Sun(74 亿美元,硬件、Solaris、SPARC、Java、OpenOffice 和 StorageTek)、Hyperion(33 亿美元:为 CFO 量身打造的 EPM 仪表盘软件和 数据库)、PeopleSoft(103 亿美元,财务及其他企业软件)、 Siebel(58.5 亿美元,CRM) 、JD Edwards( 制造业)、BEA(85 亿美元,中间件)、Sleepycat Software(BerkeleyDB,开源数据库)、Innobase(超快速数据库引擎)、TimesTen(内存数据库)、 Tangosol(一致性内存数据库和数据网格软件)、AmberPoint(SOA)、Stellant(4.4 亿美元,数字版权 管理和文档管理)、Pillar Data(智能硬件)、TripleHop(上下文 相关查找)、Fat Wire、Relsys( 药物安全和风险管理)、 Bharosa(网上身份偷窃和欺诈保护)、Demantra(需求驱动规 划)、Retek(零售解决方案)、Art Technology(10 亿美元,电 子商务软件)、IRI Software(OLAP)、Rdb(DEC 的分公司,数 据库)、Oblix(身份管理解决方案)、G-log(交通管理)、i-flex banking(5 亿美元)、Convergin(电信服务经纪人)、Loadstar(公 用事业应用软件)、SPL WorldGroup(物业计费和客户服务系 统),等等。还有很多(我所列的连一半都不到)。从本段文字 中您应该悟得出这样的道理来:赶紧教孩子们学 Oracle 吧, 因为在地球上存在的各行各业里,它都很吃香哩! Oracle 是要用那些收购的公司来一统传媒、知识和教育

4 译者注:赛车时,总是在弯道处把对手甩下。

XXXVIII Oracle Database 11gR2 性能调整与优化

吗?或许它会通过 Java 革新来进一步打动消费者,Java 正和 Oracle 数据库以同样的步调向前发展 着(全球共有 900 万 Java 开发人员,50 亿使用着的 Java 卡);大概只能通过像买进微软或苹果的更 大规模的收购,才能最终一统传媒、知识和教育。SAP、HP 乃至 IBM,它们会与为数已经越来 越少的大 IT 公司合并吗?Oracle 收购雅虎或许会导致与 Google 的竞赛,使二者都变得更为强大 (Google 或微软会不会首先收购雅虎呢?)。不管 Oracle 在下一轮收购谁、收购什么,它都注定要 加速格局的变化。我希望 Oracle 公有云和企业内部云能把我们大家的生活过渡到良好的稳定时期。 有了 Oracle 的 Exadata、Exalogic、Exalytics、SuperCluster 和所有其他的产品,局面一定会朝着能 够有效利用这些产品的人们的方向跃进。欲知眼下金子在何处?就在标着“X”的地方5。从 Exadata 入手,看看用 8EB 都可以搞出些什么名堂来吧! 在 Oracle 工作的日子里,我的心态发生了很多变化。上班的第一天,一进门我就明白了:少 于 10 倍的努力根本不行(随后我意识到需要百倍努力)。还没过几周我就得自编教材、给学生上培 训课了。刚上班时我连 Oracle 怎样拼写都不知道,但数不清的不眠之夜给我带来了成功,也让我 认识到自己居然有如此大的能量!大约 20 年前,在第一部著作的绪言里(本书是 20 年来最畅销调 优系列丛书的一部分),我写到了勇往直前,新动力,我还写了这动力将带动整个世界。而今的技 术发展正冲击着 20 年前我根本无法预想的高水平。

TUSC 最后,我想简要地介绍一下 TUSC(The Ultimate Software Consultants,终极软件资讯公司)。能和 TUSC 里强中之强、出类拔萃的同事们一起工作是我的幸运, 我们常被人们称作“海豹突击队”或“Oracle 领域里的 海军陆战队”(作为海军陆战队的前成员,我更喜欢后 者)。我们应召去世界各地的财富 500 强企业里解决各种 复杂的问题,而且始终不负众望。 随着全球化的趋势,增长比过去难了,未曾见过的境外低利率环境下的竞争比过去难了,连 仅求不遭淘汰都比过去难了。我们需要一个合作伙伴,或是合并到随全球化潮流而进的、有竞争 力的大企业中去。我们想找的是一家全球性的企业,即便在艰难的日子里,它也有推动我们在国 内外增长的能力;2008 年 1 月,我们幸运地被位于亚特兰大的 Rolta 国际公司收购了。Rolta 国际 为 Rolta 印度有限公司(它的母公司)监管美国、欧洲和大部分亚洲,Rolta 印度有限公司是位于孟 买的全球性国防工程和地理信息系统承包商。Rolta 使我们继续占有一席之地,给我们带来了遍布 于世界各地的客户、有竞争力的价格和全球化经济中的前程。在 Rolta,人们最在意的是自己做什 么事和周围有什么样的人。在 Rolta,业绩至上,工作第一。不久,我获升迁,负责 Rolta 的国际 企业 IT 解决方案(EITS)组。该组在全公司大约有 1000 人,而我的职责主要是在全球范围内传播 Oracle 的消息,并集中精力于利用 Rolta TUSC 的品牌。第二年,在收购了 WhittmanHart 咨询公 司和 Piocon 两家企业之后,我们得到了很多优秀的新员工。事实上,WhittmanHart 咨询公司于多 年间已经购下了若干“珍品”,并且在 Oracle Applications、Fusion 和数据库管理方面有好几位来 自于 Oracle 的专业人士。他们还收购了 Infinis—— 一家在 Hyperion EPM 方面很红火的公司 (Hyperion 年度合作伙伴),这使我们获得了在 Oracle 已经收购的一个领域中的经验。Piocon 是 Oracle 在 BI 领域里的打头人之一,他们获得过两次 Oracle 年度合作伙伴的奖励,而我们获得过 4 次(到 2011 年为止 Rolta 获得过 8 次了)。我们在不断地改变着,虽然很痛苦,但也使我们在 Oracle

5 译者注:X 是 Exadata 发音时的第一个音节。

绪 言 XXXIX

的疆域里变得强大而广博。只不过,多年来的国际旅行快要把我累垮了,我去过了澳大利亚、奥 地利、比利时、加拿大、中国、捷克共和国、丹麦、芬兰、印度、爱尔兰、德国、卢森堡、墨西 哥、波兰、斯洛伐克、西班牙、瑞典、阿联酋和英国;所以我最近改变职务做了 Rolta 国际董事 会的顾问,这一角色将使我有多得多的时间动手做技术和讲课,而且会减少我的国际旅行。 海军陆战队的同伴们:“Semper Fi”6所有的军人和妇女,保卫自由的政府工作人员和机构: 感谢你们使世界变得更加安全和美好。海军陆战队总是训教我:上帝、家庭、国家和军团,还有 做人的金科玉律,但绝不是那种“谁有钱就由谁来立规矩”的金科玉律,而是“爱人如己”的真 正的金科玉律。这两种不同的金科玉律,在某种程度上使华尔街最丑恶的价值观和老百姓最美好 的价值观形成了对比。虽然做起来很难,爱人如己却会使您在未来的人生路上获得丰厚的报偿; 可能经历艰难困苦,但它一定会引领您到超越生命的更美好的地方去,而这就是当面对充满挑战 的未来时,我能给您的最好建议了。

本书的组织架构和本版中的更新

如果通读全书并应用其内容,您将跻身于最顶尖 1% Oracle 调优专家的行列。有 400 多位调 优专家为本书增添过内容。对于阅读过本书前一版的读者来说,本书的各章节做了如下的改动和 增补: ● 第 1 章: 为主要的 11gR2 新功能而全部重写过 ● 第 2 章:为包括全部索引类型做了扩展,并为 11gR2 做了测试 ● 第 3 章: 为 11gR2 而更新了 ASM、LMT、Auto UNDO,改善了 I/O 部分 ● 第 4 章:为 11gR2 而添加了 MEMORY_TARGET,并更新了初始化参数 ● 第 5 章:添加了 11g 屏幕截图、Grid Control 以及 Exadata 的一些内容 ● 第 6 章:更新了 EXPLAIN PLAN、SQL 计划管理、DBMS_MONITOR 以及 TRCSESS ● 第 7 章:添加了新“提示(hint)”并更新了其他“提示”,这是最佳的“提示”资源 ● 第 8 章 :为 11gR2 作过更新,添加了结果集缓存(Result Cache)和 SQL 性能分析器(SQL Performance Analyzer) ● 第 9 章:为 11gR2 作过更新和测试,更新了块调优并添加了 DB Replay ● 第 10 章:因为 PL/SQL 调优的扩展而再次扩展,添加了 11gR2 的变化 ● 第 11 章: 添加了 Exadata,改进了 RAC,并且更新了 Parallel Query 操作的内容 ● 第 12 章:为展现更多的 V$视图查询而再次扩展,特别是针对 11gR2 中的新 V$视图 ● 第 13 章:扩展了 X$视图查询、trace 部分和 X$命名方法部分 ● 第 14 章:为 11gR2 而更新了 AWR 和 Statspack 的内容,添加了 mutex 和块调优的内容 ● 第 15 章:为 11gR2 和大系统而做了更新 ● 第 16 章:关于 UNIX 的这一章作了更新,以包含更多的命令 ● 附录 A:为 11gR2 查询和最重要的 25 个初始化参数而做了更新 ● 附录 B:为 11gR2 而更新了 V$视图查询 ● 附录 C:为 11gR2 而更新了 X$查询

6 译者注:拉丁语,意为“永远忠诚”,作为美国海军陆战队官兵的格言而为美国大众所熟知。

XL Oracle Database 11gR2 性能调整与优化

参考文献

Mark Harris, “Wish you were here,” Daywind, 2006. Donita Klement, History of Oracle, 1999. Rich Niemiec, “Retrospective: Still Growing After All These Years,” Oracle Magazine, 2001. Rich Niemiec, “Rich Niemiec Interviews Bruce Scott,” Select Magazine, 2001. Rich Niemiec, “64-Bit Computing,” Oracle Magazine, 2004. Lee Strobel, the Case for a Creator, Illustra Media, 2006. 维基百科网站:en.wikipedia.com(Googol, Exabyte)。 Mike Wilson, The Difference between God and Larry Ellison, William Morrow, November 1998. 网站:www.oracle.com、www.tusc.com 和 www.rolta.com。

目 录

...... 第 1 章 11g R1 & R2 新特性介绍(针对 1.7.6 增强的数据泵压缩 15 ...... DBA 和开发者) ...... 1 1.7.7 数据泵加密 Dump 文件集 16 数据泵的传统模式 ...... 1.1 轮到 Exadata 出场了!...... 3 1.7.8 16 增强了的统计信息...... 1.2 高级压缩...... 6 1.8 16 ...... 1.3 自动诊断信息库(Automatic 1.8.1 增强了的 I/O 统计信息 16 Diagnostic Repository,ADR) ...... 7 1.8.2 减少收集分区对象的统计 ...... 1.4 自动共享内存管理(Automatic 信息 16 ...... Shared Memory Management, 1.8.3 待定统计信息 17 ...... ASMM)的改进...... 8 1.8.4 多列统计信息 17 ...... 1.5 ASM 的改进...... 9 1.8.5 表达式统计信息 17 1.5.1 从 ASM 首选镜像读取 ...... 10 1.9 闪回数据归档(Flashback Data ...... 1.5.2 滚动升级/打补丁 ...... 10 Archive,FBDA) 18 1.5.3 更快的重新平衡...... 11 1.10 健康监控器(Health Monitor) ...... 18 1.5.4 ASM 磁盘组兼容性...... 11 1.11 事件打包服务(Incident Packaging 1.5.5 ASMCMD 命令扩展 ...... 12 Service,IPS)...... 21 1.6 自动 SQL 优化...... 12 1.12 不可视索引(invisible index) ...... 22 1.7 数据卫士的增强...... 13 1.13 分区新特性...... 22 1.7.1 快照备用(Snapshot Standby)...... 14 1.13.1 区间分区...... 23 1.7.2 活动数据卫士...... 14 1.13.2 REF 分区 ...... 23 1.7.3 混合平台支持...... 15 1.13.3 系统分区...... 25 1.7.4 高级压缩支持逻辑备用 1.13.4 虚拟列分区 ...... 26 ...... 数据库(11gR2) 15 1.13.5 分区顾问...... 26 1.7.5 透明数据加密支持逻辑备用 1.14 只读表...... 26 数据库 ...... 15

XLII Oracle Database 11gR2 性能调整与优化

1.15 RAC One Node 和 RAC Patching... 27 2.2 不可视索引...... 52 1.16 真正应用测试(Real Application 2.3 组合索引...... 55 Testing,RAT) ...... 28 2.4 索引抑制...... 56 1.17 SQL 性能分析器(SQL 2.4.1 使用不等于运算符(<>、!=)...... 56 Performance Analyzer,SPA)...... 29 2.4.2 使用 IS NULL 或 IS NOT 1.18 结果集缓存(Result Cache) ...... 29 NULL ...... 57 1.19 RMAN 的新特性 ...... 30 2.4.3 使用 LIKE...... 58 1.19.1 备份的优化...... 30 2.4.4 使用函数...... 59 1.19.2 长期备份处理的改进...... 30 2.4.5 比较不匹配的数据类型...... 59 1.19.3 并行备份巨大的数据文件.....30 2.5 选择性...... 60 1.19.4 更快的备份压缩 2.6 集群因子...... 60 (改进的压缩)...... 31 2.7 二元高度(Binary Height) ...... 61 1.19.5 活动数据库复制(Active 2.8 使用直方图...... 64 Database Duplication) ...... 31 2.9 快速全扫描...... 65 1.19.6 更好的恢复目录管理...... 32 2.10 跳跃式扫描...... 66 1.19.7 增强的归档日志删除策略.....32 2.11 索引的类型...... 67 1.19.8 数据恢复顾问(Data Recovery 2.11.1 B 树索引...... 67 Advisor)...... 32 2.11.2 位图索引...... 68 1.19.9 虚拟专用目录 ...... 35 2.11.3 哈希索引...... 70 1.19.10 主动的健康检查 ...... 36 2.11.4 索引组织表...... 71 1.19.11 块恢复(闪回日志)...... 37 2.11.5 反键索引...... 71 1.19.12 块恢复(物理备用)...... 37 2.11.6 基于函数的索引 ...... 72 1.20 安全文件...... 37 2.11.7 分区索引...... 73 1.20.1 压缩 ...... 38 2.11.8 位图连接索引 ...... 75 1.20.2 加密 ...... 38 2.12 快速重建索引 ...... 76 1.20.3 重复数据删除 ...... 38 2.13 在线重建索引 ...... 76 1.21 流(GoldenGate 是流的未来)的 2.14 要诀回顾...... 77 增强...... 40 2.15 参考文献...... 78 1.21.1 XStream In ...... 40 第 3 章 磁盘安装启用的方法和 ASM 1.21.2 XStream Out...... 40 (针对 DBA)...... 81 1.21.3 流支持高级压缩(11gR2)...... 40 3.1 磁盘阵列:必然之选...... 82 1.22 临时表空间的收缩 ...... 40 3.1.1 使用磁盘阵列改进性能和 1.23 透明数据加密(TDE)的改进 ...... 41 可用性...... 82 1.24 11g 新的后台进程 ...... 41 3.1.2 所需的磁盘数量 ...... 83 1.25 版本对照表...... 42 3.1.3 可用的 RAID 级别 ...... 83 1.26 新特性回顾...... 47 3.1.4 更新的 RAID 5...... 84 1.27 参考文献...... 48 3.2 传统文件系统的安装和维护 ...... 85 第 2 章 索引基本原理(针对 DBA 和 3.3 在硬件磁盘之间分布关键数据 初级开发人员) ...... 49 文件 ...... 85 2.1 索引基本概念...... 50 3.3.1 分开存储数据和索引文件...... 86

目 录 XLIII

3.3.2 避免 I/O 磁盘争用 ...... 87 3.8 导出分区...... 120 3.3.3 通过移动数据文件来均衡 3.9 消除碎片...... 120 文件 I/O...... 88 3.9.1 使用正确的区大小 ...... 121 3.4 本地管理的表空间 ...... 89 3.9.2 创建新的表空间并把数据移 3.4.1 创建本地管理的表空间...... 89 到其中...... 121 3.4.2 把字典管理的表空间迁移到 3.9.3 导出和重新导入表 ...... 123 本地管理的表空间 ...... 90 3.9.4 正确设定 PCTFREE 以避免 3.4.3 Oracle 大文件表空间...... 90 链化(Chaining)现象...... 123 3.4.4 Oracle 管理文件...... 91 3.9.5 重建数据库...... 125 3.5 ASM 简介 ...... 92 3.10 增加日志文件尺寸和 3.5.1 IT 部门内各个角色之间的 LOG_CHECKPOINT_ INTERVAL 沟通 ...... 93 以提高速度 ...... 125 3.5.2 ASM 实例 ...... 93 3.10.1 确定重做日志文件的 3.5.3 ASM 初始化参数...... 95 大小是否存在问题...... 126 3.5.4 ASM 的安装...... 95 3.10.2 确定日志文件的大小和 3.5.5 ASM 初始化参数和 SGA 调整....96 检查点的时间间隔...... 126 3.5.6 ASM 和权限...... 96 3.11 快速恢复区(Fast Recovery Area, 3.5.7 ASM 磁盘 ...... 97 FRA)...... 128 3.5.8 ASM 和多路径...... 99 3.12 增加恢复的可能性:在每次 3.5.9 ASM 磁盘组...... 99 批处理后提交 ...... 129 3.5.10 ASM 磁盘组和数据库 ...... 101 3.12.1 把大的事务隔离到它们 3.5.11 ASM 冗余和故障组...... 102 自己的回滚段上...... 129 3.5.12 新的空间相关列 ...... 103 3.12.2 使用 UNDO 表空间...... 130 3.5.13 集群同步服务...... 104 3.12.3 监控 UNDO 空间 ...... 131 3.5.14 数据库实例和 ASM ...... 105 3.12.4 结束有问题的会话...... 131 3.5.15 使用 ASM 进行数据库整合 3.13 在不同磁盘和控制器上存放 和集群化...... 105 多个控制文件 ...... 132 3.5.16 支持 ASM 的数据库进程...... 106 3.14 磁盘 I/O 的其他注意事项 3.5.17 大文件和 ASM...... 106 和提示...... 133 3.5.18 支持 ASM 的数据库初始化 3.15 设计阶段需要注意的问题 ...... 133 参数 ...... 107 3.16 要诀回顾...... 134 3.5.19 ASM 和数据库部署最佳 3.17 参考文献...... 135 实践 ...... 107 第 4 章 通过初始化参数调优数据库 3.5.20 ASM 存储管理和分配 ...... 108 (针对 DBA) ...... 137 3.5.21 ASM 重新平衡和重新分布.....108 4.1 升级到 Oracle 11gR2 之后 ...... 138 3.6 使用分区来避免磁盘争用...... 110 4.2 识别重要的初始化参数...... 141 3.6.1 获得关于分区的更多信息...... 112 4.3 在不重启数据库的情况下修改 3.6.2 其他类型的分区...... 112 初始化参数...... 143 3.6.3 Oracle 11gR2 的新分区选项....115 4.4 通过 Oracle 实用程序洞察 3.6.4 其他分区选项...... 117 初始化参数...... 149 3.7 使用索引分区...... 119

XLIV Oracle Database 11gR2 性能调整与优化

4.5 用企业管理器查看初始化参数 ...150 4.12 修改 SGA 大小以避免换页 4.6 优化 DB_CACHE_SIZE 来提高 (Paging)和交换(Swapping)...... 170 性能 ...... 151 4.13 了解 Oracle 优化器 ...... 170 4.6.1 使用 V$DB_CACHE_ADVICE 4.14 创建足够的调度程序 优化 DB_CACHE_SIZE...... 153 (Dispatcher)...... 171 4.6.2 保持数据缓存命中率 4.14.1 足够的打开的游标 超过 95%...... 153 (OPEN_CURSORS) ...... 172 4.6.3 监控 V$SQLAREA 视图以 4.14.2 不要让 DDL 语句失败 查找较慢的查询 ...... 153 (使用 DDL 锁超时机制) ....172 4.7 设定 DB_BLOCK_SIZE 来反映 4.15 两个重要的 Exadata 初始化参数 数据读的大小...... 156 (仅针对 Exadata) ...... 172 4.8 把 SGA_MAX_SIZE 设置为 4.16 25 个需要深思熟虑的重要 主内存大小的 25%到 50%...... 157 初始化参数 ...... 173 4.9 优化 SHARED_POOL_SIZE 以 4.16.1 历年的初始化参数...... 175 获取最佳性能...... 158 4.16.2 查找未公开的初始化参数....176 4.9.1 使用存储过程来优化共享 4.17 理解典型的服务器...... 176 SQL 区域的使用...... 158 4.17.1 典型服务器的建模...... 177 4.9.2 设定足够大的 SHARED_ 4.17.2 Oracle Application 数据库 POOL_SIZE 以保证充分 选型...... 178 利用 DB_CACHE_SIZE ...... 160 4.18 要诀回顾...... 179 4.9.3 保证数据字典缓存命中率 4.19 参考文献...... 180 至少为 95% ...... 160 第 5 章 企业管理器和网格控制器 4.9.4 保证库缓存的重载率为 0, (针对 DBA 和开发人员)...... 183 并使命中率在 95%以上...... 161 5.1 企业管理器(EM)基础 ...... 185 4.9.5 使用可用内存来判断 5.2 从 All Targets 和其他分组开始.... 187 SHARED_POOL_SIZE 是否 5.3 SQL 性能分析器(SPA)...... 188 设置正确...... 164 5.4 ADDM ...... 191 4.9.6 使用 X$KSMSP 表详细观察 5.4.1 “数据库实例服务器”选项卡 共享池 ...... 164 和“数据库管理”选项卡...... 196 4.9.7 关于缓存大小需要记住的 5.4.2 “数据库实例服务器”选项卡: 要点 ...... 165 表空间...... 197 4.9.8 与初始化参数相关的等待...... 166 5.4.3 “数据库实例服务器”选项卡: 4.10 在 Oracle 中使用多个缓冲池.....167 聚焦实例级别 ...... 198 4.10.1 与 DB_CACHE_SIZE 相关 5.4.4 “数据库实例服务器”选项卡: 并为数据分配内存的池 ...... 167 所有初始化参数 ...... 199 4.10.2 修改 LRU 算法 ...... 168 5.4.5 “数据库实例服务器”选项卡: 4.10.3 与 SHARED_POOL_SIZE 相 管理优化器统计 ...... 200 关并为语句分配内存的池 ....168 5.4.6 “数据库实例服务器”选项卡: 4.11 调整 PGA_AGGREGATE_TARGET 资源管理器(消费者组) ...... 202 以优化内存的使用...... 169 5.4.7 “数据库维护”选项卡...... 203

目 录 XLV

5.4.8 “数据库拓扑”选项卡...... 203 6.7 参考文献...... 269 5.4.9 “数据库性能”选项卡...... 204 第 7 章 基本的提示语法(针对开发人员 5.5 监控主机...... 211 和 DBA)...... 271 5.6 监控应用服务器...... 213 7.1 最常用的提示 ...... 272 5.7 监控 Web 应用程序...... 216 7.1.1 慎用提示...... 273 5.8 SQL 顾问(SQL Advisors) ...... 218 7.1.2 首先修正设计方案 ...... 273 5.9 Deployments 选项卡(补丁选项).....219 7.2 可用提示及归类 ...... 274 5.10 调度中心和 Jobs 选项卡...... 220 7.2.1 执行路径提示...... 274 5.11 Reports 选项卡 ...... 221 7.2.2 访问方法提示...... 275 5.12 ASM(自动存储管理)的性能 ...... 223 7.2.3 查询转换提示...... 275 5.13 真正应用测试(数据库回放)...... 225 7.2.4 连接操作提示...... 275 5.14 Exadata 的企业管理器 ...... 226 7.2.5 并行执行提示...... 276 5.15 小结 ...... 227 7.2.6 其他提示...... 276 5.16 要诀回顾...... 228 7.3 指定提示...... 276 5.17 参考文献...... 228 7.4 指定多个提示 ...... 278 第 6 章 使用 EXPLAIN PLAN 和 SQL 计划 7.5 使用别名时,提示别名而非 管理(针对开发人员和 DBA)...... 229 表名...... 278 6.1 Oracle 的 SQL 跟踪(SQL Trace) 7.6 提示 ...... 278 实用工具...... 230 7.6.1 Oracle 的演示样板: 6.1.1 对简单查询使用 SQL 跟踪的 HR 方案 ...... 279 简单步骤...... 230 7.6.2 FIRST_ROWS 提示 ...... 279 6.1.2 TRACE 输出部分 ...... 234 7.6.3 ALL_ROWS 提示...... 280 6.1.3 深入探讨 TKPROF 输出 ...... 236 7.6.4 FULL 提示...... 280 6.2 使用 DBMS_MONITOR...... 238 7.6.5 INDEX 提示 ...... 281 6.3 单独使用 EXPLAIN PLAN...... 242 7.6.6 NO_INDEX 提示...... 282 6.3.1 EXPLAIN PLAN——自顶而下 7.6.7 INDEX_JOIN 提示...... 283 还是从下往上读 ...... 245 7.6.8 INDEX_COMBINE 提示...... 284 6.3.2 EXPLAIN PLAN 的另一种 7.6.9 INDEX_ASC 提示...... 284 输出方法:构建树结构...... 250 7.6.10 INDEX_DESC 提示 ...... 285 6.3.3 使用执行树的另一个例子...... 251 7.6.11 INDEX_FFS 提示...... 285 6.3.4 在开发者产品中利用跟踪 7.6.12 ORDERED 提示 ...... 286 /EXPLAIN 发现有问题的 7.6.13 LEADING 提示 ...... 287 查询 ...... 254 7.6.14 NO_EXPAND 提示...... 287 6.3.5 PLAN_TABLE 表中的 7.6.15 DRIVING_SITE 提示 ...... 288 重要列 ...... 254 7.6.16 USE_MERGE 提示 ...... 289 6.3.6 未公开的跟踪初始化参数...... 255 7.6.17 USE_NL 提示 ...... 290 6.4 使用 STORED OUTLINES 7.6.18 USE_HASH 提示...... 291 (存储纲要) ...... 257 7.6.19 QB_NAME 提示...... 292 6.5 使用 SPM (11g 新特性)...... 259 7.6.20 PUSH_SUBQ 提示...... 292 6.6 要诀回顾...... 267 7.6.21 PARALLEL 提示...... 293

XLVI Oracle Database 11gR2 性能调整与优化

7.6.22 NO_PARALLEL 提示...... 294 8.3 何时应该使用索引...... 315 7.6.23 PARALLEL_INDEX 提示.....294 8.4 忘记了索引怎么办...... 316 7.6.24 PQ_DISTRIBUTE 提示 ...... 295 8.4.1 建立索引...... 316 7.6.25 APPEND 提示...... 296 8.4.2 不可视索引(invisible index).....317 7.6.26 NOAPPEND 提示...... 296 8.4.3 查看表上的索引 ...... 317 7.6.27 CACHE 提示...... 297 8.4.4 在列上正确建立索引了吗?.....318 7.6.28 NOCACHE 提示...... 297 8.5 建立了差的索引怎么办...... 318 7.6.29 RESULT_CACHE 提示...... 298 8.6 删除索引时保持谨慎...... 321 7.6.30 CURSOR_SHARING_EXACT 8.7 在 SELECT 和 WHERE 子句中 提示 ...... 298 的列上建立索引 ...... 321 7.7 杂项提示及注意事项 ...... 299 8.8 使用索引快速全扫描...... 323 7.7.1 未公开的提示...... 300 8.9 使查询“魔术”般加速...... 325 7.7.2 如何在视图中使用提示...... 301 8.10 在内存中缓存表 ...... 326 7.7.3 关于提示和 STORED 8.11 使用 11g 新引入的结果集缓存 OUTLINES(11g 中的 SPM)的 (Result Cache)...... 327 注意事项...... 301 8.12 在多个索引间选择(使用选择性 7.8 提示为什么不起作用 ...... 302 最佳的索引)...... 328 7.9 提示一览...... 302 8.13 索引合并...... 329 7.10 要诀回顾...... 303 8.14 可能被抑制的索引...... 331 7.11 参考文献 ...... 305 8.15 基于函数的索引 ...... 333 8.16 虚拟列(Virtual Column) ...... 334 第 8 章 查询优化(针对开发人员和 8.17 “古怪”的 OR...... 334 初级 DBA)...... 307 8.18 使用 EXISTS 函数和嵌套 8.1 应该优化哪些查询?查询 子查询...... 336 V$SQLAREA 和V$SQL 视图 ...... 308 8.19 表就是视图...... 337 8.1.1 从 V$SQLAREA 视图中选出 8.20 SQL 和“大一统”理论...... 337 最糟糕的查询...... 308 8.21 Oracle Database 11g 中的 8.1.2 从 V$SQL 视图中选出最糟糕 优化变化 ...... 337 的查询 ...... 310 8.22 Oracle 11g 自动 SQL 优化 ...... 338 8.2 使用 Oracle 11g 视图定位占用 8.22.1 保证执行优化操作的用户 大量资源的会话和查询...... 311 能访问 API...... 338 8.2.1 从 V$SESSMETRIC 视图中 8.22.2 创建优化任务...... 338 选出当前最占用资源的会话....311 8.22.3 确定从顾问日志中可以 8.2.2 查看可用的 AWR 快照...... 312 查看到任务...... 339 8.2.3 从 DBA_HIST_SQLSTAT 视图 8.22.4 执行 SQL 优化任务...... 339 中发现最糟糕的查询 ...... 312 8.22.5 查看优化任务的状态 ...... 339 8.2.4 从 DBA_HIST_SQLSTAT 视图 8.22.6 显示 SQL 优化顾问生成的 中选择查询文本 ...... 313 报告 ...... 340 8.2.5 从 DBA_HIST_SQL_PLAN 8.22.7 检查报告输出...... 340 视图中选出查询 8.23 使用 SQL 优化顾问自动优化 EXPLAIN PLAN...... 314 SQL 语句...... 342

目 录 XLVII

8.23.1 启用自动 SQL 优化顾问....342 9.12 第三方产品性能优化...... 395 8.23.2 配置自动 SQL 优化顾问....343 9.13 优化分布式查询 ...... 398 8.23.3 查看自动 SQL 优化的 9.14 一切就绪...... 400 结果...... 343 9.15 其他优化技术 ...... 401 8.24 使用 SPA...... 347 9.15.1 外部表...... 401 8.25 要诀回顾...... 352 9.15.2 数据快照太旧(Snapshot 8.26 参考文献...... 353 Too Old):开发人员的 编程问题 ...... 405 第 9 章 表连接和其他高级优化(针对 9.15.3 设置事件以转储每次等待....406 高级 DBA 和开发人员)...... 355 9.15.4 从 14 小时到 30 秒—— 9.1 RAT...... 357 EXISTS 操作符 ...... 407 9.2 SPA ...... 362 9.16 在块级别进行优化(高级内容).... 409 9.2.1 创建 SQL 优化集...... 363 9.16.1 数据块转储中的关键部分....412 9.2.2 创建分析任务...... 363 9.16.2 索引块转储简介...... 418 9.2.3 执行分析任务...... 364 9.17 使用简单的数学方法进行优化 ... 420 9.2.4 查询性能分析的顾问任务...... 365 9.17.1 传统的数学分析...... 421 9.2.5 取消正在执行的 SPA 分析 9.17.2 7 步方法论 ...... 421 任务 ...... 365 9.17.3 模式分析...... 426 9.2.6 删除 SPA 分析任务...... 365 9.17.4 数学方法总结 ...... 431 9.2.7 确定活动的 SQL 优化集 ...... 365 9.18 连接优化:关系模型与对象 9.2.8 删除 SQL 优化集引用...... 366 关系模型的性能对比...... 431 9.2.9 删除 SQL 优化集...... 366 9.18.1 使用的模型 ...... 433 9.3 连接方法...... 367 9.18.2 结果...... 433 9.3.1 嵌套循环连接...... 367 9.18.3 总结...... 441 9.3.2 排序合并连接...... 368 9.19 要诀回顾...... 443 9.3.3 集群连接...... 369 9.20 参考文献...... 444 9.3.4 哈希连接...... 369 9.3.5 索引合并连接...... 371 第 10 章 使用 PL/SQL 提升性能 9.4 表连接相关的初始化参数...... 373 (针对开发人员和 DBA) ...... 447 9.5 双表连接:等尺寸表(基于成本)...374 10.1 利用 PL/SQL 函数结果集缓存 9.6 双表索引连接:等尺寸表 提升性能(11g 新特性) ...... 449 (基于成本) ...... 377 10.2 直接在 PL/SQL 表达式中引用 9.7 强制使用特定的连接方法...... 381 序列(11g 新特性)...... 458 9.8 排除多表连接中的连接记录 10.3 在 SQL 函数调用中使用命名 (候选行) ...... 383 参数(11g 新特性)...... 461 9.9 大小不同的表间的双表连接...... 384 10.4 使用 CONTINUE 语句简化 9.10 三表连接:不那么有趣...... 387 循环(11g 新特性)...... 463 9.11 位图连接索引...... 389 10.5 利用编译时警告捕捉编程 9.11.1 位图索引...... 389 错误(11g 增强特性)...... 466 9.11.2 位图连接索引 ...... 390 10.6 使用表触发器(11g 增强特性).... 468 9.11.3 位图连接索引的最佳应用....392

XLVIII Oracle Database 11gR2 性能调整与优化

10.7 使用本地编译提升性能 10.26 理解 PL/SQL 对象定位的含义....511 (11g 增强特性) ...... 473 10.27 使用回滚段打开大型游标 ...... 512 10.8 使用优化的编译器使性能最优 10.28 使用数据库临时表提高性能 .... 514 (11g 增强特性) ...... 476 10.29 限制动态 SQL 的使用...... 515 10.9 使用 DBMS_APPLICATION_ 10.30 使用管道表函数建立复杂的 INFO 包进行实时监控...... 481 结果集...... 515 10.10 在数据库表中记录计时信息 ...483 10.31 别管调试命令 ...... 520 10.11 减少 PL/SQL 程序的单元迭代 10.32 “跟着感觉走”:为初学者准备 数量和迭代时间 ...... 485 的例子...... 525 10.12 使用 ROWID 进行迭代处理....488 10.32.1 PL/SQL 示例...... 526 10.13 将数据类型、IF 条件排序和 10.32.2 创建过程的例子...... 526 PLS_INTEGER 标准化...... 490 10.32.3 从 PL/SQL 中执行过程的 10.13.1 确保比较运算中的数据 例子...... 527 类型相同...... 490 10.32.4 创建函数的例子...... 527 10.13.2 根据条件出现的频率来 10.32.5 在 SQL 中执行 排序 IF 条件...... 492 get_cust_name 函数...... 527 10.13.3 使用 PL/SQL 数据类型 10.32.6 创建程序包 ...... 527 PLS_INTEGER 进行整数 10.32.7 在数据库触发器中 运算...... 492 使用 PL/SQL...... 528 10.14 减少对 SYSDATE 的调用...... 493 10.33 要诀回顾...... 528 10.15 减少 MOD 函数的使用 ...... 495 10.34 参考文献...... 530 10.16 通过固定 PL/SQL 对象提升 第 11 章 Exadata、RAC 调优和并行 共享池的使用...... 496 特性的使用 ...... 531 10.16.1 将 PL/SQL 对象语句固定 11.1 Exadata 术语和基础知识...... 533 (缓存)到内存中...... 497 11.2 Exadata 详细信息 ...... 534 10.16.2 固定所有的包 ...... 497 11.3 Exadata 存储扩展柜简介...... 536 10.17 识别需要固定的 PL/SQL 11.4 Exalogic 简介 ...... 536 对象 ...... 498 11.5 智能扫描(Smart Scan)...... 537 10.18 使用和修改 DBMS_SHARED_ 11.6 闪存(Flash Cache)...... 537 POOL.SIZES ...... 498 11.7 存储索引(Storage Indexes)...... 540 10.19 从 DBA_OBJECT_SIZE 中 11.8 混合列压缩(11.2 新特性) ...... 541 获取详细的对象信息...... 500 11.9 IORM...... 542 10.20 发现无效对象...... 500 11.10 在 Exadata 中使用所有的 10.21 发现已禁用的触发器...... 502 Oracle 安全优势...... 542 10.22 将 PL/SQL 关联数组用于快速 11.11 最佳实践...... 542 参考表查询 ...... 503 11.12 小结: Exadata=根本性改变!..... 543 10.23 查找和优化所使用对象的 11.13 Oracle Database Appliance ...... 544 SQL ...... 506 11.14 SPARC SuperCluster...... 544 10.24 在处理 DATE 数据类型时 11.15 Oracle Exalytics 商业智能 使用时间组件 ...... 508 一体机...... 545 10.25 使用 PL/SQL 优化 PL/SQL...... 511

目 录 XLIX

11.16 其他可以考虑的 Oracle 硬件 ....546 11.33.1 并行操作的目标 ...... 595 11.16.1 Oracle 大数据设备...... 546 11.33.2 RAC 并行使用模型...... 595 11.16.2 ZFS 存储服务器 ...... 546 11.33.3 init.ora 参数...... 596 11.16.3 Pillar 存储系统...... 546 11.33.4 查看并行统计数据的 11.16.4 StorageTek 模块化磁带库 V$视图...... 596 系统...... 546 11.33.5 并行配置和相关基线 11.17 Oracle 公共云和 Oracle 社交 测试...... 596 网络 ...... 547 11.33.6 并行查询测试示例 ...... 597 11.18 并行数据库...... 547 11.33.7 Create Table As ...... 599 11.19 RAC ...... 548 11.33.8 建立索引...... 599 11.20 RAC 性能优化概述...... 552 11.33.9 性能注意事项和小结 ...... 600 11.20.1 RAC 集群互连的性能...... 553 11.34 其他的并行操作注意事项...... 600 11.20.2 寻找 RAC 等待事件—— 11.35 Oracle 的联机文档 ...... 600 会话等待...... 553 11.36 要诀回顾...... 601 11.20.3 RAC 等待事件和互联 11.37 参考文献...... 602 统计信息...... 554 第 12 章 V$视图(针对开发人员和 DBA)....605 11.20.4 集群互连优化—— 12.1 创建和授权访问 V$视图...... 606 硬件层 ...... 560 12.2 获取构建 V$视图的 X$脚本 11.20.5 使用企业管理器网格 列表...... 610 控制器优化 RAC ...... 565 12.3 使用有帮助的 V$脚本...... 614 11.21 并行操作的基本概念 ...... 570 12.3.1 基本的数据库信息 ...... 614 11.22 并行 DML 语句和操作...... 572 12.3.2 AWR(自动负载资料库)的 11.23 管理并行服务器资源和 基本信息...... 615 并行语句排队...... 573 12.3.3 基本的版权信息...... 616 11.24 并行度和分区...... 573 12.3.4 数据库中已安装的选项...... 617 11.25 操作内并行和操作间并行...... 574 12.4 内存分配概要(V$SGA)...... 619 11.26 使用并行操作创建表和 12.4.1 AMM(自动内存管理)与 索引的示例...... 576 MEMORY_TARGET 参数...619 11.27 并行 DML 语句和示例...... 578 12.4.2 详尽的内存分配 11.27.1 并行 DML 的约束条件.....578 (V$SGASTAT)...... 621 11.27.2 并行 DML 语句示例 ...... 579 12.5 在 V$PARAMETER 视图里找出 11.28 通过 V$视图监控并行操作...... 580 spfile.ora/init.ora 参数设置 ...... 622 11.28.1 V$PQ_TQSTAT 视图 ...... 580 12.6 判定数据的命中率(V$SYSSTAT 和 11.28.2 V$PQ_SYSSTAT 视图 ...... 581 V$SYSMETRIC)...... 623 11.28.3 V$PQ_SESSTAT 视图...... 584 12.7 判定数据字典的命中率 11.29 在并行操作中使用 EXPLAIN (V$ROWCACHE)...... 625 PLAN 和AUTOTRACE...... 585 12.8 判定共享 SQL 和 PL/SQL 的 11.30 优化并行执行和初始化参数....589 命中率(V$LIBRARYCACHE).... 625 11.31 并行加载...... 592 12.9 确定需要保留在内存中(固定住) 11.32 性能比较和监控并行操作...... 593 的 PL/SQL 对象...... 629 11.33 优化 RAC 中的并行操作...... 595

L Oracle Database 11gR2 性能调整与优化

12.10 监控 V$SESSION_LONGOPS 13.7.6 过高的硬解析 ...... 679 视图以定位有问题的查询...... 630 13.7.7 互斥锁/闩锁等待和休眠 .....680 12.11 通过 V$SQLAREA 发现有 13.7.8 其他调整选项 ...... 681 问题的查询...... 632 13.8 获得重做日志的信息...... 682 12.12 检查用户的当前操作及其 13.9 设置初始化参数 ...... 683 使用的资源...... 633 13.10 缓冲区缓存/数据块的 12.12.1 查找用户正在访问的 详细信息...... 686 对象 ...... 634 13.10.1 缓存状态 ...... 687 12.12.2 获取详细的用户信息 ...... 634 13.10.2 占用数据块缓存的段 ...... 688 12.13 使用索引...... 635 13.10.3 热数据块/闩锁争用和 12.14 确定锁定问题...... 637 等待事件...... 690 12.14.1 杀掉有问题的会话...... 639 13.11 获得实例/数据库相关的信息 ... 694 12.14.2 找出使用多个会话的 13.12 高效使用 X$表及相关策略 ..... 695 用户 ...... 640 13.13 Oracle 内部的相关主题...... 696 12.15 找出磁盘 I/O 问题...... 641 13.13.1 跟踪 ...... 696 12.16 发现回滚段的争用 ...... 644 13.13.2 DBMS_TRACE 包...... 700 12.17 确定是否有足够多的 13.13.3 事件 ...... 701 空闲列表...... 645 13.13.4 转储(dump) ...... 702 12.18 检查权限和角色 ...... 647 13.13.5 oradebug 命令...... 702 12.19 等待事件 V$视图 ...... 649 13.13.6 TRCSESS 工具...... 705 12.20 一些主要的 V$视图类别...... 652 13.14 阅读跟踪文件 ...... 705 12.21 要诀回顾...... 660 13.14.1 等待信息和响应时间 ...... 708 12.22 参考文献...... 661 13.14.2 递归调用 ...... 709 13.14.3 模块信息 ...... 709 第 13 章 X$表(针对高级 DBA) ...... 663 13.14.4 提交 ...... 710 13.1 X$表介绍...... 664 13.14.5 UNMAP ...... 710 13.1.1 有关 X$表的误解 ...... 665 13.14.6 绑定变量 ...... 710 13.1.2 授权查看 X$表 ...... 666 13.14.7 错误 ...... 711 13.2 创建 V$视图和 X$表...... 667 13.15 X$表分组...... 711 13.3 获得所有 X$表的列表...... 669 13.16 X$表与非 V$固定视图的联系 ... 725 13.4 获得所有 X$索引的列表...... 670 13.17 常见的 X$表连接...... 726 13.5 对 X$表和索引使用的提示...... 671 13.18 X$表的命名 ...... 728 13.6 监控共享池的空间分配...... 672 13.19 要诀回顾...... 736 13.7 创建查询脚本来监控共享池...... 673 13.20 参考文献...... 736 13.7.1 ORA-04031 错误 ...... 673 13.7.2 空间分配过大而引起的 第 14 章 使用 Statspack 和 AWR 报告 争用...... 674 调优 Wait、闩锁(Latch)和互斥锁 13.7.3 共享池碎片化 ...... 675 (Mutex) ...... 739 13.7.4 共享池和 Java 池中空闲 14.1 11gR2(11.2)中 Statspack 和 内存过低...... 676 AWR 报告的新特性 ...... 740 13.7.5 库缓存命中率 ...... 677 14.2 安装 Statspack ...... 741

目 录 LI

14.2.1 perfstat 账户的安全管理...... 742 14.7 11gR2 脚本...... 810 14.2.2 安装之后...... 742 14.8 要诀回顾...... 811 14.2.3 收集统计数据 ...... 743 14.9 参考文献...... 812 14.2.4 运行统计数据报告...... 746 第 15 章 施行快速系统审查(针对 DBA) ...815 14.3 AWR 和 AWR 报告...... 747 15.1 总体绩效指数(TPI) ...... 816 14.3.1 手动管理 AWR ...... 747 15.2 训练绩效指数(EPI) ...... 816 14.3.2 AWR 自动快照...... 749 15.3 系统绩效指数(SPI)...... 819 14.3.3 AWR 快照报告...... 749 15.4 内存绩效指数(MPI) ...... 821 14.3.4 在 Oracle 企业管理器网格 15.4.1 排名前 25 的“内存滥用” 控制器中运行 AWR 报告 ...751 语句是否优化...... 822 14.4 Statspack 和 AWR 输出解析 ...... 754 15.4.2 10 大“内存滥用”语句在 14.4.1 报告头信息(Header)...... 754 所有语句中所占的比重 ...... 823 14.4.2 负载概要...... 755 15.4.3 缓冲区缓存命中率...... 824 14.4.3 实例效率...... 756 15.4.4 数据字典缓存命中率...... 826 14.4.4 Top 等待事件 ...... 759 库缓存命中率 ...... 14.4.5 Oracle Bugs...... 769 15.4.5 827 内存中排序命中率 ..... 14.4.6 Oracle 影子进程的 15.4.6 PGA 827 .. 生命周期...... 771 15.4.7 空闲的数据缓冲区的比例 828 ...... 14.4.7 RAC 等待事件和互连 15.4.8 有效地使用结果集缓存 830 ...... 统计数据...... 772 15.4.9 固定/缓存对象 830 ...... 14.4.8 TOP SQL 语句 ...... 773 15.5 磁盘绩效指数(DPI) 831 14.4.9 实例活动统计数据...... 775 15.5.1 优化滥用磁盘读操作的 ...... 14.4.10 表空间和文件 I/O 的 前 25 条语句 832 统计数据 ...... 779 15.5.2 最滥用磁盘读操作的 14.4.11 段统计数据...... 782 前 10 条语句占所有语句 ...... 14.4.12 其他的内存统计数据...... 783 磁盘读的比例 833 ...... 14.4.13 UNDO 统计数据 ...... 788 15.5.3 分离表和索引 834 14.4.14 闩锁和互斥锁统计信息.....789 15.5.4 关键任务表管理...... 834 14.4.15 在块级别调优和查看 15.5.5 分离关键的 Oracle 文件...... 835 (高级)...... 797 15.5.6 自动 UNDO 管理 ...... 836 14.4.16 数据字典和库缓存的 15.5.7 临时段的平衡 ...... 839 统计数据 ...... 800 15.6 总体绩效指数(Total Performance 14.4.17 SGA 内存统计数据...... 802 Index,TPI)...... 840 14.4.18 非默认的初始化参数...... 803 15.7 系统综合检查的示例...... 841 14.5 AWR 报告和 Statspack 输出 15.7.1 评级系统...... 841 结果中需要首先查看的 10 项 15.7.2 系统审查评级类别的示例 ....841 内容...... 804 15.7.3 需要立即采取行动的 14.5.1 管理 Statspack 数据...... 805 问题项...... 843 14.5.2 升级 Statspack ...... 806 15.7.4 其他需要采取行动的 14.5.3 删除 Statspack ...... 806 问题项...... 843 14.6 新 ADDM 报告的快速说明 ...... 806 15.8 系统信息列表 ...... 843

LII Oracle Database 11gR2 性能调整与优化

15.8.1 与内存有关的数值...... 844 16.6 使用 mpstat 命令辨认 CPU 15.8.2 与磁盘有关的数值...... 844 瓶颈...... 862 15.8.3 与 CPU 有关的数值...... 844 16.7 结合使用 ps 命令和选定的 15.8.4 与备份和恢复有关的信息.....845 V$视图...... 863 15.8.5 命名约定和/或标准以及 16.8 使用 iostat 命令辨认磁盘 I/O 安全信息问题 ...... 845 瓶颈...... 866 15.8.6 DBA 知识评级...... 846 16.8.1 为磁盘驱动器 sd15、sd16、 15.9 TPI 和系统检查需要考虑的 sd17 和 sd18 使用 iostat 的 其他项...... 846 -d 选项 ...... 867 15.10 要诀回顾...... 847 16.8.2 使用 iostat 的 -D 选项...... 867 15.11 参考文献...... 847 16.8.3 使用 iostat 的 -x 选项...... 867 16.8.4 iostat 的 -x 选项与 shell 第 16 章 运用 UNIX 实用工具来 脚本中的逻辑相结合...... 868 监控系统(针对 DBA) ...... 849 16.9 使用 ipcs 命令测定共享内存..... 869 16.1 UNIX/Linux 实用工具 ...... 850 16.10 使用 vmstat 命令监控系统 16.2 使用 sar 命令监控 CPU 的 负载...... 870 使用情况 ...... 850 16.11 监控磁盘空闲空间...... 871 16.2.1 sar -u(检查 CPU 的 16.12 监控网络性能 ...... 872 繁忙程度)...... 850 16.12.1 使用 spray 命令进行 16.2.2 sar -d 命令(找出 I/O 问题)....852 监控 ...... 16.2.3 sar -b 命令(检查缓冲区 875 使用 监控 高速缓存)...... 855 16.12.2 nfsstat -c ...... 16.2.4 sar -q 命令(检查运行队列 网络性能 876 和交换队列的长度) ...... 855 16.12.3 使用 netstat 监控网络 16.3 使用 sar 命令和 vmstat 命令 性能 ...... 877 监控调页/交换 ...... 856 16.12.4 显示可调参数的当前值....878 16.3.1 使用 sar 命令的 -p 选项 16.12.5 修改配置信息文件 ...... 880 报告调页活动 ...... 856 16.12.6 影响性能的其他因素 ...... 880 16.3.2 使用 sar 命令的 -w 选项 16.13 改善性能的其他途径...... 881 报告交换和切换活动...... 857 16.14 要诀回顾...... 882 16.3.3 使用 sar 命令的 -r 选项 16.15 参考文献...... 882 报告空闲内存和空闲 附录 A 重要的初始化参数(针对 DBA) ....883 交换空间...... 857 .... 16.3.4 使用 sar 命令的 -g 选项 附录 B V$视图(针对 DBA 和开发人员) 925 报告调页活动 ...... 858 附录 C X$表(针对 DBA)...... 979 16.3.5 使用 sar -wpgr 命令报告 内存资源的使用情况...... 858 16.4 使用 top 命令找出系统上最差 的用户...... 860 16.5 使用 uptime 命令监控 CPU 负载...... 862

第1章

11g R1 & R2 新特性介绍 (针对 DBA 和开发者)

首先我要说明:本书的主要目的是帮助初级和中级水平的 Oracle 专业人士了解 Oracle 系统及 更好地优化它。后面的章节里也介绍了不少专家主题,但首要的任务却是协助那些被性能问题折 磨得很沮丧的专业人士,他们正寻求着改善数据库性能的简单诀窍。本书的目标很单纯:提供一 个装满此类诀窍的弹药库,在各种不同的情况下您都可以运用它来使系统快起来。 自本书的 9i 版始,第 1 章成了讲述新特性的一章(介绍很多调优时最常用的新特性),并获得 了很多读者的喜爱。介绍新特性这一章既然如此受欢迎,我就继续把 Oracle 11g 的新特性介绍作 为本书的第 1 章来写吧(从 Exadata 的范式转换开始)。其余的章节中,难度循序渐进并提供了大量 调优的诀窍,以对您的调优之旅有所帮助。我确信,您可以在本书中找到一些在任何其他地方都 找不到的信息。

2 Oracle Database 11gR2 性能调整与优化

如果您希望仅读一章就能得到优化数据库的方法或者一揽子方案,那么我提供具有如此特点 的两章给那些没有时间通读本书的读者。头一个是介绍 Statspack 和 AWR 的第 14 章(Statspack 是 免费的,但 AWR 的功能更强):这是两个好得令人难以置信的工具,包含了大多数专家所最常用 的脚本,专家们在使用 V$视图和 X$表优化系统时调用这些脚本(第 12 和 13 章中介绍了 V$视图 和 X$表)。第 14 章花了我很长时间才写成,时间主要花在了更新闩(Latch)等内容和互斥(Mutex) 的新内容上。另一个包罗万象的优化章节乃是介绍企业管理器(Enterprise Manager,包括数据库控 制器和网格控制器)的第 5 章。企业管理器提供了图形化的方法来优化您的系统,包括许多用于 RAC 系统和大规模网格控制的特性。企业管理器为您提供了极佳的、以单一界面来查看和优化多 个系统的能力。 简言之,第 1 章要讲的是 Oracle 11gR1 和 R2 中一些令人感兴趣的新特性。许多新的和改善 了的特性都包含在这个版本中。Oracle 11g 的目标不仅仅是创造一个更健壮的数据库管理系统, 同时还要简化安装和管理的工作,以提高可用性。这种趋势从 Oracle 9i 就已经开始,在 10g 里得 到延续,在 11g 中进一步延续下去。Oracle 的战略方向就是提供一个完全集成的功能集合,来取 代数据库管理员们用以管理他们环境的第三方软件。本书并不会对本章中列出的所有新特性作详 细介绍(因为有些特性与优化并无直接的关系,而且本书的篇幅也有限制)。尽管如此,为了使读 者对 11gR2 有个整体印象,我想还是需要这么一章来介绍一些好的特性,而不管它们是否与优化 有关。 本章中所涉及的新功能包括: ● 轮到 Exadata 出场了! ● 高级压缩 ● 自动诊断信息库(Automatic Diagnostic Repository,ADR) ● 自动共享内存管理(Automatic Shared Memory Management,ASMM)的改进 ● ASM(Automatic Storage Management,自动存储管理)的改进 ● 自动 SQL 优化 ● 数据卫士(Data Guard)的增强 ● 数据泵的增强(压缩、加密、传统模式) ● 增强了的统计信息 ● 闪回数据存档 ● 健康情况监控 ● 事件打包服务(Incident Packaging Service,IPS) ● 不可视索引(invisible index) ● 分区新特性(区间分区、REF 分区、系统分区、虚拟列分区、分区顾问) ● 只读表 ● RAC One Node 和 RAC Patching ● 真正应用测试(Real Application Testing) ● SQL 性能分析器(SQL Performance Analyzer,SPA) ● 结果集缓存(Result Cache) ● RMAN 的新特性

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 3

● 安全文件(SecureFiles) ● 流(XStream In、XStream Out、高级压缩支持)的增强 ● 临时表空间的收缩 ● 透明数据加密(Transparent Data Encryption,TDE)的改进 ● 11g 新的后台进程 ● 11g 版本特性对照表

注意 因为这些特性是新的,所以您应该谨慎使用、彻底测试,直到确信它们不会造成数据库的问 题。倘若有权限访问 MOS1,则我强烈地建议您去确定此准备使用的特性是否有任何已知的问题。 Google.com(尽管给出的信息比较笼统)是另一个查找 Oracle 特性和功能当前信息的好地方。

1.1 轮到 Exadata 出场了!

伴随着 Sun 的被收购,一场范式转换的革命发生在数据库市场、硬件界和整个 IT 行业。虽 然这场范式转变才刚刚开始,然而早期的波动预示着重大转变已经到来,未来的十年中还会有更 大的转变。这里列出 Exadata 的一些要点,若想了解更多的细节,则可参阅 Exadata 那一章(第 11 章)。Exadata 是结合了数据库威力的硬件,它利用了 Oracle 加在硬件层面的特性,而其他硬件供 应商无法轻易地、或者根本不可能复制这些特性。第 11 章中的一些主题将详细讨论 Exadata 的 主要优点: ● 闪存(Flash Cache) 闪存是由比普通磁盘快约 20-50 倍(取决于不同的磁盘)的固态硬盘组成(信息存储于芯片上, 满配的机架上可达 5TB 的容量)。闪存缓存热数据(经常需要访问的数据),这是数据访问的最后一 步(它首先返回数据给用户,然后根据用户的设置为下一次的访问缓存这些数据)。

注意 闪存(硬件/芯片)不同于数据库闪存。您可以在 Oracle Database 11g 和 Oracle RAC 11g 中使用 数据库闪存。如果数据库运行在 Solaris 或者 操作系统上,那么您可以在线添加可选 的数据库闪存。这是一个基于文件扩展的常驻 SGA 缓冲区的高速缓存(类似于交换区),为数据块 提供二级缓存。当数据库被换出 SGA 时该文件被使用。如果希望了解更多信息,请参阅初始化 参数 DB_FLASH_CACHE_SIZE。

● 存储索引(Storage Index) 存储索引利用最小值/最大值使查询运行得更快。使用存储索引通常可以达到 10 倍的性能提 升。它们主要维护数据(比如 metadata)的摘要信息。内存结构驻留在存储单元(cell)层面上。对于 一个存储单元而言,存储索引最多可以储存 8 个查询表列的最小值/最大值。因此,存储索引指示 数据是如何存储在存储单元上的(就像分区的最小值/最大值)。查询一个表时,数据库会检查存储 索引以确定为获得所需要的数据都要访问哪些存储单元。Oracle 根据不同列上的最小值/最大值搜 索数据,在不匹配的情况下就消除在存储单元上的 I/O,该过程对用户 100%透明。它是在硬件层 面上进行的,通常来说每 1MB 的磁盘就有一个索引条目。Oracle 在内部自动完成这项工作而无需

1 译者注:MOS 即 My Oracle Support,以前叫 Metalink。

4 Oracle Database 11gR2 性能调整与优化

任何设置。存储索引还可以为分布极为不均的数据提供巨大的好处。存储索引提供了对高选择性 值的快速访问,而对选择性不高的值则通过常规的 Exadata 卸载来处理。 ● 智能扫描(Smart Scan) 智能扫描是 Oracle 在内部硬件层面执行的。通常来说,可以节省 10 倍的开销。Oracle 基于 WHERE 子句(谓词)进行过滤,过滤条件包括行、列或连接(Join)。智能扫描无需设置,Oracle 在 内部自动完成这项工作。 ● 混合列压缩(Hybrid Columnar Compression,HCC) 混合列压缩,也被称为 Exadata 混合列压缩(EHCC),是指数据由列行混合的格式组成,然后 进行压缩,性能可以提高 10 到 30 倍。表是由压缩单位(Compression Unit,CU)组织起来的,其中 包含约 1000 行数据(行的多少取决于这些行的数据量)。压缩单元跨越多个数据块。混合列压缩对 于批量加载数据来说非常有好处,但它不是为 OLTP 或单块读操作而构建的。它主要用于数据仓 库和被查询的数据,而不是频繁更新的数据。相比于 Gzip/Bzip2,混合列压缩通常是其两倍的压 缩比和 10 倍的访问效率。 ● 企业管理器网格控制器 Oracle 企业管理器网格控制器有个专门的 Exadata 插件,通过这个插件,您可以很容易地管 理和查看 Oracle 提供给 Exadata 的许多特性。它还可以确保一切都正常和高效地工作(这部分在第 5 章以及第 11 章有介绍) ● 在企业管理器中模拟 Exadata 可以在实施 Exadata 之前,让您在当前运行的系统上模拟 Exadata 并检查它可以带来的好处。 这个特性是 SQL 性能分析器的一部分,SQL 性能分析器是 Oracle 真正应用测试(Real Application Test,RAT)的一个组件。这个选件需要额外购买。 ● I/O 资源管理器 Oracle 最新的 I/O 资源管理(IORM)工具可以让 Exadata 管理多个工作负载,并为每个真正必 需的数据库、用户或任务设置资源。IORM 给您通过一台机器轻松管理许多系统的能力。 ● 安全性 带修改跟踪文件的安全加密备份要快得多了,存储节点还对其提供了解密的硬件加速: Exadata 利用 CPU 在硬件层面加速 AES-NI 的解密过程,所以即便在使用 TDE 表空间或列的加密 时,您也可以加密和解密(加密的数据在使用智能扫描前解密)。 ● 工具 Cellcli 是一个查询硬件层面的命令行接口,可用于监控单个存储单元上各种各样的健康指标; DCLI 用于查询多个存储单元上的信息,ADR 命令行解释工具(ADRCI Command Interpreter)用于诊断。 许多最佳实践将有助于您充分利用 Exadata。我先从一个必须做的和不能做的清单开始,然后 列出一些最佳实践!请注意,这些可能随时更改(检查 Oracle 的官方文档以获取最新的信息)。 ● 必须安装 Bundle Patch 5(参考 MOS 文献:888828.1 以获取最新的补丁)。 ● 必须使用 ASM(自动存储管理);ASM 为 Exadata 提供文件系统和卷管理器。 ● 数据中心必须配备符合要求的制冷系统!这是非常重要的(我建议做一些这方面的研究)。 ● 必须在支起的地板之上铺三层打了洞(冷却的原因)的瓷砖来承载整个机架(必须能承受 2219 磅/964 公斤),前后端之间的通风量要在 1560 CFM 和 2200 CFM2之间,不这样做就 可能会热到要融掉!所有这一切都可能会改变,所以请检查最新的规格需求。

2 CFM 是一种流量单位,1CFM≈1.7m3/h。

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 5

● 必须有合格的电力保障。 ● 必须安装 Oracle Linux 5.3(x86_64)和 Oracle Database 11.2(目前推荐)。 ● 必须使用 RMAN 进行备份。 ● 考虑使用 StorageTek SL500 磁带备份(评价很不错,但价格偏贵)。 ● 不要添加任何外来的硬件……不支持! ● 不要更改 BIOS/驱动……不支持! 下面是一些其他的最佳实践: ● 使用 4MB 大小的 ASM 分配单元(Allocation Unit,AU)(目前推荐)。 ● 创建 Celldisk 和 Griddisks 时使用“CREATE ALL”。 ● 使用 DCLI 一次性在所有存储服务器上执行命令(有用而且节省时间)。 ● 使用 IORM 管理资源。 ● 安装之前确定您的快速恢复区(Fast Recovery Area,FRA)和 MAA 需求。 ● 数据库使用 11.2.0.1 以上版本(11.2.1.3.1)和 ASM 的 11.2.0.1 以上版本(目前最低要求)。 ● 必须兼容 11.2.0.1 以上版本(目前最低要求)。 ● 使用 32GB 大小的日志文件。 ● 使用本地管理表空间(Locally Managed Tablespace,LMT)和 4MB 的统一大小区(Extent)。 ● 使用数据泵移动数据(通常使用这个工具,您也可以有很多其他选择)。 ● 使用默认的初始化参数启动,根据您的工作负载在需要的时候再调整。 本书写作的时候,下面提到的数据库机器已经就位,截止 2011 年 6 月 Oracle 已经卖出了第 1 000 台 Exadata 机器。现在的 Exadata 机器提供了 150 万闪存 IOPS(每秒的 I/O)。您读到这段文 字的时候,这个数字一定又刷新了。正如加速了软件世界那样,Oracle 正在加快它们的硬件世界。 如果 Oracle 继续这种加速的话,广受欢迎的电影“钢铁侠”中的世界可能并不像想象的那么遥远。 在影片中,钢铁侠甚至“访问 Oracle 网格”。不知您注意到了没有,拉里·埃利森也出现在电影 中。软硬一体的工程正在改变游戏规则! 第 2 版(X2-2)Exadata 机器由 Oracle 公司(Sun)独家制造,它包括: ● 8台计算服务器(型号 4170 M2)

8 台服务器×2 CPU/服务器×6 核/CPU=96 核 8 台服务器×4 个磁盘/服务器×300GB(1 万转/分钟)/磁盘(服务器端总共 9.6TB 的 SAS 存储空间) ● 8台计算服务器×96GB 内存/服务器=768GB 内存 ● 3台 InfiniBand 交换机(40 Gb /秒)×36 端口/交换机=108 端口 ● 14 台存储服务器,共有 168 个 CPU 核和闪存:

96GB 闪存卡×4=384GB 闪存/存储服务器 14 台存储服务器×384GB/存储服务器=5.376TB 闪存 12 磁盘/存储服务器×14 存储服务器=168 磁盘 168 磁盘×600GB/SAS 盘=101TB SAS 存储空间(15 000 转/分钟)或 168 磁盘×2TB/SATA 盘=336TB SATA 存储空间(7 200 转/分钟) ● 数据加载速率 12TB 每小时 第 2 版(X2-8)Exadata 机器由 Oracle 公司(Sun)独家制造,它包括: ● 两台计算服务器(2.26GHz 的 Intel 7560 CPU 和总共约 5TB 的 SAS 存储空间):

6 Oracle Database 11gR2 性能调整与优化

两台服务器×8 CPU/服务器×8 核/CPU=128 核 两台服务器×8 个磁盘/服务器×300GB(1 万转/分钟)/磁盘(服务器端总共 4.8TB 的SAS 存储空间) ● 两台计算服务器×1TB 内存/服务器=2TB 内存 ● 3台 InfiniBand 交换机(40 Gb /秒)×36 端口/交换机=108 端口 ● 14 台存储服务器,共有 168 个 CPU 核和闪存:

96GB 闪存卡×4=384GB 闪存/存储服务器 14 台存储服务器×384GB/存储服务器=5.376TB 闪存 12 磁盘/存储服务器×14 存储服务器=168 磁盘 168 磁盘×600GB/SAS 盘=101TB 的 SAS 存储空间(15 000 转/分钟)或 168 磁盘×2TB/SATA 盘=336TB 的 SATA 存储空间(7 200 转/分钟) 在 2011 年 7 月,Oracle 增加了 Exadata 存储扩展柜,它通过 InfiniBand 与 X2-2 和 X2-8 相连 接,使其存储容量得到扩充。它具有额外的 18 台存储服务器与 216 个 CPU 核;6.75TB 闪存(约 190 万 IOPS 的闪存);216 块具有 2TB 容量的 7200 转/分钟 SAS 磁盘(432TB 的原始磁盘空间,大 约 194TB 镜像的非压缩可用容量)。使用这个作为磁盘备份,让您可以获得大概 27TB/小时的速度。 同时发布的还有 Exalytics 商务智能机,专为小企业设计的 Oracle Data Appliance 和拥有全新 T4 处 理器(第 11 章中讨论)的 SPARC SuperCluster。硬件世界的范式转变才刚刚开始! 以下是一些关于 Exalogic Elastic Cloud 的简要信息,这是面向互联网上的应用程序(也包括一 些其他中间件软件)并使之运行更快的机器(亚马逊、Facebook、谷歌、Twitter、雅虎、苹果、 Salesforce.com、eBay 和其他一些电子商务玩家如果还没有买的话,他们都应该买一两台!)。 一台 Exalogic Elastic Cloud(X2-2)包括了(处理每秒 100 万次的 HTTP 请求): ● EL X2-2 30 台计算服务器,360 个 CPU 核,2.9TB 的内存,4TB 的 SSD 读缓存,40TB 的 SAS 硬盘。将使融合应用程序快到冒烟! ● 100 万 HTTP/每秒,我听说两台这样的设备就可以支撑整个 Facebook,虽然 Facebook 有 超过 5 亿的用户(参考最近关于 Exalogic 的广告)。 这里总结了 Exadata 速度快的原因: 快速的硬件、充足的 CPU、快速的闪存、数据库服务器 和存储上大量的内存、压缩(性能提高 10 到 70 倍)、分区剪裁(Partition Pruning,性能提高 10 到 100 倍)、存 储 索 引 (性能提高 5 到 10 倍)、智能扫描(性能提高 4 到 10 倍)以及其他没有涵盖的特性 (请参阅 Oracle 文档以获得更多信息)。Exadata 是可以将 1TB 的搜索转成 500MB 甚至 50MB 搜索 的最好方式。我相信,Exadata 是超划算的买卖,它将推动所有主流的硬件厂商加速硬件创新。它 真是快到要爆了!

1.2 高级压缩

Oracle 11g 中引入了名为“高级压缩”的新特性,向不同的组织机构承诺数据库表将占用更 少的空间,相当于数据库变小了。较小的数据库占用较少的磁盘空间,也相当于较低的数据库磁

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 7

盘存储的成本。随着数据库的规模以惊人的速度持续增长,能增加单位 GB 的存储容量确实非常 令人振奋。除此之外,也有潜在的性能优势来自于大量的读操作,比如全表扫描。Oracle 只需要 更少的物理块读操作就可以完成全表扫描;利用压缩的数据块使得更多的数据可以存储在 SGA 中,这同样可以潜在地节省高速缓冲区内存。 Oracle 在 8i 版本中首次引入了对索引键的压缩,然后在 9i 版本中加入了压缩表。Oracle 9i 的表压缩是受限的,因为压缩只能通过创建操作实现,比如 CREATE TABLE AS SELECT,也就 是直接加载或以追加方式插入。这种压缩适合初始数据加载,但随着时间的推移,表需要重新组 织然后重新压缩,这就需要维护和停机时间来维持压缩。随着数据库表高可用性压力的增加,压 缩不再适合正常的 OLTP 系统,因为大多数数据不是直接加载。Oracle 引进的高级压缩改变了这 一切,允许数据在更新和插入表的时候保持压缩,比如下面的 CREATE TABLE 所示:

create table emp_compressed (EMPNO NUMBER(4), ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(2)) COMPRESS FOR OLTP;

请注意以下高级压缩设置: ● NOCOMPRESS:表或分区不会被压缩。这是默认动作。 ● COMPRESS:适用于数据仓库。只在直接路径插入时启用压缩。 ● COMPRESS FOR DIRECT_LOAD OPERATIONS:同 COMPRESS 效果一样。 ● COMPRESS FOR ALL OPERATIONS:适合 OLTP 系统。所有操作,包括常规的 DML 语句都启用压缩。兼容参数 COMPATIBLE 需要设置为 11.1.0 或更高。 ● COMPRESS FOR OLTP:适合 OLTP 系统。所有操作,包括常规的 DML 语句都启用压 缩。兼容参数 COMPATIBLE 需要设置为 11.1.0 或更高。在 11.2 中已取代 COMPRESS FOR ALL OPERATIONS 语法,但 COMPRESS FOR ALL OPERATIONS 语法仍然存在 而且有效。

1.3 自动诊断信息库(Automatic Diagnostic Repository,ADR)

Oracle 11g 中引入了自动诊断信息库(ADR),它提供了一个统一而且一致的机制来存储、格式 化并定位所有的数据库诊断信息(易于使用的文件结构)。ADR 关联各种组件(比如 Oracle RAC、 Oracle Clusterware、OCI、Net、进程等)的错误,并自动为严重的错误生成事故和提供事故管理功 能。ADR 可以显著减少解决事故和问题的时间。 通常在使用传统的初始化参数的时候,比如 BACKGROUND_DUMP_DEST、CORE_DUMP_ DEST 和 USER_DUMP_DEST 等,如果想让清理文件的过程自动进行,就必须使用自定义过程去

8 Oracle Database 11gR2 性能调整与优化

手动清理。用 ADR 和 ADR 的命令行界面(ADRCI),您可以设置控制这些文件保存时间的策略:

adrci> set control (SHORTP_POLICY = 360 ) adrci> set control (LONGP_POLICY = 4380 )

如表 1-1 中所示,使用 ADR 时,传统的 CORE_DUMP_DEST、BACKGROUND_DUMP_DEST 和 USER_DUMP_DEST 位置改变为 DIAGNOSTIC_DEST。因此,如果指定了参数 DIAGNOSTIC_DEST, 由原来的参数设置的位置将被忽略。

表 1-1 使用 ADR 时的位置变化

原 始 位 置 新 位 置

CORE_DUMP_DEST DIAGNOSTIC_DEST/diag/rdbms///cdump

BACKGROUND_DUMP_DEST DIAGNOSTIC_DEST/diag/rdbms///trace

(Alert Log text) DIAGNOSTIC_DEST/diag/rdbms///alert

(Alert Log XML)

BACKGROUND_DUMP_DEST DIAGNOSTIC_DEST/diag/rdbms///trace

USER_DUMP_DEST DIAGNOSTIC_DEST/diag/rdbms//< INSTANCENAME >/trace

如下是 ADR 文件位置的缩略列表: ● DIAGNOSTIC_DEST/diag/rdbms///trace ● DIAGNOSTIC_DEST/diag/rdbms///alert ● DIAGNOSTIC_DEST/diag/rdbms///cdump ● DIAGNOSTIC_DEST/diag/rdbms///incident ● DIAGNOSTIC_DEST/diag/rdbms///hm ● DIAGNOSTIC_DEST/diag/rdbms///incpkg ● DIAGNOSTIC_DEST/diag/rdbms///ir ● DIAGNOSTIC_DEST/diag/rdbms///lck ● DIAGNOSTIC_DEST/diag/rdbms///metadata ● DIAGNOSTIC_DEST/diag/rdbms///sweep ● DIAGNOSTIC_DEST/diag/rdbms///stage ● ** 默认情况下,DIAGNOSTIC_DEST 的位置是 $ORACLE_HOME/log 然而,如果在环境变量中设置了 ORACLE_BASE,那么 DIAGNOSTIC_DEST 就会被设置为 $ORACLE_BASE。请参考第 4 章以获得关于这个主题的更多信息和如何设置初始化参数。

1.4 自动共享内存管理(Automatic Shared Memory Management,ASMM)的改进

Oracle 9i 实现了用 PGA 管理 SORT_AREA_SIZE、HASH_AREA_SIZE、位图合并区和创建 位图区域。Oracle 10g 迈出了走向自动内存管理的第一步,那就是通过 SGA 内存管理来管理共享 池(Shared Pool)、大型池(Large Pool)、Java 池和缓冲区缓存(Buffer Cache)。Oracle 11g 进一步改进

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 9

了自动共享内存管理,使得可以自动管理 SGA 和 PGA。为了使用自动内存管理(Automatic Memory Management,AMM)来管理 SGA 和PGA,Oracle 公司推出了两个新的数据库参数:MEMORY_TARGET 和 MEMORY_MAX_TARGET。 那么 Oracle 是如何处理之前的自动内存管理参数的呢?当设置了 MEMORY_TARGET 之后, SGA_TARGET 和 PGA_AGGREGATE_TARGET 只会被用来表示最低内存设置。为了允许 Oracle 管理内存有最大的灵活性,您可以设置 SGA_TARGET 和 PGA_AGGREGATE_TARGET 为 0(不 建议使用,我建议给它们设置最小值)。 下面是一些重要注意事项: ● Linux Huge Pages 和 MEMORY_TARGET 参数是不兼容的。更多细节可参见 MOS 文献 749851.1 以了解进一步的细节。 ● MEMORY_TARGET 的值要小于操作系统共享内存文件系统(/dev/shm)。在 Oracle Linux 系统中,数据库启动时,/dev/shm 的空闲空间必须大于 MEMORY_TARGET 的设置,否 则会得到“ORA-00845:MEMORY_TARGET not support on this system”的错误。 ● 如果 LOCK_SGA 数据库初始化参数设置为 true,您就不能使用参数 MEMORY_TARGET 来启用自动内存管理。 请参考第 4 章以获取关于这个主题的更多信息和如何设置初始化参数。

1.5 ASM 的改进

Oracle 11g 大大改善了 Oracle ASM 的可扩展性、可用性、性能和文件管理功能。Oracle 11g 中 ASM 的改进包括减少了数据库的启动时间和内存要求、允许支持更大 ASM 的文件和提供了 在 ASM 上实现几百 TB 级或 PB 级(1PB=1000TB)数据库的能力。为了提高可扩展性,ASM 增 加了支持超大规模数据文件大小的能力。Oracle 数据库限制单一的数据文件大小是 128TB(当 DB_BLOCK_SIZE = 32K 时),这远远小于新的 ASM 文件大小限制。 以下是新的 ASM 限制: ● 在 Exadata 环境下支持最大 40 EB 存储(不在 Exadata 环境下最大是 20 PB)。 ● 在 Exadata 环境下每个 ASM 磁盘最大 4PB(不在 Exadata 环境下最大是 2TB)。 ● 最大支持每个磁盘组 100 万个文件。 ● 最大支持一万个 ASM 磁盘。 ● 每个 ASM 实例最大支持 63 个磁盘组。 ● 当设置 AU_SIZE=1M 和 COMPATIBLE.RDBMS=> 11.1 时磁盘组支持的最大文件大小: 外部冗余:140PB 正常冗余:23PB 高冗余:15PB

注意 当使用大文件(big file)表空间时,Oracle 数据库的最大大小是 65533(数据文件的最大数 量)×128TB(64 位操作系统上数据文件的最大大小) = 8EB(如果是小文件(small file)表空间,最大数 据库大小则是 8PB)。64 位操作系统支持的最大内存寻址空间是 16EB(大约 18 后面有 18 个 0 的字 节)。这样将来您就可以使这 8EB 的数据库常驻内存,另外还有 8EB 的空闲内存!

10 Oracle Database 11gR2 性能调整与优化

其他关于大小的注意事项包括: ● 可变大小的区(Extent):可以支持更大的 ASM 文件,为超大规模数据库(VLDB)减少 SGA 内存的需求,并提高文件创建和打开的性能。 ● 分配单元(AU):可以分配给文件的磁盘最小单位,分配单元的大小可以是 1MB、2MB、 4MB、8MB、16MB、32MB 和 64MB;默认是 1MB 大小。 ● 条带化:粗的条带大小为 1 个分配单元(AU),细的条带大小为 128KB。 ● 较大的分配单位:为了支持较大的连续读和写,较大的分配单元(AU)可以带来显著的性 能提升。 ● 区大小:在 11.1 中,ASM 的文件可以从 1MB 的区大小开始。假设用 1MB 大小的分配 单元的话,然后随着 ASM 文件的增长,根据预定的区数逐步增加 8 倍到 8MB 和 64MB。 在 11.2 中,文件的扩展大小是变化的,具体如下: 在前 20 000(0 到 19 999)个区时,区大小始终等于磁盘组的分配单元(AU)大小。 在接下来的 20 000(20 000 到 39 999)个区时,区大小等于 4 倍的分配单元(AU)大小。 在接下来的 20 000 和更大(40 000+)的区范围时,区大小等于 16 倍的分配单元(AU)大小。 ● MAXIO 缓冲区大小:增加 MAXIO 缓冲区大小到 4MB 并且创建拥有 4MB 分配单元(AU) 大小的磁盘组有益于大量连续读 I/O 的性能提升。

1.5.1 从 ASM 首选镜像读取

在 Oracle 11g 中,当使用 Oracle ASM 来管理冗余时,一台主机上的 ASM 实例可以配置为从 “首选镜像”上读取副本;默认是从主组中读取。当 ASM 的 FailGroup 位于不同位置的时候,这 为 Oracle RAC 环境提供了极大的好处。假如 ASM 的 FailGroup 和主组位于不同的位置,RAC 实 例可以配置为从本地的镜像副本读取数据,而不是从远程的主组读取,从而消除了潜在的网络延 迟。ASM 的首选镜像读取通过每个 ASM 实例的控制初始化参数 ASM_PREFERRED_READ_ FAILURE_GROUPS 来控制。例如,您有两个站点分别叫做 site1 和 site2,ASM 磁盘组 DATA1 有两个 FailGroup 分别命名为 SITE1 和 SITE2(请在使用之前阅读相应的 Oracle 文档): 对于 site1:

ASM_PREFERRED_READ_FAILURE_GROUP=DATA1.SITE1 对于 site2:

ASM_PREFERRED_READ_FAILURE_GROUP=DATA1.SITE2

1.5.2 滚动升级/打补丁

为了提高可用性,Oracle 11g 在 Oracle RAC 环境下的 ASM 实例具备了滚动升级的能力,这 是通过把 ASM 实例打开到“滚动迁移”模式来完成的。滚动迁移模式允许 ASM 实例暂时在多版 本的 ASM 环境下工作。建议在开始 ASM 滚动升级前,先完成在集群上所有 Oracle 软件的安装 以使滚动升级的时间最短,因为大多数的 ASM 操作在 ASM 实例滚动升级过程中都是不允许的(请 在使用之前全面阅读相应的 Oracle 文档)。 开始滚动升级:

ALTER SYSTEM START ROLLING MIGRATION TO ;

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 11

如果在滚动升级中遇到问题,就停止升级或降级:

ALTER SYSTEM STOP ROLLING MIGRATION;

1.5.3 更快的重新平衡

Oracle 11g 改进了 ASM 重新平衡操作的性能,从而显著降低了磁盘由于各种瞬时故障而导致 脱机的时间,这些故障的原因包括电缆松动、停电、总线适配器或磁盘控制器故障等。ASM 将在 停运期间跟踪被修改的盘区。一旦暂时的故障被修复,并且如果磁盘上的内容未被修改过,ASM 就可以迅速重新同步停电期间没来得及修改的 ASM 镜像盘区。这使得磁盘可以重新联机并同步 的操作比以前快几小时甚至几天。 新的 DISK_REPAIR_TIME 属性允许定义一个时间窗口,在该时间窗内可以进行故障维修或 同步的操作,镜像磁盘也可以在该时间窗内重新上线。DISK_REPAIR_TIME 默认为 3.6 小时,但 针对磁盘组可以通过 ALTER DISKGROUP 命令进行修改(请在使用前阅读相应的 Oracle 文档):

ALTER DISKGROUP SET ATTRIBUTE 'DISK_REPAIR_TIME'= '24H';

您可以通过下面的命令重新联机全部的磁盘组(可以把 ALL 替换成 DISK 来针对 单独的磁盘组),并开始重新同步的过程:

ALTER DISKGROUP DISK ONLINE ALL;

注意 Oracle 11g 允许磁盘组被挂载在限制模式下,从而消除多个 ASM 实例之间在重新平衡操作时 所需要的锁定和解锁消息。这大大提高了 RAC 环境下重新平衡操作的性能。这里是一系列您可 能会用到命令的示例:

ALTER DISKGROUP DISMOUNT ; ALTER DISGROUP MOUNT RESTRICTED ;

执行维护活动(重新平衡/添加/删除/联机/脱机磁盘等):

ALTER DISKGROUP DISMOUNT ; ALTER DISKGROUP MOUNT ;

1.5.4 ASM 磁盘组兼容性

Oracle 11g中引入了两个新的磁盘组兼容性属性以确定可以使用特定 ASM 磁盘组的最低版本 的 ASM 实例和数据库实例。新属性 compatible.asm 和 compatible.rdbms 在磁盘组级别设置,在有 必要降级的时候,它们可能非常有用(见示例):

CREATE DISKGROUP DATA1 NORMAL REDUNDANCY DISK '/dev/raw/raw1', '/dev/raw/raw2' ATTRIBUTE 'compatibile.asm'='11.1' ;

ALTER DISKGROUP DATA1 SET ATTRIBUTE 'compatible.rdbms'='11.1' ;

select group_number GN, name, compatibility COMPAT, database_compatibility DCOMPAT

12 Oracle Database 11gR2 性能调整与优化

from v$asm_diskgroup;

GN NAME COMPAT DCOMPAT ------1 DG1 11.1.0.0.0 11.1.0.0.0 2 DG2 10.1.0.0.0 10.1.0.0.0

1.5.5 ASMCMD 命令扩展

为了更好地管理 ASM 磁盘组,Oracle 11g 在 ASMCMD 工具里增加了很多新的命令,下面列 出了其中一部分: ● CP:在 ASM 磁盘组和操作系统文件系统之间复制文件。

ASMCD> cp +ASM1/system.dbf/backups/orcl/system.dbf

● MD_BACKUP:备份磁盘组元数据。

ASMCMD> md_backup –b /backups/orcl/asmbackupfile.md -g ASM1

● MD_RESTORE:恢复磁盘组元数据。

ASMCMD> md_restore –b /backups/orcl/asmbackupfile.md –t full –g ASM1

● LSDSK:列出磁盘信息。

ASMCMD> lsdsk

● REMAP:在指定的那些数据块上进行坏块的重映射。

ASMCMD> remap

● SYSASM privileges:为 ASM 指定新的角色,比如 SYSDBA。

SQL> GRANT SYSASM TO ; SQL> CONNECT AS SYSASM ;

1.6 自动 SQL 优化

Oracle 11g 引入了自动 SQL 优化。这本书的许多章节都详细涵盖了这个主题,因此本节只作 概述。Oracle 11g 根据 AWR(Automatic Workload Repository,自动负载信息库)的统计信息针对产 生较大性能影响的 SQL 语句运行 SQL 优化顾问(SQL Tuning Advisor)。AWR 的统计信息用来生 成一个 SQL 语句列表并根据它们过去一周对系统性能的影响进行排序,这个 SQL 列表会自动排 除所有被断定为不太容易优化的 SQL 语句,比如并行查询、DML、DDL 和任何由并发问题引起 的性能问题。SQL 优化顾问生成优化 SQL 的建议,这类建议中可能有 SQL 配置文件(Profile)(利 用统计信息)。当建议使用 SQL 配置文件的时候,这些配置文件会进行性能测试,如果测试结果 显示至少有三倍的改进,并且 SQL 优化任务参数 ACCEPT_SQL_PROFILES 设置为 true,这个建 议就会被接受;如果 ACCEPT_SQL_PROFILES 被设置为 false,这个建议会被报告。您也可以针 对任何查询单独执行这些步骤。

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 13

通过调用 DBMS_AUTO_TASK_ADMIN 程序包的 ENABLE 和DISABLE 过程就可以控制自动 SQL 优化任务的执行。当启用时,SQL 优化顾问就在定义好的维护时间窗口里运行,默认的维 护时间窗口参考下面的表 1-2。

表 1-2 Oracle 11g 默认维护窗口

窗 口 名 称 描 述

MONDAY_WINDOW 星期一晚上 10 点开始到第二天临晨 2 点

TUESDAY_WINDOW 星期二晚上 10 点开始到第二天临晨 2 点

WEDNESDAY_WINDOW 星期三晚上 10 点开始到第二天临晨 2 点

THURSDAY_WINDOW 星期四晚上 10 点开始到第二天临晨 2 点

FRIDAY_WINDOW 星期五晚上 10 点开始到第二天临晨 2 点

SATURDAY_WINDOW 星期六晚上 10 点开始并持续 20 小时

SUNDAY_WINDOW 星期日晚上 10 点开始并持续 20 小时

启用和禁用自动 SQL 优化:

exec dbms_auto_task_admin.enable(client_name => 'sql tuning advisor',operation => NULL, window_name => NULL);

exec dbms_auto_task_admin.disable(client_name => 'sql tuning advisor', operation => NULL,window_name => NULL);

配置自动 SQL 优化:

exec dbms_sqltune.set_tuning_task_parameter (task_name => 'SYS_AUTO_SQL_TUNING_TASK', parameter => 'ACCEPT_SQL_PROFILES', value => 'TRUE');

以下是控制自动 SQL 优化任务的 dbms_sqltune 选项: ● INTERRUPT_TUNING_TASK:中断正在执行的任务,得到中间结果并正常退出。 ● RESUME_TUNING_TASK:恢复先前被中断的任务。 ● CANCEL_TUNING_TASK:取消正在执行的任务,清除任务的所有结果。 ● RESET_TUNING_TASK:重置正在执行的任务,清除任务的所有结果并返回到其初始 状态。 ● DROP_TUNING_TASK:删除一个任务,清除所有与该任务相关的结果。 第 5 章将展示如何在企业管理器中通过简单的“点击运行”来使用自动 SQL 优化功能。

1.7 数据卫士的增强

Oracle 11g 中改进了 Oracle 数据卫士的一些特性,以提高其能力和可用性。以下各节详细介 绍了这些改进。

14 Oracle Database 11gR2 性能调整与优化

1.7.1 快照备用(Snapshot Standby)

通过 Oracle 11g 的新特性快照备用,您现在可以暂时打开一个物理备用数据库,用于做读/写 活动,比如报表和负载测试。以读/写方式打开的物理备用数据库仍然接收从主数据库发来的重做 数据,因此它持续地对主要故障提供保护,同时可使自身被用于其他的活动。因为可以服务于企 业的其他用途,维护成本核算,物理备用数据库的价值就得到了提升。请记住,快照备用数据库 从主数据库接收和归档重做数据,但并不在备用数据库上应用,直到快照备用数据库转换回物理 备用数据库。 Oracle 11g 也提升了主数据库和备用数据库之间角色转换的速度。

1.7.2 活动数据卫士

活动数据卫士是 Oracle Database 11g 版本中为物理备用数据库引入的一个可选功能。这一可 选功能需要支付 Oracle 公司额外的授权费用;因此,在您的环境中实施这个功能之前,您必须获 得许可。此功能允许物理备用数据库在只读模式的同时应用重做日志以保证物理备用数据库持续 跟主数据库保持一致。主数据库和物理备用数据库都必须把数据库兼容初始化参数设置为 11.0(也 就是 11g 兼容模式)。请注意 Oracle 活动数据卫士需要单独的许可并且只能用于 Oracle 数据库企 业版。您可以通过 Oracle 数据库企业版的活动数据卫士选件来购买它。它也包含在 Oracle GoldenGate 产品中。 在 11gR2 中,通过查询 V$STANDBY_EVENT_HISTOGRAM 视图可得到延迟的历史,Oracle 以此改进了活动数据卫士(见示例查询):

select * from v$standby_event_histogram where name = 'APPLY LAG';

此外,11gR2 增加了一个数据库初始化参数,用来设置备用数据库可以在滞后多久后,在它 上面的查询活动就需要被控制。在活动数据卫士启用的时候,对于物理备用数据库上非管理员用 户执行的查询,您可以使用 STANDBY_MAX_DATA_DELAY 参数来指定特定会话的应用可以允 许的滞后,这个参数以秒为单位。这个功能允许查询安全地把对主数据库的资源消耗卸载到物理 备用数据库上,因为在查询执行之前就可以知道备用数据库是否已经过时到不可接受。 STANDBY_MAX_DATA_DELAY 默认值是 NONE,这意味着无论是否存在应用滞后,在物理备 用数据库上发出的查询都将被执行。其他有效的值是一个大于 0的整型值(表示容忍的滞后秒数)。 值为 0 表示对物理备用数据库发出的所有查询都将返回和对主数据库查询相同的结果,而值大于 0 表示对物理备用数据库发出的查询只有在应用滞后小于或等于 STANDBY_MAX_DATA_DELAY (否则就会返回 ORA-3172 错误,表示应用滞后太久)时才被执行。下面列出几个有用的查询。 要检查物理备用数据库的状态,以确保该数据库的角色是物理备用数据库并且打开模式是只 读,可以运行下面的查询来确认。需要注意的是 11gR2 将显示打开模式为“read only with apply”。

select db_unique_name, database_role, open_mode from v$database;

DB_UNIQUE_NAME DATABASE_ROLE OPEN_MODE

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 15

------TESTSB PHYSICAL STANDBY READ ONLY

要检查物理备用数据库滞后主数据库的时间,可以运行下面的语句:

SELECT name, value, unit, time_computed, to_char(sysdate, 'DD-MON-YY HH24:MI:ss') FROM V$DATAGUARD_STATS WHERE name like 'apply lag';

NAME VALUE UNIT TIME_COMPUTED TO_CHAR(SYSDATE,'D ------apply lag +00 00:00:00 day(2) to second(0) interval 20-MAY-2009 19:04:17 20-MAY-09 19:04:44

1.7.3 混合平台支持

Oracle 11g 增加的一个扩展功能是物理备用数据库可以跟主数据库位于不同的操作系统。 Oracle 11g 现在允许 Linux 跟 Windows 的组合,同样也支持 Solaris/IBM AIX 的组合(参考 bug 12702521 以查看 11.2.0.2 版本中额外的限制)。而其他平台的组合在 10g 时就已经支持,所以这是 第一次完整地支持异构操作系统。

注意 如果要查询所支持平台/操作系统组合的完整列表,请参阅 MOS 文献 413484.1。如 果 要 查看更多的限制和细节,请参考 MOS 文献 395982.1 和 414043.1。

1.7.4 高级压缩支持逻辑备用数据库(11gR2)

Oracle Database 11g R1 引入了高级压缩,但是高级压缩不能用于流或逻辑备用数据库的对象。 在 11gR2 中,高级压缩可以支持流和逻辑备用数据库了。

1.7.5 透明数据加密支持逻辑备用数据库

Oracle 11g 中的透明数据加密支持逻辑备用数据库。SQL Apply 也支持使用透明数据加密,这 进一步增强了逻辑备用数据库的功能和利用率。

1.7.6 增强的数据泵压缩

Oracle 10g 的数据泵可以通过设置参数 COMPRESSION 为METADATA_ONLY 来压缩数据泵 导出来的元数据(这可以使产生的 Dump 文件的大小最大缩小 15%)。在 11g 中,数据泵不仅可以 压缩数据泵的元数据,还可以压缩数据库中的数据。压缩通过为元数据、列数据或整个 Dump 文 件集指定不同 COMPRESSION 参数值来实现,有效的参数值包括 ALL、METADATA_ONLY、 DATA_ONLY 和 NONE。

16 Oracle Database 11gR2 性能调整与优化

1.7.7 数据泵加密 Dump 文件集

Oracle 11g 的数据泵可以加密 Dump 文件,可以对 Dump 文件中的元数据和数据库数据进行 加密。Oracle 11g 的数据泵增加了新的参数以控制加密: ● ENCRYPTION:设置 Dump 文件或 Dump 文件集的加密;有效值是 ALL、DATA_ONLY、 METADATA_ONLY、ENCRYPTED_COLUMNS_ONLY 或 NONE。 ● ENCRYPTION_ALGORITHM:设置 Dump 文件或 Dump 文件集的加密算法;有效值是 AES128、AES192 和 AES256。 ● ENCRYPTION_MODE:为 Dump 文件或 Dump 文件集生成加密密钥的方法;有效值是 DUAL、PASSWORD 和 TRANSPARENT。 我强烈建议在您的系统中考虑多层次的加密。您应该制定一个全面的安全计划,包括在每一 个需要的层次加密(特别是加密您的备份)。安全性的话题超出了本书的范围,但应该是需要优先 考虑的!

1.7.8 数据泵的传统模式

在 11gR2 中,数据泵有个传统模式。该传统模式兼容由原来的导出和导入工具创建的脚本和 参数文件,使用原来的导出和导入工具的用户和进程可以借助新的数据泵导出和导入工具继续工 作,而无需改变和/或更新。此增强功能简化了用户迁移到新的数据泵工具的过程。

1.8 增强了的统计信息

Oracle 11g 在以下几个方面改善了统计信息:增强的 I/O 统计信息、分区对象的统计信息收集、 待定统计信息、多列统计信息和表达式统计信息。

1.8.1 增强了的 I/O 统计信息

Oracle 11g 从消费组(Consumer Group)、数据库文件和数据库功能三个方面收集所有 I/O 调用 的统计信息。当资源管理器启用时,作为启动的资源计划的一部分,每个针对消费组的 I/O 统计 信息就会被收集起来。这些统计数据可以通过视图 V$IOSTAT_CONSUMER_GROUP 来查看。数 据库文件的统计信息在这些文件被访问的时候就已经被收集了。这些统计信息表明了大和小的读 和写的请求、服务时间和小的读延迟。 它们可以通过字典视图 V$IOSTAT_FILE 来查看。数据库功能的 I/O 统计信息基于数据库的 功能,比如 LGWR、DBWR 进程,并指示了大和小的读和写的请求、等待数量和等待时间。它 们通过字典视图 V$IOSTAT_FUNCTION 来查看。

1.8.2 减少收集分区对象的统计信息

Oracle 11g 可以配置针对分区对象的增强统计信息收集,仅收集有写活动的分区,从而去除 了没有改变的分区对象上的统计信息收集。这提高了针对大的分区对象统计信息收集的速度,因

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 17

为有些分区只包含静态数据。

1.8.3 待定统计信息

Oracle 11g 有一个新的特性,称为待定统计信息。这个特性可以使新收集的统计数据保持在 挂起状态,直到决定发布它们为止。默认条件下,统计信息在收集操作完成的时候自动发布。待 定统计信息是通过 DBMS_STATS 程序包和 OPTIMIZER_USE_PENDING_STATISTICS 这个数据 库初始化参数来控制的。 查看待定统计信息设置:

SQL> SELECT dbms_stats.GET_PREFS('PUBLISH') PUBLISH FROM DUAL;

设置自动发布全局待定统计信息(默认):

SQL> exec dbms_stats.SET_GLOBAL_PREFS ('PUBLISH', 'TRUE');

设置不自动发布全局待定统计信息:

SQL> exec dbms_stats.SET_GLOBAL_PREFS ('PUBLISH', 'FALSE') ; 待定统计信息的一个很大特性是未发布的统计信息可以通过设置初始化参数 OPTIMIZER_USE_PENDING_STATISTICS 在发布之前进行测试。此参数可以在系统级别或会话 级别进行设置,当在会话级别使用时,优化器统计信息可以在发布之前在会话级别进行测试:

SQL> alter session set OPTIMIZER_USE_PENDING_STATISTICS=TRUE;

1.8.4 多列统计信息

Oracle 11g 中引入了多列统计信息,当单表的多个列在一条 SQL 语句的 WHERE 子句中使用 时,多列统计信息是一个强大的特性。优化器确定两列之间的关系,把它们被当作一个列组。例 如,在某个特定季节出售的物品(冬季大衣和泳衣)和季节(冬天和夏天)之间有一个关系。Oracle 11g 会自动根据对工作负载的分析来收集多列统计信息,和收集直方图的方法类似,但也可以使用 DBMS_STATS 程序包手动创建:

exec dbms_stats.gather_table_stats( 'SCOTT', 'EMP', method_opt => 'for columns (job,deptno)');

可以使用视图DBA_STAT_EXTENSIONS、ALL_STAT_EXTENSIONS或USER_STAT_EXTENSIONS 来查询设置。

1.8.5 表达式统计信息

Oracle 11g 的表达式统计信息帮助基于成本的优化器,基于列的选择性得知在列上应用函数 的影响。优化器可以在列上使用函数时做出更好的决策,因为它能够更好地预测返回的行数。

exec dbms_stats.gather_table_stats( 'SCOTT', 'EMP', method_opt => 'for columns (upper(ename))');

18 Oracle Database 11gR2 性能调整与优化

可以使用视图 DBA_STAT_EXTENSIONS、ALL__STAT_EXTENSIONS 或 USER_STAT_ EXTENSIONS 来查询设置。

1.9 闪回数据归档(Flashback Data Archive,FBDA)

闪回数据归档是 Oracle Database 11g 强大的新特性之一。它可以用安全有效的方式透明地跟 踪在数据库中存储的所有数据,并且没有保留期限的限制。这个特性很容易配置,而且拥有高效 的存储以及性能。闪回数据归档不依赖于 UNDO,通过“AS OF”闪回 SQL 语句来查看之前在某 个时间点的数据,防止意外的数据更新和删除(例如用户的错误操作)或恶意的数据破坏(例如黑客 入侵)。 闪回数据归档需要闪回数据归档表空间来存放,它通过新的闪回数据归档后台进程来收集数 据。这个进程把闪回数据归档内容写入闪回数据归档表空间。闪回数据归档针对每张表进行设 置,启用了闪回数据归档的表不可以做某些修改,比如使用了 UPGRADE TABLE 子句的 ALTER TABLE 语句、移动或交换分区/子分区和删除表。虽然这听起来可能是很不错的保护功能,但是 闪回数据归档不记录做更改的人,因此它不会协助追查操作。追查操作是一个需要额外付费的新 特性——Oracle 全面回忆(Total Recall)——的一部分。 以下是闪回数据存档的例子(使用前请参阅 Oracle 文档)。 创建一个闪回数据表空间,叫做 fbda1:

create tablespace fbda1 datafile 'c:\oracle\oradata\db\fbda1.dbf' size 500M;

创建一个闪回数据存档:

create flashback archive default dbda1 tablespace fbda1 retention 1 year;

创建一个使用闪回数据存档的表:

create table a (n number) flashback archive;

更改一个表以启用闪回数据存档:

alter table xyz flashback archive;

更改一个表以禁用闪回数据存档:

alter table xyz no flashback archive;

使用 AS OF 闪回语句查询一个表:

select * from a as of timestamp to_timestamp('19-SEP-2008 11:59:32','dd-mon-yyyy hh24:mi:ss') where table_name = 'EMP';

1.10 健康监控器(Health Monitor)

Oracle 11g 中引入了免费的数据库健康监控器,通过 DBMS_HM 程序包来完成。健康监控器 可以手动运行并检查下列项目: ● DB 结构完整性检查

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 19

● 数据块完整性检查 ● 重做日志完整性检查 ● UNDO 段完整性检查 ● 事务完整性检查 ● 数据字典完整性检查 使用 DBMS_HM 程序包执行健康检查:

SQL> exec dbms_hm.run_check ('Dictionary Integrity Check', 'HM_TEST') ; PL/SQL procedure successfully completed.

使用 DBMS_HM 程序包的 get_run_report 函数可以获取健康检查报告,使用 PL/SQL 函数通 过返回 CLOB 对象来提取报告。下面这个例子演示了如何通过 SQL Plus,使用 PL/SQL 脚本提取 报告到文件中。 执行生成报告的例子:

$ sqlplus sysorcl11g as sysdba

SQL*Plus: Release 11.1.0.6.0 - Production on Thu Oct 2 09:08:55 2008 Copyright (c) 1982, 2007, Oracle. All rights reserved. Enter password: Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options

SET LONG 100000 SET LONGCHUNKSIZE 1000 SET PAGESIZE 1000 SET LINESIZE 512 select DBMS_HM.GET_RUN_REPORT('HM_TEST') from dual;

下面是一个报告的例子:

Basic Run Information Run Name : HM_TEST Run Id : 966 Check Name : Dictionary Integrity Check Mode : MANUAL

Status : COMPLETED Start Time : 2008-10-02 08:59:50.734000 -04:00 End Time : 2008-10-02 08:59:57.296000 -04:00 Error Encountered : 0 Source Incident Id : 0 Number of Incidents Created : 0

Input Parameters for the Run TABLE_NAME=ALL_CORE_TABLES CHECK_MASK=ALL

20 Oracle Database 11gR2 性能调整与优化

Run Findings And Recommendations Finding Finding Name : Dictionary Inconsistency Finding ID : 967 Type : FAILURE Status : OPEN Priority : CRITICAL Message : SQL dictionary health check: dependency$.dobj# fk 126 on object DEPENDENCY$ failed Message : Damaged rowid is AAAABnAABAAAO2GAB3 - description: No further damage description available Finding Finding Name : Dictionary Inconsistency Finding ID : 970 Type : FAILURE Status : OPEN Priority : CRITICAL Message : SQL dictionary health check: dependency$.dobj# fk 126 on object DEPENDENCY$ failed Message : Damaged rowid is AAAABnAABAAAQtpABQ - description: No further damage description available

下面是一个脚本的例子:

------Script: run_health_check_report.sql ------Create a directory where we are going to write out report file to create directory healthcheck as '&u_name';

-- Get Database Instance Name to build file name to be used to put report into column database_name noprint new_value i_name SELECT UPPER(name) || '_healthcheck_report.lst' database_name FROM v$database ; declare v_rpt CLOB ; buffer VARCHAR2(32767); buffer_size CONSTANT BINARY_INTEGER := 32767; amount BINARY_INTEGER; offset NUMBER(38); file_handle UTL_FILE.FILE_TYPE; directory_name CONSTANT VARCHAR2(80) := 'HEALTHCHECK'; v_filename CONSTANT VARCHAR2(80) := '&i_name'; begin -- Run the Report v_rpt := dbms_hm.GET_RUN_REPORT ('&HNAME') ;

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 21

-- OPEN NEW FILE IN WRITE MODE file_handle := UTL_FILE.FOPEN( location => directory_name, filename => v_filename, open_mode => 'w', max_linesize => buffer_size);

amount := buffer_size; offset := 1;

WHILE amount >= buffer_size LOOP DBMS_LOB.READ( lob_loc => v_rpt, amount => amount, offset => offset, buffer => buffer);

offset := offset + amount;

UTL_FILE.PUT(file => file_handle, buffer => buffer); UTL_FILE.FFLUSH(file => file_handle); END LOOP;

UTL_FILE.FCLOSE(file => file_handle); END; /

1.11 事件打包服务(Incident Packaging Service,IPS)

Oracle 11g 作为 ADR 的一部分,有能力收集事件信息并发送给 Oracle Support。当事件发生 时,数据库在警报日志中记录下这一条目,向 Oracle 企业管理器发送事件警报,以 Dump 文件的 形式(事件 Dump)收集有关事件的诊断数据,用事件 ID 号标记事件 Dump,并存储在为这次事件 创建的 ADR 子目录中。事件打包服务可以收集和打包有关具体问题的所有诊断文件,这可以大 大减少收集所需诊断文件的时间,因此减少诊断信息发送给 Oracle Support 的周转时间(下面列出 了一个简单的例子)。在创建好包之后,您可以往包中添加额外的文件、从包中删除选定的文件或 修改包中选定的文件以删除敏感数据。

注意 更加简单和推荐的诊断数据的方法是使用 Oracle 企业管理器支持工作台(Oracle Enterprise Manager Support Workbench)。

$ adrci

22 Oracle Database 11gR2 性能调整与优化

adrci> help ips adrci> show incident

(这个例子展示了第 9817 号事件,事件是关于 ORA-600 [XYZ]的。)

adrci> ips create package incident 9817 Created package 4 based on incident id 9817, correlation level typical

adrci> ips add incident 9817 package 4 Added incident 9817 to package 4

adrci> ips add file /opt/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log package 4 Added file /opt/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log to package 4

adrci> ips generate package 4 in /tmp Generated package 4 in file /tmp/ORA600kci_20100514184516_COM_1.zip, mode complete

1.12 不可视索引(invisible index)

在我看来,Oracle 现在已经朝优化第三方应用程序迈出了巨大的一步。Oracle 现在允许用户 对优化器隐藏索引,而不必删除它们(索引继续被维护)。这是一个新引入的特性,叫做不可视索 引(第 2 章有详细介绍)。如果您曾经优化过含有非常大的表的查询并且在查询优化测试过程中不 得不删除和重建索引,您就会意识到这个新特性的威力。不可视索引也将有助于批处理过程的优 化。在很多情况下,索引确实能够帮助批处理过程,但是会影响到 OLTP 事务查询的性能。现在 您可以在 OLTP 操作中隐藏这个索引,但是允许批处理进程看到它。 为了使用不可视索引(甚至在不可见时期强制使用它),您可以设置参数 OPTIMIZER_USE_ INVISIBLE_INDEXES 的值为 true。此参数的默认值是 false,您可以通过命令 ALTER SESSION 或 ALTER SYSTEM 设置它。否则即使通过提示(Hint),不可视索引也会被优化器完全忽略。另一 个关于不可视索引的重要提示是,当它们在不可视状态时,优化器不会收集它们的统计信息。如 果需要维护它们的统计信息,要使索引可见或设置参数 OPTIMIZER_ USE_INVISIBLE_INDEXES 的值为 true(设置的时候要小心,参考第 4 章、附录 A 和 Oracle 文档以获取更多信息)。以下命令 显示了不可视索引的创建和在单独的会话中修改为可见:

SQL> create index my_index on my_table (ename) invisible; Index Created.

SQL> alter session set optimizer_use_invisible_indexes = true; Session altered.

1.13 分区新特性

Oracle 11g 中增加了几个分区新特性,提高了分区表的可管理性,也大大提高了性能。以下 各节包括区间分区(interval partition)、REF 分区(REF partition)、系统分区(system partition)、虚拟列 分区(virtual column-based partition)和分区顾问(Partition Advisor)。

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 23

1.13.1 区间分区

在 Oracle 11g 中,我最喜欢的新特性之一就是区间分区。究其原因,是因为它解决了一个长 期以来的问题。此前如果没有一个特定分区的值范围能匹配将要插入的值,Oracle 就会报错。这 个新特性扩展了范围分区的功能,可以使用区间来定义同等大小的分区(包括未来的分区)。当使 用区间分区时,Oracle 会在需要的时候自动创建新的分区。新的分区在这个分区的第一条记录插 入时被创建出来。这大大提高了分区表的可管理性,有助于节约 DBA 手动创建新分区的时间, 同时也预防了 Oracle 用户的使用错误。新的区间分区的有效组合为:区间、区间-列表、区间-哈 希和区间-范围。区间分区跟范围分区配合非常好用,这个时候分区是基于日期范围进行的。请注 意下面这个例子,它展示了创建表时的新功能。后面章节将对此进行详细探讨。

CREATE TABLE emp (EMPNO NUMBER(4), ENAME VARCHAR2(30), JOB VARCHAR2(20), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(2)) PARTITION BY RANGE (hiredate) INTERVAL (NUMTOYMINTERVAL(1,'YEAR')) (PARTITION part_1999 values LESS THAN (TO_DATE('01-JAN-2000','DD-MON-YYYY')));

一个相关的特性是延迟段创建分区(在 11.2.0.2 中引入)。有了这个特性,磁盘上的段和子分区 以及依赖的对象在第一行数据插入之前都不会创建。

1.13.2 REF 分区

Oracle REF 分区是 Oracle Database 11g 分区的新特性。REF 分区是在分区表外键的父-子关系 基础上的分区能力。就 REF 分区而言,子表的分区键传承自父表,所有改变父表逻辑形态的维护 操作均被复制到子表上。通过启用 partition-wise 连接,REF 分区还改善了父表与子表连接的性能。 当父表使用区间分区或者基于虚拟列的分区时,REF 分区不能使用。当您尝试用 REF 分区这样做 时,会得到下面的消息:

CREATE TABLE order_items * ERROR at line 1: ORA-14659: Partitioning method of the parent table is not supported 这项测试中发现的另一个古怪的问题是,如果并行地在父表上创建分区索引,就不能创建包 含 REF 分区的子表:它会造成 ORA-0600 错误。如果创建索引时没用并行,包含 REF 分区的子 表就可以成功创建。为了绕过这个问题,可以在创建 REF 分区的子表后,再于父表上创建分区索引。 下面的示例演示了如何做到这一点。注意在创建第二个表时用于引用第一个表的主键的

24 Oracle Database 11gR2 性能调整与优化

PARTITION BY REFERENCE 子句。

CREATE TABLE orders ( order_id NUMBER(12) CONSTRAINT orders_order_id_nn NOT NULL, order_date DATE CONSTRAINT orders_order_date_nn NOT NULL, order_mode VARCHAR2(8), customer_id NUMBER(6) CONSTRAINT orders_customer_id_nn NOT NULL, order_status VARCHAR2(2), order_total NUMBER(8,2), sales_rep_id NUMBER(6), promotion_id NUMBER(6), CONSTRAINT orders_order_id_pk PRIMARY KEY (order_id)) PARTITION BY RANGE (order_date) ( PARTITION p_pre_1999 VALUES LESS THAN (TO_DATE('01-JAN-1999','dd-MON-yyyy')), PARTITION p_JAN_1999 VALUES LESS THAN (TO_DATE('01-FEB-1999','dd-MON-yyyy')), PARTITION p_FEB_1999 VALUES LESS THAN (TO_DATE('01-MAR-1999','dd-MON-yyyy')), PARTITION p_MAR_1999 VALUES LESS THAN (TO_DATE('01-APR-1999','dd-MON-yyyy')), PARTITION p_APR_1999 VALUES LESS THAN (TO_DATE('01-MAY-1999','dd-MON-yyyy')), PARTITION p_MAY_1999 VALUES LESS THAN (TO_DATE('01-JUN-1999','dd-MON-yyyy')), PARTITION p_JUN_1999 VALUES LESS THAN (TO_DATE('01-JUL-1999','dd-MON-yyyy')), PARTITION p_JUL_1999 VALUES LESS THAN (TO_DATE('01-AUG-1999','dd-MON-yyyy')), PARTITION p_AUG_1999 VALUES LESS THAN (TO_DATE('01-SEP-1999','dd-MON-yyyy')), PARTITION p_SEP_1999 VALUES LESS THAN (TO_DATE('01-OCT-1999','dd-MON-yyyy')), PARTITION p_OCT_1999 VALUES LESS THAN (TO_DATE('01-NOV-1999','dd-MON-yyyy')), PARTITION p_NOV_1999 VALUES LESS THAN (TO_DATE('01-DEC-1999','dd-MON-yyyy')), PARTITION p_DEC_1999 VALUES LESS THAN (TO_DATE('01-JAN-2000','dd-MON-yyyy')), PARTITION p_JAN_2000 VALUES LESS THAN (TO_DATE('01-FEB-2000','dd-MON-yyyy')), PARTITION p_FEB_2000 VALUES LESS THAN (TO_DATE('01-MAR-2000','dd-MON-yyyy')), PARTITION p_MAR_2000 VALUES LESS THAN (TO_DATE('01-APR-2000','dd-MON-yyyy')), PARTITION p_APR_2000 VALUES LESS THAN (TO_DATE('01-MAY-2000','dd-MON-yyyy')), PARTITION p_MAY_2000 VALUES LESS THAN (TO_DATE('01-JUN-2000','dd-MON-yyyy')),

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 25

PARTITION p_JUN_2000 VALUES LESS THAN (TO_DATE('01-JUL-2000','dd-MON-yyyy')), PARTITION p_JUL_2000 VALUES LESS THAN (TO_DATE('01-AUG-2000','dd-MON-yyyy')), PARTITION p_AUG_2000 VALUES LESS THAN (TO_DATE('01-SEP-2000','dd-MON-yyyy')), PARTITION p_SEP_2000 VALUES LESS THAN (TO_DATE('01-OCT-2000','dd-MON-yyyy')), PARTITION p_OCT_2000 VALUES LESS THAN (TO_DATE('01-NOV-2000','dd-MON-yyyy')), PARTITION p_NOV_2000 VALUES LESS THAN (TO_DATE('01-DEC-2000','dd-MON-yyyy')), PARTITION p_DEC_2000 VALUES LESS THAN (TO_DATE('01-JAN-2001','dd-MON-yyyy'))) PARALLEL ; CREATE TABLE order_items ( order_id NUMBER(12) CONSTRAINT oitems_order_id_nn NOT NULL, line_item_id NUMBER(3) CONSTRAINT oitems_line_item_id_nn NOT NULL, product_id NUMBER(6) CONSTRAINT oitems_product_id_nn NOT NULL, unit_price NUMBER(8) CONSTRAINT oitems_unit_price_nn NOT NULL, quantity NUMBER(8,2) CONSTRAINT oitems_quantity_nn NOT NULL, sales_amount NUMBER(12,2) CONSTRAINT oitems_sales_amount_nn NOT NULL, CONSTRAINT order_items_orders_fk FOREIGN KEY (order_id) REFERENCES orders(order_id)) PARTITION BY REFERENCE (order_items_orders_fk) PARALLEL ;

1.13.3 系统分区

Oracle 引入了系统分区选项以手工控制表中的行驻留在哪些分区。这提供了一个额外的选项 使得用户可以完全控制数据存放的分区。创建本地索引会自动根据表的分区对索引进行分区。当 插入数据时,您必须告诉 Oracle 要具体存放到哪个分区。如果不指定一个分区,就会收到一个错 误(ORA-14701:partition-extended name or bind variable must be used for DMLs on tables partitioned by the System method)。 当更新或删除分区中存储的数据时,语句中不必提供指明具体的分区。但要记住,系统分区 没有分区边界的概念,所以当执行一条语句时,除非显式指定了分区,否则 Oracle 不得不扫描所 有分区以查看操作的数据位于哪个分区。如果不小心,就会出现一团糟!下面是创建一个系统分 区表,插入、删除数据并在上面创建一个索引的例子。

create table sales (sales_id number, product_code number, state_code number) partition by system (partition p1 tablespace users, partition p2 tablespace users);

26 Oracle Database 11gR2 性能调整与优化

create index in_sales_state on sales (state_code) local; insert into sales partition (p1) values (1,101,1); delete sales partition (p1) where state_code = 1;

1.13.4 虚拟列分区

Oracle Database 11g 引入了虚拟列分区。这个功能非常强大,因为它扩展了分区表中存在的 物理列。虚拟列看起来像一个普通列,允许在分区键上使用一个或多个物理列的表达式。因此, 存储新的虚拟列信息作为元数据并组合成了“虚拟列”。举例来说,如果表中有一个列 MONTHLY_SALARY,您可以添加一个虚拟列,使该列乘以 12(代表年薪);虚拟列实际不存储数 据(虽然在虚拟列上创建物理索引,但是它实际是一个基于函数的索引)。此外,虚拟列分区支持 所有基本的分区策略。因此,虚拟列可以使用范围、列表和哈希方式进行分区。 在下面的例子中,所有账户号码的前两个数字代表银行的分行。比方说,我想根据分行进行 分区,使用虚拟列分区,这很容易就做到。

CREATE TABLE accounts (acc_no number(10) not null, acc_name varchar2(50) not null, acc_branch number(2) generated always as (to_number(substr(to_char(acc_no),1,2)))) partition by list (acc_branch) (partition main_branch values (1), partition NY_branch values(2), partition chicago_branch values (4), partition miami_branch values (11));

1.13.5 分区顾问

Oracle Database 11g 推出了分区顾问,它作为 SQL 访问顾问的一部分。Oracle 11g 的分区顾问 生成关于分区的建议。分区顾问协助生成分区建议,这些建议可以显示在实施后的预期性能收益。 它还生成一个实施分区建议的脚本,这个脚本可以使用 SQL*Plus 手动执行或者使用 Oracle 企业 管理器来执行(Oracle 企业管理器在第 5 章介绍)。

1.14 只读表

在 Oracle Database 11g 之前,整个表空间可以设置为只读,这意味着所有需要设成只读的表 组合必须放到一个共同的表空间或一组表空间,或者必须创建一个可以产生错误的触发器以防止 数据被插入。Oracle Database 11g 允许您设置单个表只读,而不影响表空间中的其他表,这有助于 节省为使用只读表而把表移动到只读表空间的开销。您不仅可以更改表为只读,还可以在需要插 入和更新它时改变为允许读写。把表设置为只读将阻止所有表上的 DML 操作(截断/插入/更新/删 除等),也会阻止有些 DDL 操作,比如 ALTER TABLE 添加/修改/重命名/删除列、ALTER TABLE 删除/截断/交换(子)分区、ALTER TABLE 升级(关于所有限制请参阅 Oracle 文档)。一 些 DDL 操作 依然可以在只读表上执行,比如 DROP TABLE、ALTER TABLE 以添加/合并/修改/移动/重命名/

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 27

分割(子)分区、ALTER TABLE 以重命名/移动/添加补充日志/删除补充日志/释放未使用的空间。 表 DBA_TABLES、USER_TABLES 和 ALL_TABLES 中增加了一个新列 READ_ONLY 用于 确定表是否只读。如果表只读,那么这列的值为 YES,否则为 NO。目前 Oracle 还不支持表的分 区只读。为了使一个表分区只读,分区必须被移到一个可以被标记为只读的表空间。 把表修改为只读状态:

alter table big_emp2 read only ;

把表修改为读写状态:

alter table big_emp2 read write ;

1.15 RAC One Node 和 RAC Patching

RAC One Node 表示 Oracle RAC 数据库只运行在一个活动的 Oracle 实例上,并且如同 Oracle RAC 数据库一样,可以使用服务器控制工具(Server Control Utility,SRVCTL)来管理。您可以添加 节点用作容错转移(Failover),但在把 Oracle RAC One Node 转成 Oracle RAC 之前,不能添加其他 的实例。您可以在任何时间使用 DBCA(Database Configuration Assistant)把单实例数据库转换为 RAC One Node 或 RAC。RAC One Node 数据库通过容错转移保障高可用性(HA)。Oracle 使用工 具 SRVCTL 进行数据库迁移,它可以完成在线迁移数据库实例和连接到其他可用的群集节点上, 请在使用之前参阅完整的文档。此外,如果一个节点超负荷运行,可以使用下面列出的简单迁移 命令将数据库迁移到集群中的另一个节点(rac10 是这个数据库的唯一名称,node17 是目标节点, 使用之前请参考文档并进行充分测试):

srvctl relocate database -d rac10 -n node17

请注意一个 RAC One Node 的使用案例。比方说,将许多中小型数据库整合到几台(N 台)服 务器上:这些数据库可能运行着关键任务,它们都很小并可以轻松地在单个节点上运行,因此它 们并不需要 RAC 的可扩展性,但它们确实需要 RAC 提供的高可用性和灵活性。您可以创建一个 N 或 N+1 个节点的集群,然后可以在集群上创建您所需要个数的单节点 RAC 数据库(在这个例子 上是 N 个)。您还可以使用 11.2 提供的新特性 Instance Caging,限制每台数据库服务器上可以使用 的内核数量。下面是一些使用 RAC One Node 的用户案例: ● 容错转移:如果一台服务器出现故障,使用集群容错转移切换到集群中的空闲服务器(您 的第 N+1 台或一台额外的服务器),此服务器就像备用磁盘一样,不过是一个备用节点 罢了。 ● 在线迁移:如果服务器需要维护,可以在高峰使用时间段临时在 RAC 数据库上添加第 二个节点。在保持应用程序运行的同时,将用户通过标准的负载均衡方法转移到第二个 节点,然后关闭(事务级)第一个节点以移走剩下的用户。接着执行维护工作,如果需要 的话,执行相反的过程,将用户移回到第一个节点。 ● 滚动升级:如果想升级您的数据库软件,可以临时向 RAC 集群添加已经安装好新版本 数据库软件的第二个节点。然后使用在线迁移把用户移动到第二个节点并且使用 RAC 的滚动升级来升级第一个节点。如果需要,再把用户移回到第一个节点。

28 Oracle Database 11gR2 性能调整与优化

● 向外扩展:如果您的数据库负载增长超出一台服务器的处理能力,添加一个节点,然后 使用整个 RAC 运行负载(当然,当且仅当这个时候,您必须获得 RAC 授权)。 在应用方面,11gR2 版本有一个新的特性,称为基于版本的重新定义(Edition-based Redefinition)。 这是一个强大的特性,它使开发人员能够实现在线升级他们的应用程序(比如 Siebel 8.0 至 8.1 的 升级)。Oracle 使用应用程序的内部版本(对于开发者),一旦开发者认为万事俱备,就可以发布。 关于这个特性的更多新信息请参考文档,但在可用性方面,二者都不得了! 最后要提到的是,Oracle Database 11gR2 RAC 已得到改进,可以实现零宕机打补丁,即不关 闭集群就可以给 Oracle 集群件和 Oracle RAC 打补丁。这种改进大大提高了数据库的整体可用性, 并使关键的数据库环境保持最新。

1.16 真正应用测试(Real Application Testing,RAT)

真正应用测试(利用数据库捕获(Capture)/回放(Replay)的功能)是 Oracle Database 11g 推出的一 个可选功能,它为改变、发布和性能管理提供了有力保障。真正应用测试允许 DBA 利用真正的 工作负载来判断一个应用程序变更或新版本对数据库环境的影响。此功能可以彻底地预测因为操 作系统、应用程序、数据库更改带来的影响,而不会出现以前由于系统更改而触发的意外性能影 响,包括不可预期错误、软件缺陷和软件升级。

数据库重放(Database Replay)

Oracle Database 11g 引入了迄今为止可能对任何数据库来说最显著改进的特性,就是数据库重 放(在第 9 章有完整的介绍和例子)。此特性在确保稳定性、可用性和可扩展性方面比任何其他工 具做了更多工作。数据库重放从生产系统捕获数据库的实际工作负载,然后拿到测试系统进行回 放,回放的过程就如同是发生在生产系统上一样(允许同步回放——语句的开始时间与在原始系统 上捕捉时一致并保持相同的提交顺序、异步回放以及尽可能的压缩操作,参考文档以了解所有可 以控制的变量)。它也允许应用程序和数据库的更改和升级,这样可以显著减少应用程序、数据库 升级时的性能问题和应用程序/数据库错误的测试量。 数据库重放功能捕获外部客户端发出的数据库请求,并将其存储到捕获文件。捕获文件是本 地文件系统上的二进制文件,存储在用户通过 Oracle 数据库目录对象指定的位置。有重要的一点 需要注意,工作负载可以来自 Oracle Database 11g 之前的版本(目前来说支持的最早版本是 9.2); 参考 MOS 文献 560977.1 以了解具体的细节。请牢记目前不支持以下工作负载:直接路径装载、 导入/导出、基于 OCI 的对象导航(ADT)和 REF 绑定、流(Stream)、不基于 PL/SQL 的 AQ、分布 式事务、远程描述/提交操作、闪回(Flashback)和共享服务器(Shared Server)。完成捕获后,“捕获 文件”可以转移到测试系统,并为重放做准备。准备“捕获文件”被称为处理工作负载,将捕获 的负载文件转换为重放文件。它会创建回放所必需的元数据,针对每个捕获的工作负载,转换过 程只需要进行一次。因为这个过程可能会消耗较多资源,所以 Oracle 不建议在生产系统上处理工 作负载。处理工作负载的时候,确保处理工作负载时使用的数据库版本跟将来要重放的数据库版 本相同。请参见第 9 章完整的例子和第 5 章以了解通过 Oracle 企业管理器加以执行的方法。

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 29

1.17 SQL 性能分析器(SQL Performance Analyzer,SPA)

Oracle Database 11g 的 SQL 性能分析器是一个卓有成效的工具,可以在查看 SQL 执行计划和 SQL 执行时统计信息变化带来的影响。详细内容参见第 9 章,第 5 章也介绍了如何在企业管理器 中使用它。使用 SPA 时,Oracle 会检查在变更前后的 SQL,然后显示比较结果并生成报告,报告 中详细介绍了改进方法、生成改进/退化的 SQL 列表以及改善退化 SQL 执行计划的建议。SPA 通 过在变更前捕获和分析 SQL 工作负载,然后在变更后执行同样的 SQL 来减少识别由于变更而产 生的 SQL 退化所花费的时间,其中 SQL 捕获、SQL 执行和 SQL 比较以识别退化 SQL 的过程都 是自动完成的。SPA 很好地集成了 SQL 优化器顾问和 SQL 计划管理(SQL Plan Management,也包 含在第 5 章的企业管理器部分)功能,其中 SQL 计划基线和 SQL 优化器顾问可以用来解决退化的 SQL。这个新功能可以很好地评估数据库初始化参数的变化、数据库补丁、数据库升级以及操作 系统和硬件上的变化对一组 SQL 语句的影响。 使用这个工具的基本步骤是捕获 SQL 工作负载到 SQL 优化集(SQL Tuning Set)。可以通过多 种方法创建 SQL 优化集:从游标缓存、AWR、现有的 SQL 优化集或用户和 DBA 提供的自定义 SQL。您还可以通过增量捕获的方式捕获 SQL 工作负载,增量捕捉每隔一段时间抓取游标缓存并 更新 SQL 优化集的工作负载数据,这个时间是可以配置的。增量捕捉收集指定一段时间内的数据, 只针对符合条件的 SQL 语句,如用户、服务、动作、模块等。Oracle 表示增量捕获的开销小于 1%,因此使用增量捕捉对数据库的整体性能不会有显著的负面影响。最后需要说明的是,SQL 优化集可以在数据库之间传输,因此在使用 SQL 性能分析器时,SQL 优化集可以在生产数据库 上捕获、导出,然后导入到测试数据库以进行诊断和优化。深入的例子,请参见第 5 章和第 9 章。

1.18 结果集缓存(Result Cache)

Oracle Database 11g 提供了一个新的、单独的共享内存池来存储查询结果,这个结果集缓存直 接从共享池分配并且单独维护。这是一个重要的改进性能和优化系统的新特性。结果集缓存可以 将查询的结果(例如,工资计算后的总和)缓存在内存中,显著改进将来需要多次执行和查询相同 结果的查询的性能。结果集缓存最适合的是静态数据表(如果数据发生变化,就必须重新计算一 次),即结果集缓存最适合不停返回同样结果的查询(最适合数据仓库和批量查询)。还有一个 RESULT_CACHE 提示,可以强制其使用(这里给出一个例子);第 7 章有更多的信息。下面的第 一个查询计算每个部门的薪水总和;第二个查询检查结果集缓存里面存储的内容:

select /*+ result_cache */ deptno, sum(sal) from scott.emp group by deptno; select * from v$result_cache_memory;

注意当使用 sysdba 登录数据库时,不能使用结果集缓存。

30 Oracle Database 11gR2 性能调整与优化

1.19 RMAN 的新特性

RMAN 有不少新特性,尽管 RMAN 跟优化关系不大(更快的 RMAN 当然更好,意味着有更 多时间干点别的),这里还是列举一些您可能感兴趣的新特性。

1.19.1 备份的优化

备份的优化随着 UNDO 的优化一起改善。现在的 RMAN 不再备份恢复不需要的 UNDO 表空 间,从而变得更快。由于多数 UNDO 表空间都被随后提交事务的 UNDO 数据填充,因此这是可 观的节省。此功能是不可配置的,因此不会受 CONFIGURE BACKUP OPTIMIZATION {ON | OFF} 命令影响。

1.19.2 长期备份处理的改进

Oracle Database 11g 中,RMAN 有能力长期保留备份(覆盖默认的保留策略)。使用 RMAN BACK 命令的 KEEP 选项创建一个全部包容的备份,就像一个归档备份;参见下面的一个简短 例子:

RMAN> BACKUP DATABASE KEEP UNTIL TIME "TO_DATE('31-DEC-2018','dd-mon-yyyy')" NOLOGS;

RMAN> BACKUP TABLESPACE users KEEP FOREVER NOLOGS; (note that RMAN catalog needs to be used with KEEP FOREVER)

1.19.3 并行备份巨大的数据文件

在 Oracle Database 11g 之前,RMAN 通过并行分配多个通道进行并行备份,每个通道成为一 个 RMAN 会话,但是每个通道一次最多只能备份一个数据文件,这意味着即使有多个通道,每 个数据文件也只能通过一个通道进行备份。在 Oracle Database 11g 的 RMAN 中,分配的通道可以 把一个数据文件分成块,也叫做片段(Section)。您可以指定每个段的大小:

RMAN> run { 2> allocate channel c1 type disk format ’/backup1/%U’; 3> allocate channel c2 type disk format ’/backup2/%U’; 4> backup 5> section size 50m 6> datafile 4; 7> }

RMAN 命令分派了两个通道并且并行地利用这两个通道对编号为 4 的数据文件进行备份。每 个通道从数据文件中取 50MB 大小的片段并行地进行备份。这使得备份较大文件的速度更快。当 通过这种方式备份时,备份中也会显示片段的信息。 下面是 4 号数据文件以片段方式备份的例子:

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 31

RMAN> list backup of datafile 4;

List of Backup Pieces for backup set 901 Copy #1 BP Key Pc# Status Piece Name ------2007 1 AVAILABLE /backup1/9dhk7os1_1_1 2008 2 AVAILABLE /backup2/9dhk7os1_1_1 2009 3 AVAILABLE /backup1/9dhk7os1_1_3 2009 3 AVAILABLE /backup2/9dhk7os1_1_4

1.19.4 更快的备份压缩(改进的压缩)

在 Oracle Database 10g 中,RMAN 压缩备份以节省网络带宽。虽然第三方压缩工具提供了比 RMAN 更快的替代品,但是 RMAN 10g 版本的压缩提供了一些第三方工具没有的特性,例如 RMAN 10g 在恢复数据文件时,并不需要先解压文件,这种方法在恢复的时候显著节省了大量带 宽。在 Oracle Database 11g 中,除了之前提供的 BZIP2 压缩方式,RMAN 还提供了另一种算法 ZLIB。ZLIB 是一个更快的算法,但它的压缩比不高,然而它几乎不怎么消耗 CPU 资源。因此, 如果需要降低 CPU 的使用,ZLIB 压缩为您提供一个消耗较低 CPU 的选择。

注意 版本 11.1.x 中默认是 BZIP2,如果您想使用新的 ZLIB 压缩,就需要购买高级压缩选件。

使用 ZLIB 压缩,设置 RMAN 配置参数:

RMAN> configure compression algorithm 'ZLIB' ;

改变成 BZIP2:

RMAN> configure compression algorithm 'bzip2';

1.19.5 活动数据库复制(Active Database Duplication)

Oracle Database 11g 中增加了一个重要的功能,可以在不使用现有的 RMAN 备份或手动拷贝 文件的情况下复制数据库。如果您之前不使用 RMAN 备份,那么现在可以利用 RMAN 复制功能 创建备用数据库、测试环境或开发环境,而不必事先创建 RMAN 备份。此功能利用网络,所以 也被称为网络使能的数据库复制(Network-enabled Database Duplication)或活动数据库复制。 RMAN 活动数据库复制自动执行以下操作: ● 把 spfile 文件复制到目标服务器。 ● 利用 spfile 启动辅助实例。 ● 在网络上复制相关的数据库文件和归档重做日志到目标服务器。 ● 恢复数据库。 ● 使用 RESETLOGS 选项打开数据库。

RMAN> duplicate target database to newdb 2> from active database 3> db_file_name_convert '/nf/','/duptest/'

32 Oracle Database 11gR2 性能调整与优化

4> spfile 5> parameter_value_convert '/db/','/newdb/' 6> set log_file_name_convert '/db/','/newdb/' ;

1.19.6 更好的恢复目录管理

在 Oracle Database 11g 中,RMAN 可以更好地管理目录,可以把目录移动到另一个数据库或 通过导入目录的功能合并目录。 把一个目录移动到另一个目录/数据库:

$ sqlplus / as sysdba SQL> CREATE USER rman2 IDENTIFIED BY rman2 QUOTA UNLIMITED ON rman_ts; SQL> GRANT RECOVERY_CATALOG_OWNER TO rman2; SQL> EXIT; $ rman catalog=rman2/rman2 RMAN> CREATE CATALOG; RMAN> IMPORT CATALOG rmandb11g;

从另一个目录合并数据库目录数据(下面展示两个单独的例子):

RMAN> IMPORT CATALOG rman@db11g DBID=1423241 ; RMAN> IMPORT CATALOG rman@db11g DB_NAME=prod3 ;

1.19.7 增强的归档日志删除策略

Oracle Database 11g 通过改进归档日志的删除策略提高了 RMAN 管理归档日志的能力。增强 策略的目的是增强数据卫士(备用端)的灵活性和数据的保护。仔细看看下面 Oracle 10g/11g 的选项: 在 Oracle 10g 中:

CONFIGURE ARCHIVELOG DELETION POLICY {CLEAR | TO {APPLIED ON STANDBY | NONE}}

在 Oracle 11g 中:

CONFIGURE ARCHIVELOG DELETION POLICY {CLEAR | TO {APPLIED ON [ALL] STANDBY | BACKED UP integer TIMES TO DEVICE TYPE deviceSpecifier | NONE | SHIPPED TO [ALL] STANDBY} [ {APPLIED ON [ALL] STANDBY | BACKED UP integer TIMES TO DEVICE TYPE deviceSpecifier | NONE | SHIPPED TO [ALL] STANDBY}]...}

此外,在 Oracle Database 11.1 中,RMAN 归档日志的删除也得到改善,以确保只有在没有组 件(比如数据卫士、流和闪回)需要时,归档日志才会被删除。

1.19.8 数据恢复顾问(Data Recovery Advisor)

数据恢复顾问有助于简化恢复,并允许 DBA 检查失败项,获得更多的细节和修复建议,以 及执行修复建议。数据恢复顾问有两种形式:命令行和 Oracle 企业管理器数据库控制器。数据恢 复顾问简化了数据库失败时通过 RMAN 进行介质恢复所需要的诊断、分析和恢复步骤。但是请 记住,如果您不是使用 RMAN 进行备份,此功能将不适用。

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 33

数据恢复顾问命令行工具是通过 RMAN 的命令行来工作的。当需要恢复操作时,您可以列 出故障项(LIST FAILURE)及其细节(LIST FAILURE DETAIL),获取排除故障的建议, 预览故障修复操作(REPAIR FAILURE PREVIEW),然后实际执行数据修复(REPAIR FAILURE)。 请注意下面启动时遇到的错误和 RMAN 中这些改进的功能。

ORACLE instance started. Total System Global Area 535662592 bytes Fixed Size 001334380 bytes Variable Size 209716116 bytes Database Buffers 318767104 bytes Redo Buffers 005844992 bytes Database mounted. ORA-01157: cannot identify/lock data file 4 -see DBWR trace file ORA-01110: data file 4: 'C:\ORACLE\ORADATA\ORCL11G\USERS01.DBF'

RMAN> list failure ; using target database control file instead of recovery catalog List of Database Failures ======

Failure ID Priority Status Time Detected Summary ------222 HIGH OPEN 27-NOV-10 One or more non-system datafiles are missing

RMAN> list failure 222 detail ; List of Database Failures ======

Failure ID Priority Status Time Detected Summary ------222 HIGH OPEN 27-NOV-10 One or more non-system datafiles are missing Impact: See impact for individual child failures List of child failures for parent failure ID 222 Failure ID Priority Status Time Detected Summary ------225 HIGH OPEN 27-NOV-10 Datafile 4: 'C:\ORACLE\ORADATA\ORC L11G\USERS01.DBF' is missing Impact: Some objects in tablespace USERS might be unavailable

RMAN> advise failure ; List of Database Failures ======

Failure ID Priority Status Time Detected Summary ------222 HIGH OPEN 27-NOV-10 One or more non-system datafiles are missing Impact: See impact for individual child failures

34 Oracle Database 11gR2 性能调整与优化

List of child failures for parent failure ID 222

Failure ID Priority Status Time Detected Summary ------225 HIGH OPEN 27-NOV-10 Datafile 4: 'C:\ORACLE\ORADATA\ORC L11G\USERS01.DBF' is missing Impact: Some objects in tablespace USERS might be unavailable

analyzing automatic repair options; this may take some time allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=152 device type=DISK analyzing automatic repair options complete

Mandatory Manual Actions ======no manual actions available

Optional Manual Actions ======1.If file C:\ORACLE\ORADATA\ORCL11G\USERS01.DBF was unintentionally renamed or moved,restoreit

Automated Repair Options ======Option Repair Description ------1 Restore and recover datafile 4 Strategy: The repair includes complete media recovery with no data loss Repair script: c:\oracle\diag\rdbms\orcl11g\orcl11g\hm\reco_1022222764.hm

RMAN> repair failure preview; Strategy: The repair includes complete media recovery with no data loss Repair script: c:\oracle\diag\rdbms\orcl11g\orcl11g\hm\reco_1022222764.hm

contents of repair script: # restore and recover datafile restore datafile 4; recover datafile 4;

RMAN> repair failure; Strategy: The repair includes complete media recovery with no data loss Repair script: c:\oracle\diag\rdbms\orcl11g\orcl11g\hm\reco_1022222764.hm

contents of repair script: # restore and recover datafile restore datafile 4; recover datafile 4;

Do you really want to execute the above repair (enter YES or NO)? YES executing repair script

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 35

Starting restore at 27-NOV-10 using channel ORA_DISK_1

channel ORA_DISK_1: starting datafile backup set restore channel ORA_DISK_1: specifying datafile(s) to restore from backup set channel ORA_DISK_1: restoring datafile 00004 to C:\ORACLE\ORADATA\ORCL11G\USERS0 1.DBF channel ORA_DISK_1: reading from backup piece C:\ORACLE\FLASH_RECOVERY_AREA\ORCL 11G\BACKUPSET\2010_11_27\O1_MF_NNNDF_TAG20101127T144712_3NRX264W_.BKP channel ORA_DISK_1: piece handle=C:\ORACLE\FLASH_RECOVERY_AREA\ORCL11G\BACKUPSET \2010_11_27\O1_MF_NNNDF_TAG20101127T144712_3NRX264W_.BKP tag=TAG20101127T144712 channel ORA_DISK_1: restored backup piece 1 channel ORA_DISK_1: restore complete, elapsed time: 00:00:25 Finished restore at 27-NOV-10 Starting recover at 27-NOV-10 using channel ORA_DISK_1

starting media recovery media recovery complete, elapsed time: 00:00:01

Finished recover at 27-NOV-10 repair failure complete

1.19.9 虚拟专用目录

Oracle Database 11g 通过在 RMAN 主目录中启用多个虚拟目录的方法增强了 RMAN 目录的 安全性,主目录的所有者授权其他用户访问每个数据库。这允许在数据库间隔离或者在 RMAN 目录内部对数据库进行分组。设立和使用虚拟专用目录相当简单明了,这里列出要点:

SQL> CREATE USER vpc1 IDENTIFIED BY vpc_a QUOTA UNLIMITED ON users; SQL> GRANT RECOVERY_CATALOG_OWNER TO vpc1 ;

在 RMAN 上赋予相关的数据库权限给虚拟专用目录用户:

$ rman RMAN> CONNECT CATALOG rman/rman@rman ; RMAN> GRANT CATALOG FOR DATABASE db11g TO vpc1; Grant succeeded.

使用虚拟专用目录用户登录 RMAN 并且执行 CREATE VIRTUAL CATALOG 命令:

$ rman RMAN> CONNECT CATALOG vpc1/vpc_a@rman ; RMAN> CREATE VIRTUAL CATALOG;

如果要在 Oracle Database 11g 之前的版本中使用虚拟目录,通过 SQL*Plus 以虚拟目录所有者 身份登录到恢复目录数据库,然后执行 DBMS_RCVCAT 程序包中的 CREATE_VIRTUAL_ CATALOG 存储过程,下面的 rman 代表 RMAN 数据库中的基础目录所有者的用户名:

SQL> CONN vpc1/vpc_a@rman

36 Oracle Database 11gR2 性能调整与优化

SQL> EXEC rman.DBMS_RCVCAT.CREATE_VIRTUAL_CATALOG;

您可以使用虚拟专用目录所有者连接到虚拟专用目录,而不是使用用主目录所有者(正常使用 RMAN,就像需要一个 RMAN 目录一样)。 从 RMAN 执行:

RMAN> CONNECT CATALOG vpc1/vpc_a@rman ;

从操作系统执行:

$ rman target / catalog vpc1/vpc_a@rman

1.19.10 主动的健康检查

Oracle Database 11g 增强了 RMAN 并提供主动检查数据库坏块的能力。这个检查可以针对整 个数据库、表空间、指定的数据文件或数据文件的指定块。DBA 因此有能力通过预定的流程定期 检查数据库是否损坏,或者当他/她怀疑可能存在损坏的时候检查数据库中的一部分。健康检查报 告检查的每个数据库上块的数量、空块的数量和坏块的数量。

RMAN> validate database ; RMAN> validate tablespace users ; RMAN> validate datafile 4 block 1 ;

这里是一些示例输出:

Starting validate at 27-NOV-10 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=128 device type=DISK channel ORA_DISK_1: starting validation of datafile channel ORA_DISK_1: specifying datafile(s) for validation input datafile file number=00004 name=C:\ORACLE\ORADATA\ORCL11G\USERS01.DBF channel ORA_DISK_1: validation complete, elapsed time: 00:00:15

List of Datafiles ======File Status Marked Corrupt Empty Blocks Blocks Examined High SCN ------4 OK 0 51199 64000 13457224 File Name: C:\ORACLE\ORADATA\ORCL11G\USERS01.DBF Block Type Blocks Failing Blocks Processed ------Data 0 12357 Index 0 33 Other 0 411

Finished validate at 27-NOV-10

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 37

1.19.11 块恢复(闪回日志)

闪回日志是在 Oracle 10g 中引入的,它在闪回日志中记录了数据块改变之前的映像,这些日 志是在数据库的闪回启用时在快速恢复区(Fast Recovery Area,FRA)中生成的。闪回日志可以帮助 您闪回数据库,从而恢复到以前的时间点,而无需从备份中做时间点恢复。 既然闪回日志有数据块的过去映像,为什么不能使用它们做块级恢复呢?Oracle Database 11g 恰好实现这个功能。当恢复特定的块(或一些块)时,Oracle 现在在闪回日志中寻找一个好的过去 块映像的副本,然后应用归档的重做日志向前滚动块。这样可以节省很多时间,因为您不再需要 去寻找备份,特别是当备份在磁带上的时候。

1.19.12 块恢复(物理备用)

自动块恢复得到增强,当物理备用数据库可用的时候,您可以使用物理备用数据库进行数据 块恢复。

1.20 安全文件

Oracle 安全文件也称为快速文件(Fast File),是 Oracle 对大对象(LOB)类型存储的改善。安全 文件对大对象操作的性能和文件系统相当,大对象能存储很多种数据类型,比如图像、大量的文 字、Word 文档、Excel 电子表格、XML、HTML 以及 DICOM 格式的医学图像。 安全文件是 Oracle 数据库在管理非结构化数据方面迈出的又一步,不仅提高性能,而且还提 高了安全性。安全文件支持对大对象数据类型的透明数据加密,这不仅使得存储和管理非结构化 数据更容易,而且还提高了非结构化数据的安全。安全文件中还提供了先进的文件系统功能,如 压缩和重复数据删除,并且 100%向后与大对象接口兼容。重复数据删除是当有重复的大对象绑 定在数据库中的多条记录时,这个对象只存储一次,而不是每条记录存储一次。这不仅节省了存 储空间,而且还提供了性能改进。这种透明的大对象数据压缩,已经节省了存储空间和潜在地提 高了性能,Oracle 在此基础上更近一步,能自动确定数据是否可以压缩,如果可以压缩,从压缩 中节省空间是否有益。 默认情况下,正常的大对象存储使用基本文件。为了使用安全文件存储大对象,必须使用存 储关键字 SECUREFILE LOB。安全文件使用的默认行为可以通过初始化参数 DB_SECUREFILE 来控制。

db_securefile={ALWAYS | FORCE | PERMITTED | NEVER | IGNORE}

ALWAYS – Always attempts to create all LOBs as SECUREFILE LOBs FORCE - all LOBs created in the system will be created as SECUREFILE LOBs. PERMITTED – Allows LOBs to be created as SecureFiles. NEVER – Never Allows LOBs that use SecureFiles, they will always be BASICFILE LOBs IGNORE – Ignore errors that otherwise would be raised by forcing LOBs as SECUREFILE LOBs and causes the SECUREFILE keyword and all SecureFile options to be ignored (careful!).

38 Oracle Database 11gR2 性能调整与优化

这个参数也可以通过 ALTER SYSTEM 参数动态设置:

SQL> ALTER SYSTEM SET db_securefile = 'ALWAYS' ;

安全文件相对于旧的大对象存储方法能提供很多好处,比如重复数据删除、压缩和加密。

1.20.1 压缩

压缩有两种形式:默认值 MEDIUM 或 HIGH。请记住这个高压缩级别需要消耗大量的数据 库资源。

CREATE TABLE t1 ( a CLOB) LOB(a) STORE AS SECUREFILE ( COMPRESS CACHE NOLOGGING);

CREATE TABLE t1 ( a CLOB) LOB(a) STORE AS SECUREFILE ( COMPRESS HIGH CACHE NOLOGGING);

1.20.2 加密

安全文件的加密是通过透明数据加密(Transparent Data Encryption,TDE)来实现的,并且安全 文件支持对大对象数据类型的透明数据加密。加密在数据块级进行并且支持下面的有效加密级 别:2DES168、AES128、AES192(默认)和 AES256。记住,安全文件不支持 NO SALT 选项。

CREATE TABLE t1 ( a CLOB ENCRYPT USING ’AES128’) LOB(a) STORE AS SECUREFILE ( CACHE);

1.20.3 重复数据删除

重复数据删除技术是一个强大的功能,因为可以减少 LOB 所需的存储空间,所有重复的 LOB 对象只存储一次。如果需要减少数据库占用的磁盘空间,安全文件压缩和重复数据删除技术可以 显著节约空间开销。

CREATE TABLE t1 ( REGION VARCHAR2(20), ID NUMBER, a BLOB) LOB(a) STORE AS SECUREFILE ( DEDUPLICATE CACHE);

CREATE TABLE t1 ( a CLOB) LOB(a) STORE AS SECUREFILE ( COMPRESS HIGH

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 39

DEDUPLICATE CACHE);

Oracle 安全文件以 IO 共享池的形式使用内存。IO 共享池从 SGA 中分配并且总是为特定的会 话服务,因此数据是针对特定会话的。您可以通过查询 V$SGAINFO 和 V$SGA_DYNAMIC_ COMPONENTS 视图(详细的 V$视图信息,请参阅第 12 章)来查看 IO 共享池。如果检查 SGA 的 内存结构,您可以看到 IO 共享池的最大大小和其他数据库的内存结构的关系:

select name, bytes from v$sgainfo ;

NAME BYTES ------Fixed SGA Size 1334380 Redo Buffers 5844992 Buffer Cache Size 268435456 Shared Pool Size 239075328 Large Pool Size 4194304 Java Pool Size 12582912 Streams Pool Size 4194304 Shared IO Pool Size 0 Granule Size 4194304 Maximum SGA Size 535662592 Startup overhead in Shared Pool 46137344 Free SGA Memory Available 0

select * from v$sga_dynamic_components where component='Shared IO Pool'; COMPONENT CURRENT_SIZE ------MIN_SIZE MAX_SIZE USER_SPECIFIED_SIZE OPER_COUNT LAST_OPER_TYP LAST_OPER ------LAST_OPER GRANULE_SIZE ------Shared IO Pool 0 0 0 0 0 STATIC 4194304

当一个会话无法在 IO 共享池中找到足够的空闲内存时,PGA 内存就会被使用。要查询 PGA 的内存分配,您可以查看视图 V$SECUREFILE_TIMER,每当从 PGA 分配内存的时候,它都会 记录下来。

select * from v$securefile_timer where name like '%PGA%';

NAME LAYER_ID OWNTIME MAXTIME MINTIME INVOCATIONS LAYER_NAME ------kdlw kcbi PGA alloc timer 2 0 0 0 0

40 Oracle Database 11gR2 性能调整与优化

Write gather cache kdlw kcbi PGA free timer 2 0 0 0 0 Write gather cache kdlw kcb PGA borrow timer 2 0 0 0 0 Write gather cache kdlw kcb PGA free timer 2 0 0 0 0 Write gather cache

1.21 流(GoldenGate 是流的未来)的增强

Oracle Database 11gR2 引入了 Oracle 扩展流(XStreams),它为应用程序提供的 API 能够发送和 接收 Oracle 数据库和非 Oracle 数据源之间的数据更改。这使得 Oracle 和非基于 Oracle 的应用程 序之间可以共享数据和数据变化。XStreams 支持 Oracle 数据流的所有数据类型和功能,使得数据 共享的过程更加有效。Oracle XStream 包含两个主要组件,用来处理 Oracle 和非 Oracle 应用之间 的数据发送和接收,分别是 XStream In 和 XStream Out。 1.21.1 XStream In

XStream In 的主要目的是为非 Oracle 客户应用程序提供一个到 Oracle 流的高性能、基于事务 的接口。它允许非 Oracle 的客户端向 Oracle 发送数据,使用 OCI 或 Java 接口与非 Oracle 数据库 或文件系统进行信息交换。 1.21.2 XStream Out

XStream Out 的主要目的是从 Oracle 数据库重做日志中提取事务,并将它们发送到非 Oracle 的客户端应用程序,使用的是 OCI 或 Java 接口,并作为非 Oracle 数据源的接口。

1.21.3 流支持高级压缩(11gR2)

Oracle Database 11gR1 引入了高级压缩,但是高级压缩的对象不能是流或逻辑备用数据库。 在 11gR2 中,高级压缩支持流和逻辑备用数据库。

1.22 临时表空间的收缩

Oracle Database 11g 增加了收缩本地管理的临时表空间的能力。这无须重建临时表空间,就可 以减少增长的过大临时表空间。 下面的例子将临时表空间缩小到 20MB:

ALTER TABLESPACE temp SHRINK SPACE KEEP 20M;

下面的例子缩小临时表空间中的临时文件 temp01.dbf,因为忽略了 KEEP 语句,数据库会尽 可能小地缩小临时文件。

ALTER TABLESPACE temp SHRINK TEMPFILE 'c:\oracle\oradata\db\temp01.dbf';

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 41

1.23 透明数据加密(TDE)的改进

Oracle Database 11g 中的透明数据加密(Oracle 高级安全选件的一部分)可以支持加密表空间。 您可以透明加密指定表空间中的全部对象和这些对象的全部列。这简化了加密,允许在表空间级 别设置加密,从而为大量的表和列加密,而不用一个一个地为它们加密。 Oracle Database 11g 还通过硬件安全模块(Hardware Security Module,HSM)增加了基于硬件的 主密钥保护,透明数据加密的主键可以存储在外部的硬件安全模块中,而不是使用一个钱包(Wallet) 文件,从而使其更加安全。希望透明数据加密主密钥更加安全的客户可以使用这个功能,他们对 主密钥存储在操作系统的钱包文件中有所担心。

SQL> CREATE TABLESPACE encrypted_ts DATAFILE 'c:\oracle\oradata\DB\encrypted_ts01.dbf' SIZE 128K ENCRYPTION USING 'AES256' DEFAULT STORAGE(ENCRYPT);

1.24 11g 新的后台进程

根据 Oracle 的文档,Oracle Database 11g 中新增加了 56 个后台进程。以下是重要和值得注意 的新后台进程以及在 11g 中得到改进的过程: ● ACMS(Atomic Control file to Memory Server):内存服务器进程中的原子控制文件, Oracle RAC 进程用来确保 SGA 内存中的更新应用到所有节点或不应用。 ● DBRM(Database Resource Manager):数据库资源管理器进程处理资源计划的设置和 相关的数据库资源管理器任务,负责资源计划的管理和执行。 ● DIAG[0-9]:这些进程负责检测挂起和解决死锁。 ● DIAG:这不完全是一个新进程,但是其职责改变了一些。在 11g 之前,在 RAC 环境中 就有这个诊断进程。现在在 11g 中,它管理自动诊断信息库(ADR),检测实例的健康情 况并捕捉和处理实例失败信息。 ● EMNC(Event Monitor Coordinator):事件监视协调员进程处理数据库中的事件和通知。 当一个针对实例的通知首次发出的时候,事件监视器会自动启动响应。 ● FBDA(Flashback Data Archiver):闪回数据归档进程,这个进程管理闪回数据归档,这 是通过存储跟踪表行的以前镜像和跟踪这些行在闪回数据库归档中的元数据来完成的。 ● GTX[0-j](Global Transaction):全局事务进程在 Oracle RAC 环境中处理 XA 全局事务。 进程的数目取决于目前的工作负载。 ● KATE:此进程当 ASM 磁盘脱机的时候,执行到 ASM 元数据的代理 I/O。 ● MARK:这个进程当发生失败或丢失写操作时,将 ASM 分配单元标注为过时的。 ● PING:在 RAC 环境中,这个进程侧重于衡量节点间网络的延迟;它获得 RAC 集群中 每对实例间的访问延迟。 ● RCBG(Result Cache BackGround):结果集缓存后台进程,这个进程管理新引入的查询 结果集缓存。 ● SMCO(Space Management COordinator):空间管理协调员进程,此进程协调和执行空 间管理有关的任务。这一进程将启动 Wnnn 进程来实际执行任务。

42 Oracle Database 11gR2 性能调整与优化

● VKTM(Virtual Keeper of Time Management):虚拟时间管理进程保持对标准时间的跟 踪。这个进程作为一个时间参考计数器使用。

注意 EMN0 后台进程在 11g 中已被删除,因为它在 10g 后台进程列表中,但是不再出现在 11g 的 进程列表中。

在 Oracle 10g 中有一些新的重要后台进程,值得在这里提一下: ● ARBx:这些进程通过 RBAL 进程来管理,用来平衡由 ASM 控制的磁盘资源(平衡磁盘 组内部的数据区)。ARBx 进程的数量直接通过参数 ASM_POWER_LIMIT 来控制。 ● ASMB:ASMB 进程向群集同步服务(Cluster Synchronization Services,CSS)提供信息和 从其获得信息,ASM 用这些信息来管理磁盘资源。它也可以用来更新统计信息和提供心 跳机制。 ● CTWR(Change Tracking Writer):更改跟踪写进程用来同 10g 中的新特性——块更改跟 踪(Block Change Tracking)协同工作,从而处理快速 RMAN 增量备份。 ● M000:这些是 MMON 后台的从属(m000)进程。 ● MMNL(Manageability Monitor Light):管理性监控灯是一个与 AWR 一共工作的进程, 在需要的时候把全部的统计数据从缓冲区写到磁盘。 ● MMON(Memory Monitor):与 AWR 相关的内存监视进程,用于自动问题检测和自我优 化。管理监控进程(Manageability Monitor)在预定的周期输出 AWR 所需要的统计信息。 ● RBAL(Rebalancing Daemon):ASM 相关的再平衡守护进程,用于由 ASM 控制的磁盘 信息的再平衡。 ● RVWR(Recovery Writer):恢复写进程支持闪回数据库,负责把存储数据块的以前镜像 写到闪回日志。

1.25 版本对照表

下面的表 1-3 显示了在各种 Oracle 11g 版本中哪些组件或选件可用。请注意,Oracle 也有一 个免费的版本,这就是 Oracle 11g Express Edition。该版本最大支持 4GB 的数据库,1 个 CPU 和 1GB 内存(随时可能变更)。请与 Oracle 一同验证这些特性,因为这些随时都可能变更。如果负担 得起,您一定要用企业版!这个表显示了对于给定版本的可用特性,但记住,有些选件需要额 外成本(比如 RAC、Oracle 性能优化包、高级压缩等)。与您的销售人员咨询定价和许可,并参考 http://www.oracle.com/us/products/database/index.html 以了解最新的信息。

表 1-3 版本对照表

选件或特性 11g标准版 111g 标准版 11g 企业版 11g 个人版 高级安全(Advanced security) N N Y N 高级压缩(Advanced compression) N N Y N 数据库审计(Database Vault) N N Y N Change Mgt Pack N N Y N 数据挖掘(Data mining) N N Y N

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 43

(续表)

选件或特性 11g标准版 111g 标准版 11g 企业版 11g 个人版 诊断包(Diagnostic Pack) N N Y N Label Security N N Y N Oracle OLAP N N Y N 分区(Partitioning) N N Y N Oracle RAC N Y Y N Oracle RAC One Node N N Y N Oracle Spatial N N Y N 真正应用测试(Real Application Testing) N N Y N 全面回忆(Total Recall) N N Y N 活动数据卫士(Active Data Guard) N N Y N In-Memory Database Cache N N Y N 优化包(Tuning Pack) N N Y N CM Pack N N Y N 数据库资源管理器(DB Resource Manager) N N Y N 数据压缩(Data compression) N N Y N OLTP 压缩(高级压缩选件) OLTP compression(advanced N N Y N VLDB compression option)

,数据仓库 位图索引(Bitmapped index) N N Y N 导出可传输表空间(Export transp ts) N N Y N 导入可传输表空间(Import transp ts) Y Y Y Y (Data Warehousing) Async change data capture N N Y N Summary Management N N Y N 分析函数(Analytic Functions) Y Y Y Y 自动并行查询(Automated parallel query) N N Y N

,商业智能 降序索引(Descending indexes) Y Y Y Y 直接路径加载 API(Direct Path Load API) Y Y Y Y 外部表 (Business Intelligence) (External tables) Y Y Y Y 函数索引(Function-based indexes) Y Y Y Y Long operations monitor Y Y Y Y 物化视图(Materialized views) Y Y Y Y MERGE Y Y Y Y 优化器统计信息管理(Optimizer stats mgt) Y Y Y Y Pipelined table functions Y Y Y Y

Sample scan Y Y Y Y

星形查询优化(Star query optimization) Y Y Y Y

44 Oracle Database 11gR2 性能调整与优化

(续表)

选件或特性 11g标准版 111g 标准版 11g 企业版 11g 个人版

并行查询(Parallel query) N N Y N

并行 DML(Parallel DML) N N Y N

并行建立索引(Parallel index build) N N Y N 并行操作 并行统计信息收集(Parallel stats gathering) N N Y N

并行数据导出和数据泵 (Parallel Operations) (Parallel Data N N Y N export and Data Pump)

Parallel text index creation N N Y N

并行备份恢复(Parallel backup & recovery) N N Y N

并行分析(Parallel analyze) N N Y N

Parallel bitmap star query N N Y N

并行索引扫描(Parallel index scans) N N Y N

并行加载(Parallel load) Y Y Y Y

Oracle 数据卫士(Oracle Data Guard) N N Y N

Integrated Clusterware Y Y Y N 高可用 Fast-start fault recovery N N Y N (High Availability) 在线操作(Online operations) N N Y N

备份和恢复(Backup and recovery) N N Y N

Oracle 闪回特性(表、数据库、事务和全 N N Y N 面回忆)

自动存储管理(Automatic Storage Y Y Y N Management,ASM)

内容管理 动态服务(Dynamic Services) Y Y Y Y Management) 多媒体(Multimedia) Y Y Y N (Content 工作区管理(Workspace Manager) Y Y Y Y

Oracle Text Y Y Y Y

XML DB Y Y Y Y (Information Integration) 信息集成 Oracle 流(Oracle Streams) N N Y Y

高级队列(Advanced Queuing) Y Y Y Y

Oracle 信息网关(Oracle Messaging Gateway) N N Y Y

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 45

(续表)

选件或特性 11g标准版 111g 标准版 11g 企业版 11g 个人版

数据库事件触发器(Database event triggers) Y Y Y Y

dbms_repair 程序包 Y Y Y Y

删除列(Drop column) Y Y Y Y

闪回查询(Flashback Query) Y Y Y Y

全局化(Globalization) Y Y Y Y

数据库特性 索引合并(Index coalesce) N N Y N

不可视索引(Invisible index) Y Y Y Y

查询结果集缓存(Query result cache) Y Y Y Y (Database Features) 索引组织表(Index-organized tables) Y Y Y Y

Instead-of 触发器 Y Y Y Y

LOB(大对象)支持 Y Y Y Y

本地管理表空间(Locally managed tablespaces) Y Y Y Y

LogMiner Y Y Y Y

执行计划稳定性(Plan stability) Y Y Y Y

静默数据库(Quiesce database) N N Y N

反向键索引(Reverse key indexes) Y Y Y Y

SQL 计划管理(SQL Plan Management) N N Y N

临时表(Temporary tables) Y Y Y Y

AppWizard for Virt studio Y Y Y Y

原子事务(Autonomous transactions) Y Y Y Y

客户端查询缓存(Client Side Query Cache) N N Y N

COM cartridge Y Y Y Y

Java 支持(Java support) Y Y Y N

JDBC 驱动 Y Y Y Y 开发

(Development) MS Trans Server Y Y Y Y

Object/Relational Ext Y Y Y Y

PL/SQL 本地编译(PL/SQL native compilation) Y Y Y Y

PL/SQL 函数结果集缓存 N N Y N

触发器中的 PL/SQL 存储过程 Y Y Y Y (PL/SQL stored procedures in triggers)

PL/SQL 服务器嵌入(PL/SQL Server embedded) Y Y Y Y

SQL*Plus Y Y Y Y

用户定义聚合(User-defined aggregates) Y Y Y Y

XML Y Y Y Y

46 Oracle Database 11gR2 性能调整与优化

(续表)

选件或特性 11g标准版 111g 标准版 11g 企业版 11g 个人版

分布式 高级复制(Advanced replication) N N Y N

基本复制(Basic replication) (Distributed) Y Y Y Y

分布式查询(Distributed queries) Y Y Y Y

分布式事务(Distributed transactions) Y Y Y Y

异构服务(Heterogeneous services) Y Y Y Y

网络 连接器管理(Connection Manager) N N Y N

(Networking) 多协议(Multiprotocol) N N Y N

SDP for InfiniBand N N Y N

连接池(Connection pooling) Y Y Y Y

Oracle 网络服务(Oracle Net services) Y Y Y Y

基本备用数据库(Basic standby database) Y Y Y Y

全局索引维护-DDL(Global index maintenance-DDL) Y Y Y Y

Legato 存储管理器(Legato Storage Manager) Y Y Y Y

多种数据块大小(Multiple block size) Y Y Y Y 系统管理 在线备份恢复(Online backup & recovery) Y Y Y Y

标准管理包(Standard Management Pack) N N Y N (System Management) Oracle 企业管理器(Oracle Enterprise Manager) Y Y Y N

Oracle Fail Safe Y Y Y N

Oracle Managed Files Y Y Y N

恢复管理器(Recovery Manager) Y Y Y N

可重开始的空间分配(Resumable Space Allocation) Y Y Y Y

备用数据库 GUI(Standby database GUI) N N Y N

透明应用程序容错转移(Transparent Application Y Y Y Y Failover)

识别不使用的索引(Identify unused Index) Y Y Y Y

虚拟私有数据库(Virtual private database) N N Y N

安全性 细粒度审计(Fine-grained auditing) N N Y N

企业安全(Enterprise security) N N Y N (Security) N 层认证(N-tier authentication) N N Y N

密码管理(Password management) Y Y Y Y

加密工具包(Encryption Toolkit) Y Y Y Y

代理认证(Proxy authentication) Y Y Y N

第1章 11g R1 & R2 新特性介绍(针对 DBA 和开发者) 47

这还不是 Oracle Database 11g 中新特性的完整列表。总体而言,Oracle 在提供增强的功能、 大量自动化的管理任务和降低总成本方面取得重大进展。RAC 和网格计算现在是成熟的技术。 Oracle 结合自己的技术和工程优势,并集成它的 Exadata、Exalogic 和其他收购的硬件产品,正在 引导该技术的发展。

1.26 新特性回顾

● 使 Exadata 更快的因素:快速的硬件、充足的 CPU、高速闪存、数据库服务器和存储服 务器上的大量内存、压缩(性能提高 10 到 70 倍)、分区修剪(性能提高 10 到 100 倍)、存 储索引(性能提高 5 到 10 倍)、智能扫描(性能提高 4 到 10 倍)以及其他特性。 ● Exadata 是将 1TB 搜索转成 500MB 甚至 50MB 的最好方法。它快得冒烟! ● Oracle 的压缩功能将节省在磁盘空间上的投资,在许多情况下也提高性能。 ● 新的 ASM 存储限制是 40EB 字节(1 个 EB 是 100 万个 TB)!Oracle 数据库的限制是 8 EB。 ● Oracle 已经改进滚动补丁和升级。 ● ASM 的平衡操作在 11g 中更快。 ● 使用 Oracle 11g 快照备用数据库新特性,物理备用数据库现在可以暂时打开和用来进行 读/写活动,比如报表和负载测试等。 ● 使用 Oracle 11gR2,流和逻辑备用数据库也支持高级压缩。 ● Oracle 11gR2 通过增加滞后历史增强了活动数据卫士选件,滞后历史可以在视图 V$STANDBY_EVENT_HISTOGRAM 中查看。 ● 统计信息可以收集并置于 PENDING 状态,直到测试过为止。 ● Oracle 11g 中包含多列统计信息,可以顾及多列之间的关系。 ● Oracle 11g 中通过 DBMS_HM 程序包引入了一个免费的数据库健康监视器。 ● Oracle 11g 引入了一个特性,叫做不可视索引,允许对优化器隐藏索引而无须删掉它(索 引依旧被维护)。 ● Oracle 11g 通过区间分区、REF 分区、系统分区和虚拟列分区增强了分区功能。 ● Oracle 11g 允许单一的表只读而不影响表空间中的其他表。 ● 真正应用测试允许 DBA 利用实际的工作负载来判断应用更改或者发布对数据库环境带来 的影响。 ● Oracle 11g 提供了一个新的单独的共享内存池来存储查询结果。这个结果集缓存是直接 从共享池分配,但单独维护。除了在数据库或表级别设置外,还可以通过 RESULT_CACHE 提示指示查询使用缓存结果。 ● RMAN变得更快是因为不写UNDO 并且有更好的压缩。数据恢复顾问有助于简化RMAN 的恢复并允许 DBA 检查失败项,获得更多细节、维修意见以及实施建议的修复操作。还 有增强的目录以及提供主动的健康检查(针对损坏的数据块)。 ● Oracle 安全文件也称为快速文件,是 Oracle 对大对象类型(LOB)存储的改善。安全文件 对大对象操作的性能和文件系统相当,LOB 能存储很多种数据类型,比如图像、大量的 文字、Word 文档、Excel 电子表格、XML、HTML 以及 DICOM 格式的医学图像。 ● Oracle 11g 增加了收缩本地管理的临时表空间的能力。 ● Oracle 11gR2 与 Oracle Exadata 和 Exalogic 硬件设计在一起,显著提高了 Oracle 硬件的 性能。

48 Oracle Database 11gR2 性能调整与优化

1.27 参考文献

MOS 文档(很多已经在正文里面列出)。 Rich Niemiec, 11gR2 New Features, 2011。 Rich Niemiec, Exadata 101, 2011。 Rich Niemiec, Exadata for the Executive, 2011。 Oracle 11g R1, Administrators Guide。 Oracle 11g R1, New Features Guide。 Oracle 11gR2, New Features Guide。 Oracle 11gR2, SQL Language Reference。 Oracle 11gR1, Utilities。 Oracle Database 11g Product Family, www.oracle.com。 Oracle Database 11g, ASM, An Oracle Technical White Paper, June 2007。 SQL Performance Analyzer, An Oracle White Paper, November 2007。

十分感谢 Mike Messina:本章内容升级到 Oracle 11g,数他出力最多!

第2章

索引基本原理 (针对 DBA 和初级开发人员)

本章内容既不是针对数据库专家也不是为那些想快速找到答案的读者。本章主要是讨论索引 的基本原理(或许是唯一的一章),并包括 11gR2 中的一些新特性。对初学者来说,最困难的是找 到那些可以帮助他们进一步提高的信息,以及形象化的展现 Oracle 索引的功能,本章的目的就在 于此。虽然市场上有大量面向中高级用户的出版物,但需求量很高的面向初学者的资料却屈指可 数。此外,第 5 章还有一些与索引相关的查询调优和访问顾问(Access Advisor)的信息,与 Exadata 有关的索引信息都在第 11 章。 Oracle 提供了大量索引选项,在什么条件下使用哪个选项对于应用程序的性能来说非常重 要。一个错误的选择可能会引发死锁,从而导致数据库性能下降到不可接受的程度或进程终止。 如果能把那些之前运行了几小时甚至几天的占用了大量资源的进程找出来,使它们在几分钟内得

50 Oracle Database 11gR2 性能调整与优化

以完成,这样会使您颇有成就感。在 11g 中,有一个新功能——不可视索引,这样我们在删除一 个无用的或者有潜在问题的索引之前,可以先关掉它以确定真的不需要它了。

本章要点如下: ● 索引基本概念 ● 使用不可视索引 ● 查找有索引的表和有组合索引的表 ● 如何使用组合索引 ● Oracle ROWID ● 使用函数和索引 ● 如何避免比较不匹配的数据类型,它们会造成索引不被使用 ● 集群因子(Cluster Factor)是索引的关键 ● 使用 INDEX_STATS 视图 ● 索引的二元高度(Binary Height) ● 直方图(Histogram) ● 快速全扫描(Fast Full Scan) ● 如何使用索引跳跃式扫描(Index Skip-Scan) ● 解释 B 树索引 ● 如何使用位图索引 ● 如何使用哈希索引 ● 如何使用索引组织表(Index-Organized Table) ● 如何使用反键索引(Reverse Key Index) ● 如何使用基于函数的索引(Function-Based Index) ● 本地(Local)索引和全局(Global)索引

2.1 索引基本概念

当访问表中数据时,Oracle 提供了两种方式:从表中读取所有行(即全表扫描),或者通过 ROWID 一次读取一行。当访问大数据量表中的少量行时,您可能想使用索引。例如,如果只 访问大数据量表中 5%的行,并且可以使用索引标识需要读取的数据块,这样花费的 I/O 较少。 如果没有使用索引,就要读取表中所有的数据块。 索引对性能改进的程度取决于数据的选择性以及数据在表的数据块中的分布方式。如果数据 选择性很好,那么表中将只有很少的行匹配一个索引值(例如护照号码)。Oracle 将能够快速查 询索引,找到匹配索引值的 ROWID,从而快速查到表中相应的少量数据块。如果数据选择性不 好(例如国家名),那么对一个值索引可能返回许多 ROWID,导致从表中查询许多不连续的数 据块。 如果数据选择性很好,但是相关的行在表中的物理存储位置并不互相靠近,这种情况下,索 引带来的好处就会大打折扣。如果匹配索引值的数据分散在表的多个数据块中,就必须从表中把 每个数据块都选出来以得到需要的查询结果。在一些情况下,您会发现当数据分散在表的多个数 据块中时,最好是不使用索引,而是选择全表扫描。执行全表扫描时,Oracle 使用多块读取以快速 扫描表。基于索引的读是单块读,因此在使用索引时的目标是减少完成查询所需的单块读的数量。

第 2 章 索引基本原理(针对 DBA 和初级开发人员) 51

通过对 Oracle 一些可用选项的利用,比如分区、并行 DML、并行查询以及调整 DB_FILE_MULTIBLOCK_READ_COUNT 进行更大的 I/O 操作,全表扫描和索引查找之间的平衡 点正发生着改变。硬件更为快速,可以在磁盘的高速缓存中缓存更多的信息,内存也变得更为廉 价。与此同时,Oracle 已经增强的索引特性,包括了跳跃式扫描索引和其他内部操作用来减少返 回数据所需的时间。

要诀 当升级 Oracle 版本时,确保测试应用程序中的查询以确定查询的执行路径是否仍然使用在升 级之前使用的索引。看看执行计划是否改变,这种改变的效果是变得更好还是变得更差。

一般来说,索引能提高查询的性能。SELECT 语句、UPDATE 和 DELETE 命令的 WHERE 子句的性能(当访问的行较少时)可以借助索引获得提高。一般来说,增加索引会降低 INSERT 语 句的性能(因为需要同时对表和索引进行操作)。索引列上的 UPDATE 操作将会比没有加索引慢很 多,因为数据库必须管理对表和索引的改动。此外,大量行的 DELETE 操作将会由于表中存在索 引而变慢。 一条删除表中一半数据的 DELETE 语句同时需要删除所有这些行对应的索引(这种情况是非 常耗时的)。通常说来,在表上加一个索引都会使该表上 INSERT 操作的执行时间变成原来的三倍; 再加一个索引就会再慢一倍;然而,一个由两列组成的索引并不比只有一个列的索引差很多。索 引列的 UPDATE 和 DELETE 操作同样也会变慢。您需要平衡索引带来的查询性能的提升和对数 据修改性能的影响。 通过查询 DBA_INDEXES 视图可获得一个表上所有索引的清单,也可以通过访问 USER_ INDEXES 视图查询当前方案(schema)的索引。查询 ALL_INDEXES 视图可以查看能够访问的所有 表的索引。 例如,在一张随着 Oracle 产品一起提供的演示表 emp 上创建了两个索引。您可以对任何版本 的演示表测试下面的查询:

create index emp_id1 on emp(empno, ename, deptno); create index emp_id2 on emp (sal);

当执行这些命令时,数据库将在 emp 表上创建两个单独的索引。每个索引将包含 emp 表中的 特定值以及匹配这些值的行的 ROWID。如果需要查找 sal 值为 1000 的 emp 表中的记录,优化器 就会使用 emp_id2 索引查找该值,并找到相关的 ROWID,接着使用该 ROWID 在表中查找对应 的行。 下面对 USER_INDEXES 的查询显示了 emp 表上新建的索引:

select table_name, index_name from user_indexes where table_name = 'EMP' ;

TABLE_NAME INDEX_NAME ------EMP EMP_ID1 EMP EMP_ID2 输出显示有两个索引,但是没有显示每个索引中包含的列。为了获得当前用户的表中被索引

52 Oracle Database 11gR2 性能调整与优化

的列的信息,可查询 USER_IND_COLUMNS 视图;DBA 可以通过访问 DBA_IND_COLUMNS 视图检索所有方案中被索引的列,而通过 ALL_IND_COLUMNS 视图则可以查看当前用户有权看 到的所有表的被索引列。下面的例子就是通过 USER_IND_COLUMNS 视图获得当前用户的表中 被索引的列的信息:

column index_name format a12 column column_name format a8 column table_name format a8 select table_name, index_name, column_name, column_position from user_ind_columns order by table_name, index_name, column_position;

TABLE_NA INDEX_NAME COLUMN_N COLUMN_POSITION ------EMP EMP_ID1 EMPNO 1 EMP EMP_ID1 ENAME 2 EMP EMP_ID1 DEPTNO 3 EMP EMP_ID2 SAL 1

emp 表中有两个索引。第一个 emp_id1 是一个组合索引,它对 empno、ename 和 deptno 这几 列进行索引;第二个索引 emp_id2 只对 sal 列进行索引。程序清单中的 COLUMN_POSITION 字 段显示了组合索引中列的顺序,在本例中,按照 empno、ename 和 deptno 的顺序。

要诀 查询 DBA_INDEXES 和 DBA_IND_COLUMNS 可以检索到一个给定表的索引列表。对于当 前用户的方案(schema)中的索引信息,只能使用 USER_INDEXES 和 USER_IND_COLUMNS 来 查看。

2.2 不可视索引

决定对哪些列建立索引往往是很难的。主键是被自动索引的,外键也应该被索引,接下来怎 么办?更困难的是决定删除某个可能不好的索引。每插入一条记录时,所有索引都必须更新。如 果一个被索引的列被更新,该索引也要被更新。在不引起用户查询出现一系列全表扫描或笛卡儿 连接的情况下,决定哪些索引需要被删除是很困难的,尤其是在需要调优的第三方应用程序代码 不能改变的情况下。不可视索引是该问题一个可能的解决方案。Oracle 允许您关闭索引(使其不可 见),但是索引上的维护工作还会继续(在任何 DML 操作(INSERT/UPDATE/DELETE))期间,因为 您可能需要快速重新打开它。你可以通过下面的方法使索引可见或不可见: ● ALTER INDEX idx1 INVISIBLE; ● ALTER INDEX idx1 VISIBLE; ● CREATE INDEX . . . INVISIBLE; 下面的查询显示在表 emp 的 deptno 列上新建一个不可视索引,在接下来的查询中,我们看不 到那个索引:

create index dept_rich_inv_idx on dept_rich(deptno) invisible; Index created.

第 2 章 索引基本原理(针对 DBA 和初级开发人员) 53

select count(*) from dept_rich where deptno = 30;(索引不可见)

COUNT(*) ------512

Execution Plan ------Plan hash value: 3024595593

------| Id | Operation | Name | Rows | Bytes | Cost (%CPU) | Time | ------| 0 | SELECT STATEMENT | | 1 | 2 | 4 (0) | 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 2 | | | |* 2 | TABLE ACCESS FULL | DEPT_RICH | 512 | 1024 | 4 (0) | 0:00:01 | ------

仍然可以使用提示来强制这个索引的使用,在 11gR2 以前,可以使用 INDEX 提示,在 11gR2 中,可以使用 USE_INVISIBLE_INDEXES 提示,或者把初始化参数 OPTIMIZER_USE_INVISIBLE_ INDEXES 设置成 true(详见附录 A):

select /*+ USE_INVISIBLE_INDEXES */ count(*) from dept_rich where deptno = 30;(通过提示强制使用索引)

COUNT(*) ------512

Execution Plan ------Plan hash value: 3699452051 ------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------| 0 | SELECT STATEMENT | | 1 | 2 | 1 (0) | 00:00:01| | 1 | SORT AGGREGATE | | 1 | 2 | | | |* 2 | INDEX RANGE SCAN| DEPT_RICH_INV_IDX | 512 | 1024 | 1 (0) | 00:00:01| ------

如果把索引设成可见,就不需要 INDEX 提示了:

alter index dept_rich_inv_idx visible; Index altered.

select count(*) from dept_rich

54 Oracle Database 11gR2 性能调整与优化

where deptno = 30;(索引可见)

COUNT(*) ------512

Execution Plan ------Plan hash value: 3699452051 ------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------| 0 | SELECT STATEMENT | | 1 | 2 | 1 (0) | 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 2 | | | |* 2 | INDEX RANGE SCAN| DEPT_RICH_INV_IDX | 512 | 1024 | 1 (0) | 00:00:01 | ------

在不将其变成不可见的前提下,也可以使用 NO_INDEX 提示来关闭一个索引,看看除此之 外是否还使用其他索引(或者不使用索引)。换句话说,使用除了 NO_INDEX 中指定的索引之外的 任何索引,下面是一个例子:

select /*+ no_index(dept_rich dept_rich_inv_idx) */ count(*) from dept_rich where deptno = 30; (强制不使用带提示的索引)

COUNT(*) ------512

Execution Plan ------Plan hash value: 3024595593

------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------| 0 | SELECT STATEMENT | | 1 | 2 | 4 (0) | 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 2 | | | |* 2 | TABLE ACCESS FULL | DEPT_RICH | 512 | 1024 | 4 (0) | 0:00:01 | ------

可以随时将这个索引设成不可见:

alter index dept_rich_inv_idx invisible; Index altered.

可以通过 USER_INDEXES 或 DBA_INDEXES 视图来查看索引的可见性:

select index_name, visibility from dba_indexes (或使用 USER_INDEXES) where index_name = 'DEPT_RICH_INV_IDX';

第 2 章 索引基本原理(针对 DBA 和初级开发人员) 55

INDEX_NAME VISIBILITY ------DEPT_RICH_INV_IDX INVISIBLE

要诀 通过使用不可视索引,您可以通过使索引不可见的方法,临时“关闭”它们来查看查询在没 有它们时的性能。由于不可视索引依然被维护,因此如果有需要的话,可以轻易地把它们“打开”, 也就是使它们可见。

2.3 组合索引

当某个索引包含多个列时,我们称这个索引为“组合索引”或“复合索引”(composite index)。 Oracle 9i 引入的索引跳跃式扫描增加了优化器在使用组合索引时的选择,所以您在选择索引中的 列顺序时应该谨慎。一般来说,索引的第一列应该是最有可能在 WHERE 子句中使用的列,并且 也是索引中最具选择性的列。 在引入跳跃式扫描功能之前,只有当索引中的前导列也出现在 WHERE 子句中时,查询才能 使用索引。考虑如下程序清单中的示例,其中表 emp 有一个在列 empno、ename 和 deptno 上的组 合索引。注意第一部分是 empno,第二部分则是 ename,第三部分是 deptno。如果没有跳跃式扫 描功能,除非在 WHERE 子句中使用前导列(empno),否则 Oracle 一般不会使用这个索引。

select job, empno from emp where ename = 'RICH';

因为 ename 不是索引的前导列,优化器可能不会选择使用该索引。随着在 Oracle 9i 中引入跳 跃式扫描功能,即使在 WHERE 子句中没有指定 empno 值,优化器也可能会选择使用该索引。另 外,优化器也可能会选择索引快速全扫描(Index Fast Full Scan)或全表扫描。 如果在 WHERE 子句中使用索引的第三列,也会产生相同的情况:

select job, empno from emp where deptno = 30;

该例中,WHERE 子句指定了索引中第三列的值,优化器可能选择使用索引跳跃式扫描、索 引快速全扫描或全表扫描。创建这个索引时,您就为数据库在执行查询时提供更多的选择,从而 有希望改进整体的性能。注意,用户的代码没有改变,但是优化器可以识别该索引,并且根据每 种可行方法的预期成本作出决定。 在下面的示例中,使用了索引的一部分。前导列 empno 用作 WHERE 子句中的限制条件, 以便 Oracle 可以使用该索引。

select job, empno from emp where empno = 'RICH';

两种最常见的索引扫描方式是唯一扫描(Unique Scan)和范围扫描(Range Scan)。在唯一扫描

56 Oracle Database 11gR2 性能调整与优化

中,数据库知道索引包含的每一个值都是唯一的。在范围扫描中,数据库将根据查询条件从索引 中返回多个符合条件的值。在该例中,emp_id1 和 emp_id2 索引都不是唯一索引。Oracle 在返回 数据的时候将使用范围扫描。使用 CREATE UNIQUE INDEX 命令可以创建唯一索引。 在创建主键约束或唯一性约束时,Oracle 将基于指定的列自动创建唯一索引(除非使用 DISABLE 子句创建约束)。如果创建多列的主键,Oracle 将创建组合索引,其中的列的排列顺序 和创建主键时指定的列的顺序一致。 类似于在列 emp_id1 和 emp_id2 上的索引,Oracle 具备通过每行的 ROWID 访问单行数据的 能力。ROWID 其实就是直接指向单行的物理位置的指针。

要诀 避免将 Oracle 的 ROWID 硬编码到特定代码里。因为在不同版本的 Oracle 中,ROWID 结构 会有所不同,而且在将来的版本里可能还会有所改变。建议不要对 ROWID 进行硬编码。

2.4 索引抑制

抑制索引是一些没有经验的开发人员经常犯的错误之一。在 SQL 中有很多陷阱会使一些索 引无法使用。本节将讨论一些常见的问题。 Oracle 优化器在后台工作,选择并使用可能最有效的方法来返回数据。例如,在许多情况下 不需要指定 WHERE 子句,Oracle 就可以使用索引。具体来说,如果查询索引列的 MIN 或 MAX 值,Oracle 从索引中就可以得到结果,而不需要去访问表;类似的,如果对索引列执行 COUNT 函数,Oracle 可以使用索引而不是列中实际的数据。在下面的内容中,您将看到 WHERE 子句的 逻辑阻止 Oracle 使用索引的情况。

2.4.1 使用不等于运算符(<>、!=)

索引只能用于查找表中已存在的数据。每当在 WHERE 子句中使用不等于运算符时,其中被 用到的列上的索引都将无法使用。请考虑下面对 customers 表的查询,该表中的 cust_rating 列上 有一个索引,下面的语句仍会产生一次全表扫描(因为大多数记录都要被返回),即使列 cust_rating 上存在索引:

select cust_id, cust_name from customers where cust_rating <> 'aa'; Oracle 在分析表的同时收集表中数据分布的相关统计信息。通过使用这种方法,基于成本的 优化器就可以决定在 WHERE 子句中对一些值使用索引,而对其他的值不使用。在应用程序开发 和测试期间,应该使用具有代表性的行集,从而可以模拟产品环境中实际的数据值分布情况。

要诀 您可以通过使用 CREATE INDEX 命令的 COMPUTE STATISTICS 子句,在创建索引的同时 分析它们1。也可以从生产数据库中导入统计信息来测试执行路径(参考 Oracle 11.2 Database Performance Tuning Guide)。

1 译者注:在 11g 中,创建索引的时候会自动收集索引的统计信息。

第 2 章 索引基本原理(针对 DBA 和初级开发人员) 57

2.4.2 使用 IS NULL 或 IS NOT NULL

当在 WHERE 子句中使用 IS NULL 或 IS NOT NULL 的时候,因为 NULL 值并没有被定义2, 所以索引的使用会被抑制。数据库中没有值等于 NULL;甚至 NULL 也不等于 NULL。 在 SQL 语句中使用 NULL 会提出一些挑战:如果被索引的列在某些行中存在 NULL 值,在 索引中就不会有相应的条目(除非使用位图索引,这是位图索引对于 NULL 搜索通常很快的原因)。 一般情况下,即使 sal 列上有索引,下面的语句也会引起全表扫描:

select empno, ename, deptno from emp where sal is null;

如果要在列中禁用 NULL 值,可以在创建或修改表时使用 NOT NULL 约束。需要注意的是, 如果表中已经包含数据,那么只有在表中每一行的值都非 NULL 或是使用 ALTER TABLE 命令 的 DEFAULT 子句时,才可以为列设置 NOT NULL 属性。下面的例子显示了修改 emp 表的 sal 列以禁用 NULL 值:

alter table emp modify (sal not null);

注意,如果试图向 sal 列中插入 NULL 值,就会返回错误信息。

要诀 在创建表时对列指定 NOT NULL 约束会禁用 NULL 值,而且可以避免与查询 NULL 值相关 的性能问题。

下面的创建表语句为 deptno 列提供了一个默认值。如果在 INSERT 操作时该列没有指定 的值,就会使用默认值。如果指定了默认值,并且确实需要 NULL 值,就需要在该列中插入 NULL。

create table employee (empl_id number(8) not null, first_name varchar2(20) not null, last_name varchar2(20) not null, deptno number(4) default 10);

insert into employee(empl_id, first_name, last_name) values (8100, 'REGINA', 'NIEMIEC'); 1 row created.

select * from employee;

EMPL_ID FIRST_NAME LAST_NAME DEPTNO ------8100 REGINA NIEMIEC 10

2 译者注:Oracle 不会在 B 树索引中对 NULL 值索引。

58 Oracle Database 11gR2 性能调整与优化

insert into employee values (8200, 'RICH', 'NIEMIEC', NULL);

1 row created. select * from employee;

EMPL_ID FIRST_NAME LAST_NAME DEPTNO ------8100 REGINA NIEMIEC 10 8200 RICH NIEMIEC

要诀 NULL 值通常会抑制索引。在创建表时对列指定 NOT NULL 或 DEFAULT 属性,可以帮助 避免可能出现的性能问题。

2.4.3 使用 LIKE

在某些情况下,条件中有 LIKE 关键字会使用索引;而在某些情况下,则不会。LIKE 的最常 见用法是 LIKE '%somevalue%' 或 LIKE ' somevalue%' (其中%只能在搜索字符串的结尾处)。上面 两种情形中,只有第二种情况,LIKE 'somevalue%',也就是值在开始的时候,可以使用索引。让 我们用几个例子来说明。首先,在 scott.emp 表的 ename 列上创建一个索引,这样可以通过使用 索引来查找雇员的名字。我们看看使用 LIKE 的时候,什么时候索引会被用到,什么时候不会。

SQL> create index emp_ename_nu on emp (ename) ; Index created.

首先看看当时使用 LIKE '%somevalue%'的时候,会是什么情况:

SQL> set autotrace traceonly SQL> select empno, ename, hiredate 2 from scott.emp 3 where ename like '%BLAKE%';

Execution Plan ------Plan hash value: 3956160932 ------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------| 0 | SELECT STATEMENT | | 1 | 18 | 3 (0) | 00:00:01 | |* 1 | TABLE ACCESS FULL | EMP | 1 | 18 | 3 (0) | 00:00:01 |

我们再看看把值放在%前面的情况:

SQL> set autotrace traceonly SQL> select empno, ename, hiredate 2 from scott.emp 3 where ename like 'BLAKE%' ;

第 2 章 索引基本原理(针对 DBA 和初级开发人员) 59

Execution Plan ------Plan hash value: 3445075938 ------| Id | Operation | Name | Rows| Bytes | Cost (%CPU)| Time| ------| 0 | SELECT STATEMENT | | 1 | 18 | 2 (0) | 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID | EMP | 1 | 18 | 2 (0) | 00:00:01 | |* 2 | INDEX RANGE SCAN | EMP_ENAME_NU| 1 | | 1 (0) | 00:00:01 | ------

可以看到,当%在值的前面的时候,索引不会被使用;但是当值在%前面的时候,Oracle 可 以使用索引。

2.4.4 使用函数

除非使用基于函数的索引,否则在 SQL 语句的 WHERE 子句中对存在索引的列使用函数时, 优化器会忽略掉这些索引。一些最常见的函数,如 TRUNC、SUBSTR、TO_DATE、TO_CHAR 和 INSTR 等,都可以改变列的值;因此,被引用的列上的索引将无法使用。下面的语句会执行 一次全表扫描,即使 hire_date 列上存在索引(只要它不是基于函数的索引):

select empno, ename, deptno from emp where trunc(hiredate) = '01-MAY-01';

把上面的语句改成下面的样子就可以通过索引进行查找:

select empno, ename, deptno from emp where hiredate > '01-MAY-01' and hiredate < (TO_DATE('01-MAY-01') + 0.99999);

要诀 通过改变所比较的列上的值,而不用改变列本身,就可以启用索引。这样可避免全表扫描。

关于基于函数的索引的更多信息,可查看本章后面的 2.11.6 节“基于函数的索引”。

2.4.5 比较不匹配的数据类型

一种很难解决的性能问题是比较不匹配的数据类型。Oracle 不但不会对那些不兼容的数据类 型报错,反而会做隐式数据转换。例如,Oracle 可以隐式地转换 VARCHAR2 类型的列中的数据 去匹配数值类型数据。仔细观察如下示例,其中 account_number 列就是 VARCHAR2 类型。 如果 account_number 列是 VARCHAR2 数据类型,下面的语句将执行全表扫描,即便 account_number 列上有索引:

select bank_name, address, city, state, zip

60 Oracle Database 11gR2 性能调整与优化

from banks where account_number = 990354;

Oracle 可以自动把 WHERE 子句变成:

to_number(account_number)=990354

这样就抑制了索引的使用。这个查询的 EXPLAIN PLAN 显示仅可以通过“全表扫描”访问 这个表(对编程人员来说通常都很迷惑)。对一些 DBA 或开发人员来说,这样的情况可能很少见, 但在很多系统中,数字类型值可能被用零填充,然后指定为 VARCHAR2 类型。像下面这样改写 前面的语句,为值加上单引号,就可以使用 account_number 列上的索引:

select bank_name, address, city, state, zip from banks where account_number = '000990354';

另外一种可选方法是将 account_number 列定义成 NUMBER 数据类型,这样做的前提是前置 的 0 不是该列的关键信息。

要诀 比较不匹配的数据类型会让 Oracle 抑制索引的使用,即便对这个查询执行 EXPLAIN PLAN 也不能让您明白为什么做了一次全表扫描。只有了解数据类型才能帮助您解决这个问题。

2.5 选择性

Oracle 基于查询和数据,提供了多种方法来判断使用索引的价值。首先判断索引中的唯一键 或不同键的数量。可以通过对表或索引进行分析的方法来确定不同键的数量,之后就可以查询 USER_INDEXES 视图的 DISTINCT_KEYS 列来查看分析结果。比较一下不同键的数量和表中的 行数(USER_INDEXES 视图中的 NUM_ROWS 列),就可以知道索引的选择性。索引的选择性越 高意味着一个索引值返回的行数就越少,该索引就越好。

要诀 索引的选择性可以帮助基于成本的优化器来决定执行路径。索引的选择性越高,针对每个不 同值平均返回的行数也越少。对于组合索引,在索引中添加额外的列不会显著改善选择性,额外 列增加的成本可能会超出收益。

2.6 集群因子

集群因子是索引与它所在的表相比较的有序性度量,它用于检查在索引访问之后执行的表查 找的成本(将集群因子与选择性相乘即可得到该操作的成本)。集群因子记录在扫描索引时需要读 取的数据块数量。如果使用的索引具有较大的集群因子,就必须访问更多的表数据块才可以获得 每个索引块中对应的数据行(因为邻近行位于不同的数据块中)。如果集群因子接近于表中的数据 块数量,就表示索引对应数据行的排序情况良好;但是,如果集群因子接近于表中的数据行数量, 就表示索引对应的数据块排序情况不佳。集群因子的计算简要介绍如下:

第 2 章 索引基本原理(针对 DBA 和初级开发人员) 61

(1) 按顺序扫描索引。 (2) 将当前索引值指向的 ROWID 的数据块部分与前一个索引值指向的数据块进行比较(比 较索引中的邻近行)。 (3) 如果 ROWID 指向该表中不同的数据块,就增加集群因子(对整个索引执行该操作)。 CLUSTERING_FACTOR 列是 USER_INDEXES 视图中的一列,该列反映了数据相对于已索 引的列是否显得有序。例如,customers 表上的 customer_id 列的值由序列生成器产生,而且是 customers 表上的主键。customer_id 列上索引的集群因子就有可能非常接近于数据块数(有序的)。 当往数据库中添加客户时,它们就按照序列产生器所产生的序列值有序地存储在表中(有序的)。 然而,customer_name 列上的集群因子索引会很高,因为整个表的客户名字排列是随机的。 集群因子对执行范围扫描的 SQL 语句产生影响。如果集群因子接近数据块数量,满足查询要 求的数据块的数量就可以少很多,这样也增加了数据块已经存在于内存中的可能性。相对于数据 块数量大很多的集群因子,基于索引列的范围查询需要扫描更多的数据块。

要诀 表中数据的集群3可以用来提高范围扫描类型操作语句的性能。通过决定在语句中列是如何使 用的,对这些列进行索引可以带来很大益处。

2.7 二元高度(Binary Height)

索引的二元高度对把 ROWID 返回给用户进程时所要求的 I/O 数量起到关键作用。二元高度 的每个级别都会增加一个额外的块读取操作,而且由于这些块不能按顺序读取,它们都要求一个 独立的 I/O 操作。在图 2-1 中,一个二元高度为 3 的索引,需要读 4 个块才能返回一行数据给用 户,其中 3 次用来读索引,1 次用来读表。随着索引的二元高度的增加,检索数据所要求的 I/O 次数也会随之增加。 在对索引进行分析后,可以通过查询 DBA_INDEXES 视图的 BLEVEL 列来查看它的二元 高度:

图 2-1 二元高度(BLEVEL)为 3 的索引(Level 3 为叶节点所在位置)

EXECUTE DBMS_STATS.GATHER_INDEX_STATS ('SCOTT','EMP_ID1');

3 译者注:这里的集群指按照某些列排序。

62 Oracle Database 11gR2 性能调整与优化

PL/SQL procedure successfully completed.

select blevel, index_name from dba_indexes where index_name = 'EMP_ID1';

BLEVEL INDEX_NAME ------0 EMP_ID1

要诀 分析索引或表可以得到索引的二元高度。使用 USER_INDEXES 视图里的 BLEVEL 列可以查 看索引的二元高度。

表中索引列的非 NULL 值数量的增加和索引列中值的范围狭窄是二元高度增加的主要原因; 索引上如果有大量被删除的行,它的二元高度也会增加。重建索引可能使二元高度降低。虽然这 些步骤减少了针对索引执行的 I/O 数量,但对性能的改进却可能很小。如果一个索引中被删除的 行接近 20%~25%,重建索引会降低二元高度以及在一次 I/O 中所读取的索引块中的空闲空间。

要诀 一般来说,数据库中的数据块越大,索引的二元高度就越低。二元高度每增加一个级别,在 DML 操作期间就会增加额外的性能成本。

关于 BLEVEL 和索引高度的更多细节

B 树级别(BLEVEL)是指一个索引从它的根块到其叶块的深度。0 层表明根块和叶块在同一个 级别。所有索引都是从一个叶块开始,这时它代表了一颗 0 级的 B 树。当行被逐渐添加到索引中 时,Oracle 会把数据放到叶块中,随着不断有数据插入,一旦初始叶块填满,两个新块就会被创 建出来。Oracle 以两种方式处理这个操作,就是众所周知的 90-10 或 50-50 索引分裂法。被插入 的值决定了使用哪种分裂方式: ● 如果新值大于该索引中已有任何值,那么 Oracle 将使用 90-10 分裂法,把当前块中的值 复制到一个新块,将新值放到另外一个块中。 ● 如果新值不是该索引中最大的值,那么 Oracle 会使用 50-50 分裂法,将较小的一半索引 值放到一个新块中,将较大的另一半索引值放到另外一个新块中。 之前已经装满数据的块被更新成为只包含指向新叶块的指针的分支块,当前情况下也就是根 块,这时索引就有 1 级分支了。随着行不断地插入索引,一个叶块填满时,Oracle 将创建一个新 的叶块。如果被插入的值大于当前叶块中的任何值,那么 Oracle 将把新值放到一个新块中;如果 该值不是最大值,那么 Oracle 按值将块等分成两份(50-50 分裂法),将较小的值放到当前块中,将 较大的值放到新块中。这时,这些叶块的分支块将更新为包含新块和现有块的指针。这种情况持 续下去,直到分支块填满。当分支块填满时,Oracle 会执行相同的块分裂操作:添加一个新的分 支块,把当前分支块中的一半数据复制到新块中,将剩下的一半保留在现有的分支块中。这种方 式不会增加索引的高度(BLEVEL),它只是在查询遍历索引时提供了一个新的分支。只有在根节 点填满并产生分裂时才会导致索引高度的增加。

第 2 章 索引基本原理(针对 DBA 和初级开发人员) 63

要诀 只有在根节点分裂的情况下,索引会创建两个新块。当前的根块的内容被分割到两个新的分 支块中,形成一个更高的索引树的顶部。根块的地址不会改变,通过在根块发生分裂时增加两个 块,索引树总是平衡的。

1. 更新操作对索引的影响 索引只有在表中组成索引的列被更新时才会受到影响。因此,在许多情况下,更新操作根 本不会影响索引。当更新组成索引的表列时,索引上会执行一个删除和插入的操作。旧值被标 记为已删除,与原索引条目对应的一个新值被插入。因此,索引上没有真正意义上的“更新”。 如果发现上述情况,您通常应该想到正在执行一个更新操作。索引条目也会通过 Oracle 的延迟 块清理功能得以清理。只有在索引条目被删除而且块被清理后,索引块中的空间才能被新条目 重用。 2. 删除操作对索引的影响 索引上的删除操作,并没有真正从索引中删除条目以获得空间。实际上,当表中一条记录被 删除时,相应的索引条目被标记为已删除,在清理过程清理之前,仍然保留在索引中。最常见的 清理索引条目的方法是通过在那个索引块上的插入操作。索引条目也可以通过 Oracle 的延迟块清 理功能得以清理(这是发生在随后的查询,可能是一条 SELECT 语句)。在索引项将被删除,索引 块被清理后,索引块中的空间可供新条目重复使用。 3. 更新和删除操作对索引的影响

围绕着删除和更新操作对索引的影响,一向众说纷纭,莫衷一是。前面已解释了 Oracle 索引 上的删除和更新操作的基本工作原理,我们来仔细看看真实效果。删除操作实际是将索引条目标 记为已删除,也就是说,删除操作仍然把数据留在叶块中,需要由清理过程清理。在对有条目标 记为已删除的叶块进行插入操作时,会迫使这些条目被清理,使对叶块插入操作“重用”这些空 间。是否有插入操作不会发生的情况?是的,但索引块最终被延迟块清理功能清理。 更新操作,伴随着在同一事务中对索引的删除/插入操作,往往会明显增大索引的大小,这种 情况只有当您在同一事务大量执行这些操作才会发生(Oracle 不建议这么做)。删除操作自身不会 引起索引高度或 BLEVEL 的增加,只不过反映了如何重用被删除行所占空间的更大的问题。这意 味着,在单个事务中大量删除或更新操作,或者两者都有的情况,可能造成索引的大小、高度和 BLEVEL 增加(Oracle 不建议您在同一事务中执行大量 DML 操作)。此解决方案是通过提交(commit) 来有效地制造大量的删除+插入操作事务,从而拆分原事务。这有助于重用空间,不会导致索引 人为地增长到大于它应有的大小。这也解释了为什么在同一事务中包含大型删除和插入操作,通 常会导致索引的增长。 在使人受益的 asktom.oracle.com 博客上,Tom Kyte 这样写道:

好了,事实上索引和人一样,有着自己希望维持的体重。人总是有的胖,有的瘦,有的高, 有的矮。虽然可以通过节食来减肥,可人们还是容易变回到原来的体重。于索引而言也是一样: 它们总要变得体阔腰圆,所以每个月都得被重建一回(让它们节食减肥)。而头半个月过后,索引 就会再次发胖,并由于索引块分裂而产生大量的重做日志......

64 Oracle Database 11gR2 性能调整与优化

这个故事的寓意是使用本地管理的表空间以避免碎片和极少重建索引(首次正确建立索引,只 有在性能与基准值比较后发生下降时才重建)。

4. 数据块大小对索引的影响

正如前面所述,从分支块到根块都可能分裂,这种行为会导致索引的高度和分支的增加。索 引块分裂的次数,或者更具体地说,分支索引块分裂的次数,可以通过使用较大的索引块尽量减 少。这是一些专家认为应使用更大的块创建索引表空间的一个原因。如果每个索引块能容纳更多 的数据,索引分裂出现的频率将低很多,因此可以减少索引的分支和树叶块数。在旧的和新的数 据块大小之间究竟该如何取舍呢?这大大取决于被索引数据量的大小。在衡量为索引使用更大的 块大小,会对表空间产生多大的影响时需要谨慎。将索引移到具有更大的块大小的表空间时需要 重建,这时会删除所有被标记为删除的条目,压缩索引使用空间,包括回收被标记为已删除的条 目的空间和条目已经删除但还没有回收或重用的空间。因此,当您考虑到实际将要发生什么的时 候,使用更大的块所产生的影响可能并不如预期或令人心动。

2.8 使用直方图

在分析表或索引时,直方图用于记录数据的分布。通过获得该信息,基于成本的优化器就可 以针对查询条件决定如何使用索引。如果条件返回少量行,就采用索引;如果条件返回许多行, 就不采用索引。直方图的使用不限于索引,表的任何列上都可以构建直方图。 构造直方图最主要的原因就是帮助优化器在表中数据出现严重偏斜时做出更好的规划。例 如,如果一到两个值构成了表中的大部分数据,使用相关的索引就可能无法协助减少满足查询所 需的 I/O 数量,创建直方图可以让基于成本的优化器知道何时使用索引才最合适,或者何时根据 WHERE 子句中的条件值,表中 80%的记录会返回。 要创建直方图,首先要指定它的大小。该大小与直方图所需的桶(Bucket)数相关。每个桶包含 列值和行数的相关信息。

EXECUTE DBMS_STATS.GATHER_TABLE_STATS ('scott','company', METHOD_OPT => 'FOR COLUMNS SIZE 10 company_code'); PL/SQL procedure successfully completed.

前面的查询会在 company 表上创建一个带有 10 个桶的直方图,如图 2-2 所示。图中 company_code 列的所有值被分成 10 个桶。这个例子中大部分的 company_code 值(大约 80%)是 1430。同样如 图 2-2 中所示,如果使用频率均衡(Frequency)方式的桶,多数桶都只有 3 行记录;有一个桶却有 73 行记录。如果使用高度均衡(Height-balanced)方式的桶,每个桶都有相同数目的行,多数桶的 终点都是 1430,这也反映了数据的偏斜分布。 Oracle 的直方图分为高度均衡和频率两种。高度均衡直方图里的所有桶都有相同的行数。桶 的起点和终点取决于包含这些值的行数。频率的直方图规定每个存储桶的值的范围,然后统计出 这个范围内的行数,这并不是一个理想的选择。

第 2 章 索引基本原理(针对 DBA 和初级开发人员) 65

高度均衡

频率

73

图 2-2 构建在 company_code 列上的桶大小为 10 的直方图(具有 10 个桶)

要诀 如果表中的数据分布得较不均匀,直方图会为基于成本的优化器提供数据分布的均衡图(把数 据平均分布到各个桶)。在没有数据偏斜的列上使用直方图并不会提高性能。

要诀 默认情况下,Oracle 会为直方图产生 75 个桶。可以把 SIZE 的值指定在 1 到 254 之间 14。

2.9 快速全扫描

在索引的快速全扫描过程中,Oracle 读取 B 树索引上的所有树叶块。这个索引可以顺序方式 读取,这样一次可以读取多个块。初始化文件中的 DB_FILE_MULTIBLOCK_READ_COUNT 参 数可以控制同时被读取的块的数目。相比全表扫描,快速全扫描通常需要较少的物理 I/O,并且 查询可以更快地完成。 如果表查询中的所有列都被包括在索引里,而且索引的前导列并不在 WHERE 条件中,就可 以使用快速全扫描(可能需要指定第 7 章讲到的 INDEX_FFS 提示)。下面的示例中用到了 emp 表。 在该表的 empno、ename 和 deptno 上有一个组合索引。

select empno, ename, deptno from emp where deptno = 30;

由于 SQL 语句中的所有列都包括在索引中,因此可以使用快速全扫描。在查询中有连接的情 况下,当查询仅仅涉及被索引的连接键列上的数据时,索引快速全扫描往往会被派上用场。另外 一种可选方案是,Oracle 可能执行索引的跳跃式扫描。优化器应该考虑 deptno 列上的直方图(如 果有的话),并且确定哪个可用的访问路径可以产生最低的性能成本。

要诀 如果索引相对于表的总体尺寸来说很小,快速全扫描就可以使应用程序的性能陡增。如果表

4 译者注:Oracle 10g 以前会默认为直方图产生 75 个桶,在 10g 和 11g 中根据 Oracle 内部算法决定桶数,最多 254 个桶,收集 统计信息程序包 DBMS_STATS 中对应选项 METHOD_OPT 的默认值是 AUTO。

66 Oracle Database 11gR2 性能调整与优化

中有一个包含了大部分列的组合索引,索引可能要比真实的表大,这样快速全扫描反而会降低 性能。

2.10 跳跃式扫描

本章前面的 2.3 节“组合索引”中介绍过,索引跳跃式扫描特性允许优化器使用组合索引, 即便索引的前导列没有出现在 WHERE 子句中。索引跳跃式扫描比索引全扫描快得多,这是因为 它只需要执行很少量的读操作。例如,下面的查询显示了索引全扫描和跳跃式扫描之间的区别。 在该程序清单中,emp5 有成百上千的行。要想更好地理解执行计划或后面的程序清单中列出的统 计数据,请参考第 6 章。 随着查询的执行,该程序清单显示了查询花费的时间、在数据库中的执行路径,以及处理该 查询所需的逻辑读数量(一致读,Consistent Get)和物理读数量的统计数据:

create index skip1 on emp5(job,empno); Index created. (你还需要收集统计信息)5

select count(*) from emp5 where empno = 7900; Elapsed: 00:00:03.13 (结果是一行,略去不显示)

Execution Plan 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=1 Bytes=5) 1 0 SORT (AGGREGATE) 2 1 INDEX (FAST FULL SCAN) OF 'SKIP1' (NON-UNIQUE)

Statistics 6826 consistent gets 6819 physical reads

select /*+ index(emp5 skip1) */ count(*) from emp5 where empno = 7900; Elapsed: 00:00:00.56

Execution Plan 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=1 Bytes=5) 1 0 SORT (AGGREGATE) 2 1 INDEX (SKIP SCAN) OF 'SKIP1' (NON-UNIQUE)

Statistics 21 consistent gets 17 physical reads

5 译者注:在 11g 中,索引的统计信息在创建的时候已经收集。

第 2 章 索引基本原理(针对 DBA 和初级开发人员) 67

如同该程序清单所示,第二个选项使用 INDEX(SKIP SCAN)操作读取索引。该执行路径需要 21 个逻辑读,这些逻辑读中有 17 个是物理读。第一个选项使用 INDEX(FAST FULL SCAN)操作, 该操作需要明显多得多的逻辑和物理 I/O。 为了让优化器选择跳跃式扫描,可能需要在查询中像该程序清单所示的那样使用提示。提示 影响了优化器,使其偏向您所指定的执行路径。

要诀 对于那些有组合索引的大型表而言,索引跳跃式扫描特性可以在前导列不在限制条件中时, 提供一种快速访问方法。

2.11 索引的类型

下面列出了本节要讨论的索引类型: ● B树索引 ● 位图索引 ● 哈希索引 ● 索引组织表 ● 反键索引 ● 基于函数的索引 ● 分区索引(本地和全局索引) ● 位图连接索引

2.11.1 B 树索引

B 树索引在 Oracle 中是通用索引,是创建索引时的默认索引类型。B 树索引可以是单列(简单) 索引,也可以是组合/复合(多列)索引。B 树索引最多可以包括 32 列。 在图 2-3 的例子中,B 树索引位于 employee 表的 last_name 列上。这个索引的二元高度为 3; 接下来,Oracle 必须通过两个分支块才能到达包含有 ROWID 的树叶块。在每个分支块中,树枝 行包含链中下一个块的 ID 号。 树叶块包含了索引值、ROWID,以及指向前一个和后一个树叶块的指针。Oracle 可以从两个 方向遍历这个二叉树。B 树索引保存了在索引列上非空的每个数据行的 ROWID 值。Oracle 不会 对索引列上包含 NULL 值的行进行索引。如果索引是多个列的组合索引,而其中一列上包含 NULL 值,这一行会在索引中,有 NULL 值的列被处理为空。

要诀 索引列的值都存储在索引中。因此,可以建立组合(复合)索引,在不访问表的情况下直接满 足查询需要的结果,这就不用从表中检索数据,从而减少了 I/O 量。

68 Oracle Database 11gR2 性能调整与优化

图 2-3 B 树索引的创建过程

2.11.2 位图索引

位图索引是决策支持系统(Decision Support System,DSS)和数据仓库的理想选择,它们不应 该用于事务处理应用程序中的表。在数据量非常大的表上的基数(Cardinality)(不同值的数量)不高 的列上建立位图索引,可以实现对这类表的快速访问。尽管位图索引最多可以包括 30 列,但通常 它们都只用于少量的列。 例如,您的表可能包含一个名为 sex 的列,它有两个可能值:男和女。它的基数只有 2,如 果用户频繁地根据 sex 列的值查询该表,该列就是位图索引的首要候选。当一个表内包含了多个 位图索引时,您可以体会到位图索引的真正威力。如果有多个可用的位图索引,Oracle 就可以合 并从每个位图索引得到的结果集,快速排除不必要的数据。 下面的程序清单给出了一个创建位图索引的例子:

create bitmap index dept_idx2_bm on dept (deptno); Index created.

要诀 对有较低基数的列使用位图索引。sex 列就是这样一个例子,它有两个可能值:男或女(基数 仅为 2)。由于位图索引的尺寸相对于 B 树索引来说小很多,因此用来访问低基数(少量的不同值) 列的速度非常快。这些索引相对于低基数的 B 树索引非常小,因此您仍然可以使用位图索引经常 检索表中超过半数的行。

当大多数条目不会向位图添加新的值时,位图索引在批处理(单用户)操作中加载表(插入操作) 这方面通常要比 B 树做得好。当多个会话同时向表中插入行时,不应该使用位图索引,在大多数 事务处理应用程序中都会发生这种情况。

第 2 章 索引基本原理(针对 DBA 和初级开发人员) 69

位图索引示例

下面来看看 participant 示例表,该表包含了来自个人的调查数据。列 age_code、income_level、 education_level 和 marital_status 都包括了各自的位图索引。图 2-4 显示了每个列中数据分布情况的 直方图,以及对访问每个位图索引的查询的执行路径。图中的执行路径显示了有多少个位图索引 被合并,可以看出性能得到了显著的提高。 如图 2-4 所示,优化器依次使用 4 个在 WHERE 子句中被引用的列上的独立的位图索引。每 个位图包含二进制值(例如 0 或 1),用于指示表中的哪些行包含位图中的索引值。有了这些信息后, Oracle 就执行 BITMAP AND 操作以查找将从所有 4 个位图中返回哪些行。该值然后被转换为 ROWID 值,并且查询继续完成剩余的处理工作。注意,所有 4 个列的基数都非常低,使用这种 索引可以非常快速地返回匹配的行。

' ' ' ' ' ' ' '

' ' ' ' ' ' ' '

图 2-4 创建位图索引

要诀 在查询中合并多个位图索引可以使其性能显著提高。位图索引对于固定长度的数据类型要比 可变长度的数据类型工作得更好。较大尺寸的块也会提高对位图索引的存储和读取性能。

下面的查询可显示索引类型。B 树索引的类型值为 NORMAL;而位图索引的类型值为 BITMAP。

select index_name, index_type from user_indexes;

要诀 如果要查询位图索引的列表,可以在 USER _INDEXES 视图中查询 INDEX_TYPE 列。

70 Oracle Database 11gR2 性能调整与优化

不建议在一些 OLTP(Online Transaction Processing,联机事务处理)应用程序中使用位图索引。 B 树索引中,一个 ROWID 对应一个索引值中,如果更新表和上面的索引时,Oracle 可以锁定单 独的行。位图索引的索引值使用压缩格式存储,其中一个索引值会包含一系列的 ROWID,因此 Oracle 不得不在更新一个给定值时锁定与其对应的所有 ROWID。这种锁定类型可能在某些 DML 语句中造成死锁。SELECT 语句不会受到这种锁定问题的影响。 位图索引有下面这些限制: ● 基于规则的优化器不会考虑位图索引。 ● 当执行 ALTER TABLE 语句并修改包含有位图索引的列时,会使位图索引失效。 ● 位图索引不包含任何列数据,并且不能用于任何类型的完整性检查。 ● 位图索引不能被声明为唯一索引。 ● 位图索引最多包含 30 列。

要诀 不要在高负载的 OLTP 环境中使用位图索引。

2.11.3 哈希索引

使用哈希索引时必须使用哈希集群。建立集群或哈希集群的同时,也就定义了集群键。这个 键告诉 Oracle 如何在集群上存储表。在存储数据时,无论集群键属于哪个表,所有与之相关的行 都被存储在一个数据库块上。如果数据存储在同一个数据库块上,在 WHERE 子句中是等值匹配 的情况下使用哈希索引,Oracle 就可以通过执行一次哈希函数和一个 I/O 来访问数据—— 而通过 使用一个二元高度为 3 的 B 树索引来访问数据,则可能需要使用 4 个 I/O 来得到需要的数据。如 图 2-5 所示,其中的查询是一个等值查询,用于匹配哈希列和确切的值。Oracle 可以基于哈希函 数快速使用该值确定行的物理存储位置。 哈希索引可能是访问数据库中数据的最快方法,但它也有自身的缺点。在创建哈希集群之 前必须知道集群键上不同值的数目,而且在创建哈希集群的时候指定这个值。低估了集群键的 不同值的数目可能会造成集群的冲突(两个集群的键值拥有相同的哈希值)。这种冲突是非常消 耗资源的,会造成使用更多的内存来存储额外行,造成额外的 I/O。如果不同哈希值的数目已经 被低估,您就必须在重建这个集群之后改变这个值。ALTER CLUSTER 命令不能改变哈希键的 数目。 哈希集群还可能浪费空间。如果无法确定需要多少空间来维护某个集群键上的所有行, 就可能造成空间的浪费。如果不能为集群的未来增长预留好空间,哈希集群可能就不是最好 的选择。 如果应用程序经常在集群表上进行全表扫描,哈希集群可能也不是正确的选择。由于需要为 集群未来的增长预留空间,全表扫描可能非常消耗资源。 在实现哈希集群之前一定要小心。您需要全面地观察应用程序,保证在实现这个选项之前已 经了解关于表和数据的足够信息。通常,哈希对于一些包含有序值的静态数据非常有效。

第 2 章 索引基本原理(针对 DBA 和初级开发人员) 71

哈希键 集群键 数据

使用哈希集群

哈希函数

使用 B 树索引 B 树索引 表

分支块 数据块

分支块

分支块

图 2-5 使用哈希索引的例子

要诀 哈希索引在限制条件是确定的值而不是范围的情况下非常有用。

2.11.4 索引组织表

索引组织表会把表的存储结构改成 B 树结构,以表的主键进行排序。这种特殊的表和其他类 型的表一样,可以在表上执行所有的 DML 和 DDL 语句。由于表的特殊结构,ROWID 并没有被 关联到表的行上。 对于一些涉及精确匹配和范围搜索的语句,索引组织表提供了一种基于键的快速数据访问机 制。因为行在物理上有序,所以基于主键值的 UPDATE 和 DELETE 语句的性能也同样得以提高。 由于键列的值在表和索引中都没有重复,存储所需要的空间也随之减少。 如果不会频繁地根据主键列查询数据,那么需要在索引组织表中的其他列上创建额外的索 引。不会频繁根据主键查询表的应用程序不会了解到使用索引组织表的全部优点。对于总是通过 对主键的精确匹配或范围扫描进行访问的表,就需要考虑使用索引组织表。

要诀 可以在索引组织表上建立额外的索引。

2.11.5 反键索引

当载入一些有序数据时,索引可能会碰到一些与 I/O 相关的瓶颈。在数据载入期间,某部分 索引和磁盘肯定会比其他部分使用频繁得多。为了缓解这个问题,可以把索引表空间存放在能够 把文件物理分割在多个磁盘上的磁盘体系结构上。 为了解决这个问题,Oracle 还提供了一种称为反键索引的方法。如果数据以反键索引存储,

72 Oracle Database 11gR2 性能调整与优化

这些数据的值在存储到索引之前先进行反转。这样,数据 1234、1235 和 1236 就被存储成 4321、 5321 和 6321。结果就是索引会为每次新插入的行更新不同的索引块。

要诀 如果您的磁盘数量有限,同时还要执行大量的有序载入,就可以使用反键索引。不可以将反 键索引与位图索引或索引组织表结合使用。

2.11.6 基于函数的索引

可以在表中创建基于函数的索引。如果没有基于函数的索引,任何在列上执行了函数的查询 都不能使用这个列上的索引。例如,下面的查询就不能使用 job 列上的索引,除非它是基于函数 的索引:

select * from emp where UPPER(job) = 'MGR';

下面的查询可以使用 job 列上的索引,但是却不会返回 job 列为 Mgr 或 mgr 值的行:

select * from emp where job = 'MGR';

可以创建这样的索引,允许支持基于函数的列或数据的索引访问。可以对列表达式 UPPER(job) 创建索引,而不是直接在 job 列上建立索引,如下所示:

create index EMP$UPPER_JOB on emp(UPPER(job)); 尽管基于函数的索引非常有用,但在建立它们之前必须先考虑下面一些问题: ● 能限制在这个列上使用的函数吗?如果能,能限制所有在这个列上执行的函数吗? ● 是否有足够的应付额外索引的存储空间? ● 在每列上增加的索引数量会对针对该表执行的 DML 语句的性能带来何种影响? 基于函数的索引非常有用,但在实现时应该小心。在表上创建的索引越多,INSERT、UPDATE 和 DELETE 语句的执行就会花费越多的时间。

注意 为了使优化器使用基于函数的索引,必须把初始参数 QUERY_REWRITE_ENABLED 设定为 true。

参考如下示例,看一下使用基于函数的索引所带来的几个数量级的性能提升,这个示例中有 一个包含 100 万行的 sample 表(您必须先创建 ratio 函数,它不是内置的)。

select count(*) from sample where ratio(balance,limit) >.5;

Elapsed time: 3.61 seconds

第 2 章 索引基本原理(针对 DBA 和初级开发人员) 73

create index ratio_idx1 on sample (ratio(balance, limit));

select count(*) from sample where ratio(balance,limit) >.5;

Elapsed time: 0.07 seconds (快了超过 50 倍)!!!

2.11.7 分区索引

分区索引就是简单地把一个索引分成多个片段。通过把索引分成多个物理片段,可以访问更 小的片段(也更快),并且可以把这些片段分别存放在不同的磁盘驱动器上(避免 I/O 竞争)。B 树索 引和位图索引都可以被分区,而哈希索引不可以被分区。可以有好几种分区方法:表分区而索引 未分区;表未分区而索引分区;表和索引都分区。不管采用哪种方法,都必须使用基于成本的 优化器。分区从多方面使改善性能和提高可维护性成为可能。 有两种类型的分区索引:本地索引和全局索引。每个类型都有两个子类型,有前缀索引和无 前缀索引。一个表可以在它的列上建立任意数量的各种类型(组合)的索引。如果使用了位图索引, 就必须是本地索引。对索引分区最主要的原因是可以减少所需读取的索引的大小,另外把分区放 在不同的表空间中可以提高分区的可用性和可靠性。 Oracle 还支持在分区的表和索引上的并行查询和并行 DML(在第 11 章中有更详细的内容)。 这样就可以同时执行多个进程,从而加快处理这条语句的速度。

1. 本地索引(通常使用的索引)

本地索引是与表使用相同的分区键和范围界限的索引。本地索引的每个分区只包含了它所对 应的表分区中的键值和 ROWID。本地索引可以是 B 树索引或位图索引。如果是 B 树索引,它可 以是唯一或不唯一的索引。 这种类型的索引支持分区独立性,这就意味着对于单独的分区,在不用删除或重建索引的情 况下可以进行添加、截断、删除、分割、脱机等处理。Oracle 自动维护这些本地索引。本地索引 分区还可以被单独重建,而其他分区不会受到影响。

有前缀的索引 有前缀的索引是指包含了分区键并把它们作为索引的前导列的索引。例如,让我们再次回顾 participant 表。在创建该表后,使用 survey_id 和 survey_date 这两个列进行范围分区,然后在 survey_id 列上建立一个有前缀的本地索引,如图 2-6 所示。这个索引的所有分区都被对等划分,也就是说, 索引的分区都使用表的相同范围界限来创建。

要诀 本地的有前缀索引可以让 Oracle 快速剪裁一些不必要的分区。也就是说,没有包含在 WHERE 条件子句中的任何值的分区将不会被访问,这样也提高了语句的性能。

74 Oracle Database 11gR2 性能调整与优化

无前缀的索引 无前缀的索引是指没有把分区键的前导列作为索引的前导列的索引。如果使用有同样分区键 (survey_id 和 survey_date)的相同分区表 participant,建立在 survey_date 列上的索引就是本地的无 前缀索引,如图 2-7 所示。可以在表的任一列上创建本地无前缀索引,但索引的每个分区只包含 表的相应分区的键值。

图 2-6 分区的、有前缀的索引 图 2-7 分区的、无前缀的本地索引

如果要把无前缀的索引设为唯一索引,这个索引就必须包含分区键的子集。在这个例子中, 您需要对包含 survey_date 和(或)survey_id 的列进行组合(只要 survey_id 不是索引的第一列即可, 否则它就是有前缀的索引)。

要诀 对于唯一的无前缀索引,它必须包含分区键的子集。

2. 全局索引

全局分区索引在一个索引分区中包含来自多个表分区的键值。一个全局分区索引的分区键是 与分区表中分区键不同的列或不同的范围。在创建全局分区索引时,必须定义分区键的范围和值。 全局索引只能是 B 树索引。Oracle 在默认情况下不会维护全局索引。在对分区进行截断、添加、 分割、删除等表修改操作的时候,如果没有指定 ALTER TABLE 命令的 UPDATE GLOBAL INDEXES 子句,就必须重建全局分区索引。

有前缀的索引 通常,全局有前缀索引没有与底层表相应的对等分区。全局有前缀索引可以使用与底层表相 应的对等分区,但 Oracle 在生成查询计划或执行分区维护操作时,并不会充分利用对等分区带来 的好处。如果索引被对等分区,就应该把它创建为本地索引,这样 Oracle 可以维护这个索引,并 使用它来剪裁不必要的分区,如图 2-8 所示。在该图的 3 个索引分区中,每个分区都包含指向多 个表分区中行的索引条目。

要诀 如果一个全局索引将被对等分区,就应该把它创建为一个本地索引,这样 Oracle 就可以维护 这个索引,并使用它来剪裁或排除查询中不需要的分区。

无前缀的索引 Oracle 不支持无前缀的全局索引。它们与在相同列上的 B 树索引相比,没有任何优势,所以

第 2 章 索引基本原理(针对 DBA 和初级开发人员) 75

没有必要支持。

图 2-8 分区的、全局有前缀索引

2.11.8 位图连接索引

位图连接索引是基于两个表的连接的位图索引,在数据仓库环境中使用这种索引可以提高连 接维度(Dimension)表和事实(Fact)表的查询的性能。创建位图连接索引时,标准方法是连接索引中 常用的维度表和事实表。当用户在进行事实表和维度表的连接查询时,就不需要执行连接,因为 在位图连接索引中已经有可用的连接结果。通过压缩位图连接索引中的 ROWID 进一步改进性能, 并且减少访问数据所需的 I/O 数量。 创建位图连接索引时,指定涉及的两个表。相应的语法应该遵循如下:

create bitmap index FACT_DIM_COL_IDX on FACT(DIM.Descr_Col) from FACT, DIM where FACT.JoinCol = DIM.JoinCol;

位图连接的语法比较特别,其中包含 FROM 子句和 WHERE 子句,并且引用两个单独的表。 索引列通常是维度表中的描述列—— 如果维度表是 customer,它的主键是在 customer_id 列上,那 么通常索引 customer_name 这样的列。如果事实表名为 sales,可以使用如下命令创建索引:

create bitmap index SALES_CUST_NAME_IDX on SALES(CUSTOMER.Customer_Name) from SALES, CUSTOMER where SALES.Customer_ID=CUSTOMER.Customer_ID;

76 Oracle Database 11gR2 性能调整与优化

如果用户接下来在对 sales 和customer 表的查询中指定 WHERE 子句中的 customer_name 列值, 优化器就可以使用位图连接索引快速返回匹配连接条件和 customer_name 值的行。 位图连接索引的使用是有限制的:只可以索引维度表中的列。用于连接的列必须是维度表中 的主键或有唯一约束的列;如果是复合主键,就必须在连接中使用所有的索引列。不可以对索引 组织表创建位图连接索引,并且适用于常规位图索引的限制也适用于位图连接索引。

2.12 快速重建索引

使用 ALTER INDEX 语句中的 REBUILD 选项,可以使用已有索引而不是整个表快速重建索引:

alter index cust_idx1 rebuild parallel tablespace cust_tblspc1 storage (pctinccrease 0); Index altered.

我们可以同时修改 STORAGE 子句,并且可以使用 PARALLEL 选项。

要诀 利用 ALTER INDEX 语句中的 REBUILD 选项,可以使用已有索引而不是表来快速重建索引。 在执行这个操作时必须有足够的空间来保存所有的索引。

2.13 在线重建索引

您也可以在执行 DML(INSERT/UPDATE/DELETE)语句时创建或重建索引。然而,在 DML 语 句少的时候重建索引会更好些。在 Oracle 11g 之前,在重建索引的开始和结束需要排它锁(Exclusive Lock),这种锁会导致 DML 语句延迟,造成性能的大幅波动。现在这个锁不需要了,在线重建索引 快多了!重建也比先 DROP 后 CREATE 要快。 下面是基本语法:

CREATE INDEX index_name ON table (col1,...) ONLINE; Index created.

ALTER INDEX index_name REBUILD ONLINE; Index altered.

注意索引重建和拼接(Coalesce)索引是不同的,表 2-1 对此做了很好的比较说明。

表 2-1 比较索引的重建和拼接

重 建 拼 接

可以快速地把索引移动到另一个表空间 不能把索引移动到另一个表空间

需要很多空间 空间需求比重建小

创建新的索引树,并能降低其高度 把同一分支下的树叶节点进行合并

可以在不删除索引的情况下改变存储和表空间属性 把树叶节点快速释放以供将来使用

第 2 章 索引基本原理(针对 DBA 和初级开发人员) 77

要诀 还可以在重建索引时使用 REBUILD ONLINE 选项,以允许对表或分区进行 DML 操作。但 不能对位图索引指定 REBUILD ONLINE,对那些强制关联完整性约束的索引也是如此。

要诀 在有很多 DML 操作的时候,在线重建索引在 Oracle 11g 中要比 10g 快很多。

2.14 要诀回顾

● 在升级 Oracle 版本时,确保测试应用程序的查询以确定查询的执行路径是否仍然使用在 升级之前使用的索引。查看执行路径是否改变,并且查看这种改动的效果是更好还是 更差。 ● 查询 DBA_INDEXES 和DBA_IND_COLUMNS 以检索表上的索引列表。使用 USER_INDEXES 和 USER_IND_COLUMNS 检索当前方案的信息。 ● 通过使用不可视索引,您可以通过临时“关闭”索引(使之不可见)来检查查询在没有它 们的情况下的性能。由于索引在不可见期间仍然被维护,因此在需要的时候打开它们(使 之可见)是非常快速而简单的。 ● 避免将 Oracle 的 ROWID 硬编码为特定编码。不同版本的 ROWID 结构会有所不同,而 且在将来的版本里可能还会有所改变。建议不要对 ROWID 进行硬编码。 ● 通过使用 CREATE INDEX 命令的 COMPUTE STATISTICS 子句,可以在一个步骤中创 建并分析索引6。 ● 对表中的列使用默认值子句,这样就可以禁止使用 NULL 值,从而消除与使用 NULL 值 相关的性能问题。 ● 通过使用函数(例如 TO_DATE 或 TO_CHAR)修改所比较的列值而不是列本身,就可以 使用索引,在对列本身使用函数时就会抑制使用这些索引。 ● 比较不匹配的数据类型可能会导致在 Oracle 内部抑制对索引的使用。即使对查询使用 EXPLAIN PLAN,也不能解释为什么会执行全表扫描。 ● 索引的选择性可以帮助基于成本的优化器决定一条执行路径。索引选择性越高,返回的 行数就越少。可以通过建立组合/复合(多列)索引来提高选择性。 ● 通常,数据库块越大,索引的二元高度越小。 ● BLEVEL 中的每个额外级别都会额外增加 DML 的执行成本。 ● 表中的数据集群可以用来提高执行范围扫描类型操作的语句的执行性能。通过判断语句 中是如何使用列的,在这些列上建立索引可以提供很多好处。 ● 对索引或表进行分析可以得到索引的二元高度。使用 USER_INDEXES 视图中的 BLEVEL 列可以检查索引的二元高度。 ● 如果索引中被删除的行数达到了 20%~25%,重建索引可以帮助减少二元高度和在一次 I/O 过程中读取的空闲空间量。 ● 如果表中的数据是偏斜的,直方图可以为基于成本的优化器提供分布图。在那些没有数 据偏斜的列上使用直方图并不会提高性能,反而可能降低性能。

6 译者注:在 Oracle 11g 中,索引的统计信息会在创建的时候自动收集。

78 Oracle Database 11gR2 性能调整与优化

● 默认情况下,Oracle 在一个直方图里创建了 75 个存储桶。这个数目可以指定为 1 到 254 之间的任意值7。 ● 对于有组合索引的大型表来说,索引跳跃式扫描特性可以进行快速访问,即使是索引的 前导列没有出现在限制条件中。 ● 已索引列的值存储在索引中。因此,您可以建立一个组合(复合)索引,这样查询就可以 直接访问这些索引,而不必从表中检索数据,同时也就减少了 I/O。 ● 对于低基数的列可以使用位图索引。性别列就是一个典型的例子,性别只能是男或女(基 数只能为 2)。 ● 查询 USER_INDEXES 视图可以查询位图索引列表。 ● 不要在高负载 OLTP 的环境中使用位图索引;一定要记住位图索引的限制。 ● 在实现哈希集群之前一定要记住相关的注意事项。您需要仔细地检查应用程序,保证在 实现这个选项之前已经知道尽可能多的关于表和数据的信息。通常,哈希对于一些包含 较有序的值的静态数据非常有效。 ● 哈希索引在限制条件指定了确定值而不是范围值时最为有用。 ● 考虑对那些经常通过在主键上指定值或范围扫描来访问数据的表使用索引组织表。 ● 如果磁盘数量,同时还有大量的有序载入操作要执行,反键索引就是可行的方案。 ● 为了在优化器中使用基于函数的索引,必须把初始参数 QUERY_REWRITE_ENABLED 设为 true(默认值为 false)8。 ● 有前缀的本地索引可以帮助 Oracle 快速剪裁不必要的分区。如果分区没有包含在 WHERE 子句中所使用的任何一个值,就可以不用访问分区,这提高了语句的执行性能。 ● 要创建唯一的无前缀索引,它就必须包含分区键的子集。 ● 在修改分区表时指定 ALTER TABLE 命令的 UPDATE GLOBAL INDEXES 子句,默认情 况下,在改变分区表时需要重建全局索引。 ● 如果一个全局索引将被对等分区,就应该把它创建为本地索引,这样 Oracle 可以维护这 个索引,并使用它来剪裁不必要的分区。 ● 使用位图连接索引改进数据仓库环境中连接的性能。 ● 在 ALTER INDEX 语句中使用 REBUILD 选项可以使用已有索引而不是表来快速重建索引。 ● 可以在重建索引时使用 REBUILD ONLINE 选项,以允许对表或分区同时进行 DML 操 作。但不能在位图索引或那些强制关联完整性约束的索引上指定 REBUILD ONLINE 选 项。这个选项在 11g 中改进了很多,性能也提高了很多。

2.15 参考文献

Ask Tom Blog, asktom.oracle.com. “B-tree”, http://www.wikipedia.org/wiki/B-tree#Insertion. Kevin Loney and Bob Bryla, Oracle Database 11g DBA Handbook (Oracle Press, 2007). MOS 文献 39836.1. Rich Niemiec, “Expert Tuning Tips: Beginners Will Be Toast!”, IOUG Conference Paper, 2005.

7 译者注:Oracle 10g 以前会默认为直方图产生 75 个桶,在 10g 和 11g 中根据 Oracle 内部算法决定桶数,最多 254 个桶,收 集统计信息程序包 DBMS_STATS 中对应选项 METHOD_OPT 的默认值是 AUTO。 8 译者注:Oracle 10g 以前该参数默认值是 false,在 10g 和 11g 中是 true。

第 2 章 索引基本原理(针对 DBA 和初级开发人员) 79

Oracle Server Tuning (Oracle Corporation). Greg Pucka, Oracle Indexing (TUSC), Conference Paper, 2003. Server Concepts (Oracle Corporation). Server Reference (Oracle Corporation).

本章原始版本的绝大部分是由 Greg Pucka 编写的,原始版的 10g 更新部分则主要是由 Kevin Loney 完成的。Rich Niemiec 增添了 11g 的新内容,Mike Messina 验证了其中的查询并为 11g 版添 加了 BLEVEL 的详细内容。