xzh2000的博客 本人提供杭州地区Oracle现场技术支持服务,包括性能调整、DataGuard、RAC等。
31 10, 2006
《诛仙7》开看了
作者 xzh2000 14:00 | Permalink 静态链接网址 | Comments 最新回复 (1) | Trackback 引用 (0) | 好书推荐

兽神陨灭、鬼厉火并鬼王、九尾天狐月夜现真身、陆雪琪奉令弑师、四灵血阵图霸天下、张小凡草庙村故地寻根……只有远离熙熙攘攘的人世,也许才能有清静的所在。狐岐山中,恍惚间碧瑶竟似活了过来,或许是鬼厉思念太过而产生幻觉?或许是合欢铃有不为人知的更为强大的法力?面对昏迷不醒的碧瑶和越来越深情的雪琪,甚至面对他自己,鬼厉都感到人生也如同陌生之地的岔路一样迷惘,不知所终。仙魔不过一念间,鬼厉、碧瑶、鬼王、鬼先生、道玄、田不易、上官策、巫妖、九尾天狐、周一仙、小环、野狗道人、陆雪琪、水月……在本集中又有何等表现呢?请阅读萧鼎新作《诛仙七》。

 查看全文
19 10, 2006
偶也订购了ThomasKyte《Oracle9i&10g编程艺术》
作者 xzh2000 16:30 | Permalink 静态链接网址 | Comments 最新回复 (1) | Trackback 引用 (0) | 好书推荐

昨天到华储网上看了Thomas Kyte新作《Oracle 9i & 10g编程艺术》一书的报价,白金会员7.5折;在淘宝网上搜“编程艺术”,找到华储在淘宝上的唯一合作伙伴,直接就可以7.5折购买,立即拍下一本,含运费80.5元。

 查看全文

01 09, 2006
最近在看的书《佛本是道》
作者 xzh2000 18:41 | Permalink 静态链接网址 | Comments 最新回复 (0) | Trackback 引用 (0) | 好书推荐

《佛本是道》:

http://www.booksky.biz/Book.aspx?BookID=4537


24 05, 2006
最近在看的书《七界传说》
作者 xzh2000 00:16 | Permalink 静态链接网址 | Comments 最新回复 (0) | Trackback 引用 (0) | 好书推荐
感觉还是不错的,比较喜欢看玄幻的朋友可以去看看,几乎赶上《诛仙》啦。。。
26 04, 2006
DSI可下载地址及列表
作者 xzh2000 16:10 | Permalink 静态链接网址 | Comments 最新回复 (0) | Trackback 引用 (0) | 好书推荐

401,404
http://www.itpub.net/534858.html
405
http://www.itpub.net/531191.html
408
http://www.itpub.net/532106.html
401,402,403
http://www.itpub.net/420419.html

 查看全文

24 04, 2006
《诛仙6》开看了...
作者 xzh2000 09:50 | Permalink 静态链接网址 | Comments 最新回复 (1) | Trackback 引用 (0) | 好书推荐
http://www.xhsd.net/bookmenu.asp?i=1374
13 12, 2005
12.13南京大屠杀专版悼念
作者 xzh2000 11:46 | Permalink 静态链接网址 | Comments 最新回复 (2) | Trackback 引用 (0) | 好书推荐
  • 楼主 (转贴自天涯社区)
  • 主题:12.13南京大屠杀的祭日就要到了,现发专版悼念![图]

 查看全文

11 11, 2005
我的闲置藏书拍卖[1元拍]
作者 xzh2000 21:06 | Permalink 静态链接网址 | Comments 最新回复 (7) | Trackback 引用 (0) | 好书推荐

我的闲置藏书拍卖啦

http://shop33183918.taobao.com/?catId=4337254&queryType=cat&categoryName=%CE%D2%B5%C4%CF%D0%D6%C3%B2%D8%CA%E9&browseType=table#pagebar

 查看全文
26 09, 2005
OWI性能诊断与调整指南
作者 xzh2000 13:56 | Permalink 静态链接网址 | Comments 最新回复 (3) | Trackback 引用 (0) | 好书推荐

本书详细讲述了如何充分利用革命性的Oracle Wait Interface(OWI)快速确定并解决数据库系统的主要问题和瓶颈,从而极大地提高工作效率。书中包含所有OWI特性的大量细节,包括等待事件视图及其应用,以及扩展的SQL追踪文件。这些宝贵资源有助于您充分利用这个最先进的诊断工具,从而将处理时间减到最少。

 查看全文

27 06, 2005
最近看的书<诛仙>
作者 xzh2000 22:01 | Permalink 静态链接网址 | Comments 最新回复 (1) | Trackback 引用 (0) | 好书推荐
http://read.hjsm.net/book/505/html/1002.html 查看全文
27 06, 2005
最近看的书<恋上毒药>
作者 xzh2000 21:59 | Permalink 静态链接网址 | Comments 最新回复 (0) | Trackback 引用 (0) | 好书推荐
http://yc.book.sohu.com/series_catalog.php?id=5800 查看全文
20 01, 2005
Ora9istatspack高性能调整
作者 xzh2000 16:16 | Permalink 静态链接网址 | Comments 最新回复 (7) | Trackback 引用 (0) | 好书推荐

     自从Oracle第一次发布STATSPACK工具以来,大家对于怎样使用SYAISPACK数据来辅助数据库调整就很关注。与其他大多数Oracle产品不同,STAISPACK没有大张旗鼓地推出,所以大多数Oracle专业人士没有注意到这个强大的新工具,或者说没有意识到使用这个工具进行数据库调整是多么重要。
    STATSPACK是一个简单的工具,它可以将Oracle的统计快照存入Oracle的表中。STATSPACK是Oracle UTLBSTAT-UTLESTAT具程序的后继,这个 UTLBSYATUT工具能够获取一个时期的开始快照和结束快照,并且能够为在这两个快照之间进行的所有数据库活动产生一个报告。
    通常需要将获取的Oracle性能统计数据存人表中。我在1996编写过一个扩展UTLESTAT能的工具,它可以将获取的Oracle数据存人表中,并且发表了一篇有关这个主题的文章。从那个时期起,我就利用这个STATSPACK的前身进行Oracle数据库的远程监视,以及报告数据库的性能。随着STNCK的引人,所有的人现在都有了一个将获取的Oracle统计数据放人表中的标准化机制,Oracle统计数据的历史档案为分析任何所需时段的Oracle性能提供了绝好的机会。更为重要的是,性能统计数据的历史档案可以让DBA编制趋势分析报告,它可以对数据库未来的行为做出预测。
    STATSPACK的基本安装和配置相当简单,但是Oracle仅提供了一个简单的报告来显示从STATSPACK表中获取的信息。因为我曾经有多年的分析表中的Oracle统计数据的经验,所以我能够快速地修改已有的脚本,从STATSPACK表中读取数据并且产生相当有用的报告。
    这些脚本的价值会使这本书物有所值,而且我还介绍了解释STATSPACK输出的详细技术。在本书中,我向读者展示了怎样使用STAISPACK报告来确保正确调整数据库的具体步骤。
    我写本书的目的是将我20年来在数据库调整方面的经验写成一篇数据库调整的综合文献。这是我的第三本有关Oracle调整的书,我收集了大量正确调整数据库时需要深入了解的内容。虽然大量的统计数据非常容易让人头脑糊涂,但是我会尽力强调重点,只向读者展示对改善数据库性能有帮助的信息。
    另外很重要的一点是,这本书引人了一种完全不同的Oracle调整方法。已有的Oracle调整书籍都强调处理即时的性能问题,而本书强调了怎样利用Oracle STATSPACK工具,通过查看数据库的历史趋势和性能模式前瞻性地调整数据库。这种前瞻性的调整方式可以确保对数据库的调整能够满足所有Oracle处理需求,而不是只针对DBA实时注意到的处理需求。
    以许多 Oracle DBA的观点来看,对数据库的性能问题可以做的事情很少。虽然能够使用Oracle Enterprise Manager性能工具包,也可以运行为Oracle v$视图定制的脚本,还可以判断性能瓶颈出现的原因,但是却不能够对实时运行的数据库进行任何改变以改正问题。
    而本书着重于讨论使用Orarle STATSPACK工具收集相关的性能统计信息,并且为DBA提供结构化的方法来查看各种Oracle组件以及观察它们之间的相互作用。前瞻性Oracle调整的目标是避免将来出现性能问题。在Oracle调整中,“忘记昨天,就会重复错误”这句话始终是真理。
    根据我的20年数据库调整经验,我发现这种前瞻性技术是长期调整数据库整体性能的最佳方式。通过使用STATSPACK持续监视数据库性能,并且利用自动脚本提醒异常情况,使我的数据库具有了非常好的性能。我发现可以使用大规模的自动化任务进行Orarle数据库性能调整。
    本书的另一个显著特点是我对书进行了缜密的安排,以使性能之间的依赖关系能够按照正确的顺序组织起来。例如,Oracle数据库内部的Oracle调整不会改善与数据库服务器相关的性能问题。换句话说,服务器性能会直接影响在这个数据库服务器上运行的Oracle数据库的性能。这些依赖性将会涉及数据库服务器、磁盘I/O子系统以及Oracle网络。为了正确地调整Oracle数据库,在开始调整数据库之前,必须处理好这些外部因素。
    另外,辨识Oracle调整的非因果性特性也是很重要的。例如,对单独SQL语句进行调整可以极大地改变这些独立SQL语句的性能,然而,还必须将各个独立SQL语句使用的RAM内存数量与数据库的性能作为一个整体进行权衡。例如,通过使用更多的内部存储可以极大地加速SQL语句的执行,但是这样会牺牲在数据库中执行的其他 SQL语句的性能。
    我还故意推迟了对Oracle数据库设计问题的介绍。这是因为大多数Oracle DBA没有能力重新设计Oracle表,这一点对于已经在产品环境中使用的第三方应用或者内部应用尤其突出。但是,我坚定地认为正确的Oracle设计是Oracle性能至关重要的因素。
    在本书中,我还向读者展示了怎样扩展STATSPACK工具以获得与数据库服务器、磁盘I/O子系统以及Oracle表有关的性能度量。通过向STATSPACK数据库中增加这些因素,Oracle DBA可以得到数据库性能的整体印象。
    这本书与其他Oracle调整书籍的区别在于:
    1)这是第一本讲述使用STATSPACK工具进行Oracle调整的各种方法的书籍。
    2)这本书以前瞻性方式讨论了Oracle调整,与讲述即时反应方法的其他Oracle调整书籍相比,这是一种新方法。通过使用前瞻性方式,Oracle专家能够研究数据库过去的详细性能,井已制定出最适应于他们的Oracle系统处理特性的整体调整策略。
    3)这本书的不同之处还在于它讨论了所有影响Orarle性能的因素。其他的书籍只将它们的讨论限定于Oracle数据库的内部,而本书将会讨论所有相关的环境问题,包括数据库服务器、网络以及磁盘I/O。
    本书将会为Oracle数据库的调整提供完整的方法指导,并且还提供了几十个封装了重要因素的预制STATSPACK脚本,这使得初学者也能够迅速找到性能瓶颈。
    这本书最大的好处在于它简化了Oracle调整,并且扩充了Oracle统计数据的范围。这本书不是对Oracle标准调整技术的再整理。STATSPACK工具的引入改变了Oracle调整的方法,本书重点强调了使用STATSPACK工具来收集、解释以及改正Oracle性能问题的方法。
    除了日常的Oracle调整之外,读者还能学会怎样使用STATSPACK收集当前的性能信息,以用于警告机制、趋势分析以及长期资源规划。我希望本书能够成为你的Oracle调整工具库中不可缺的帮手。
 

 前言

第一部分 方法和工具概述

第1章 Oracle调整概述

1.1 整体调整方法
1.1.1 服务器调整
1.1.2 网络调整
1.1.3 磁盘调整
1.1.4 实例调整
1.1.5 对象调整
1.1.6 SQL调整
1.1.7 用Oracle并行查询进行调整
1.1.8 调整实际应用簇
1.2 Oracle和STATSPACK
1.3 小结

第2章 STATSPACK概述

2.1 STATSPACK体系结构
2.2 STATSPACK怎样收集数据
2.3 STATSPACK的表结构
2.3.1 STATSPACK控制表
2.3.2 STATSPACK参数表
2.4 STATSPACK信息使用
2.4.1 使用STATSPACK进行数据库调整
2.4.2 资源规划
2.4.3 预测模型
2.5 小结

第3章 安装和配置STATSPACK

3.1 STATSPACK脚本概述
3.1.1 Oracle8和Orace8i的STATSPACK脚本
3.1.2 Oracle 8.1.6后STATSPACK的STATSPACK脚本
3.2 步骤1:创建perfstat表空间
3.3 步骤2:运行创建脚本
3.3.1 运行Oracle 8.1.7前版本安装脚本
3.3.2 安装先决条件
3.4 步骤3:测试STATSPACK安装
3.5 步骤4:规划自动STATSPACK数据收集
3.6 STATSPACK的配置和维护
3.7 调整STATSPACK收集阈值
3.7.1 快照级别
3.7.2 快照阈值
3.8 将STATSPACK用于Oracle 8.0到8.1.5
3.9 删除旧有的STATSPACK快照
3.9.1 使用STATSPACK清除工具
3.9.2 人工删除STATSPACK快照
3.9.3 快照的删除范围
3.9.4 清除快照的智能UNIX脚本
3.10 便于使用的STATSPACK Shell脚本
3.10.1 一个快捷的经过时间的STATSPACK脚本
3.10.2 监视STATSPACK表范围
3.11 小结

第4章 STATSPACK表中的数据

4.1 STATSPACK遗漏的内容
4.2 STATSPACK附属表结构
4.3 STATSPACK总计表
4.3.1 Oracle9i STATSPACK表的改变
4.3.2 stats$latch_misses_summary表
4.3.3 stats$sgastat_summary表(只适于Oracle8i)
4.3.4 stats$sql_summary表
4.3.5 stats$parameter表
4.4 STATSPACK系统表
4.4.1 Stats$rollstat表
4.4.2 stats$latch表
4.4.3 stats$latch_children表
4.4.4 stats$librarycache表
4.4.5 stats$waitstat表
4.4.6 stats$enqueuestat表
4.4.7 stats$sysstat表
4.4.8 stats$sesstat表
4.4.9 stats$sgastat表
4.5 STATSPACK事务表
4.5.1 stats$buffer_pool表(只适用于Oracle9i以前版本)
4.5.2 stats$buffer_pool_statistics表
4.5.3 stats$filestatxs表
4.6 STATSPACK事件表
4.6.1 Stats$system event表
4.6.2 Stats$session_event表
4.6.3 stats$bg_event_summary表
4.6.4 stats$idle_event表
4.7 Oracle并行服务器表(实际应用簇)
4.7.1 stats$rowcache_summary表
4.7.2 stats$sgaxs表
4.8 小结

第二部分 使用STATPACK调整Oracle数据库

第5章 扩展STATSPACK收集服务器统计

5.1 工具概述
5.1.1 各种vmsta的不同之处
5.1.2 在中可以得到什么
5.1.3 使用vmstat识别CPU瓶颈
5.1.4 使用--识别频繁使用的CPU
5.1.5 识别RAM内存瓶颈
5.1.6 理解UNIX RAM内存分页
5.2 在STATSPACK中获取服务器性能数据
5.2.1 获取信息的脚本
5.2.2 vmstat获取脚本的内部结构
5.2.3 报告其他Oracle服务器上的vmstat信息
5.3 小结

第6章 调整服务器环境

6.1 数据库管理员和系统管理员之间的关系
6.2 在线服务器监视工具
6.2.1 使用glance
6.2.2 使用top监视服务器
6.2.3 使用sar监视服务器统计
6.3 监视服务器CPU消耗
6.4 升级整个服务器
6.4.1 增加附加的CPU处理器
6.4.2 服务器任务负载平衡
6.4.3 使用nice和priocntl改变执行优先级
6.5 监视服务器内存消耗
6.5.1 服务器内存设置
6.5.2 非常大的内存和Oracle
6.5.3 使Oracle内存不可交换
6.6 报告服务器统计
6.6.1 服务器异常报告
6.6.2 日常vmstat趋势报告
6.6.3 长期服务器分析和趋势
6.7 小结

第7章 调整网络环境

7.1 优化Oracle NET配置
7.1.1 proocol.ora中的tcp.noddny参数
7.1.2 sqlnet.ora的automatic_ipc参数
7.1.3 tnsnam.ora中的SDU和TDU参数
7.1.4 listener.cia中的queuesize参数
7.1.5 sqlnet.ora的break_poll_skip参数
7.1.6 sqlnet.ora的disabe_oob参数
7.1.7 epc_disabled环境变量
7.2 其他影响网络行为的Orale特性
7.2.1 使用阵列获取来提高网络吞吐量
7.2.2 使用多线程服务器
7.2.3 连接共享和网络性能
7.2.4 ODBC和网络性能
7.2.5 调整Oracle复制
7.3 从Oracle STATSPACK中监视网络性能
7.4 调整分布式网络
7.5 小结

第8章 使用STWIPACK调整磁盘I/O子系统

8.1 影响磁盘I/O的Oracle调整因素
8.2 Oracle内部结构和磁盘I/O
8.2.1 Oracle文件组织技术
8.2.2 瞬时磁盘热点
8.3 映射Oracle磁盘结构
8.3.1 多RAM缓冲区问题
8.3.2 对Oracle进行文件条带化
8.3.3 对Oracle使用RAID
8.3.4 使用具有原始设备的Oracle
8.3.5 Oracle数据库的磁盘负载平衡
8.3.6 配置Oracle表空间和数据文件
8.3.7 建立Oracle文件到磁盘的体系结构
8.3.8 报告Oracle磁盘体系结构
8.4 SYATSPACK报告Orale数据文件
8.4.1 使用STATSPACK报告详细的磁盘和文件I/O
8.4.2 有关特定I/O活动的STATSPACK报告
8.4.3 识别热点数据文件的STATSPACK脚本
8.4.4 定位热点磁盘的方法
8.5 扩充STATSPACK以用于磁盘I/O数据
8.5.1 基本iosta工具
8.5.2 定义STATSPACK表
8.5.3 获取iostat信息
8.5.4 产生iostat报告
8.6 使用STATSPACK查看I/O特性
8.7 小结

第三部分 用STATPACK调整Oracle数据库

第9章 调整Oracle数据库实例

9.1 Oracle数据库实例概述
9.1.1 OracleSGA
9.1.2 Oracle后台进程
9.1.3 块大小和Oracle磁盘I/O
9.1.4 db_file_multiblork_read_coot和Oracle
9.2 调整Oracle7到Oracle 8i数据缓冲区
9.2.1 数据块高速缓存介绍
9.2.2 完全数据缓存
9.2.3 数据缓冲区命中率
9.2.4 数据缓冲池内部结构
9.2.5 使用STATSPACK监视数据缓冲池的使用
9.2.6 Oracle 8i数据池概述
9.2.7 定位KEEP池的表和索引
9.2.8 调整RECYCLE池
9.2.9 为RECYCLE池识别候选
9.3 使用STATSP进行数据缓冲区命中率趋势报告
9.4 调整Oracle 9i数据缓冲池
9.5 调整Oracle 8.0数据库写入器进程
9.6 监视Orale 8i和Oracle 9i中的数据库写入器争用
9.7 调整共享池
9.8 调整库高速缓存
9.8.1 监视库高速缓存缺失率
9.8.2 使用STATSPACK监视库高速缓存内的对象
9.9 调整数据字典高速缓存
9.10 调整Oracle排序
9.11 调整撤销记录(回滚段)
9.12 监视到Oracle的专用连接
9.13 UNIX与多线程服务器交互
9.14 Oracle 9i动态RAM与UNIX
9.14.1 Oracl 9i和UNIX区组
9.14.2 改变动态SGA和PGA组件
9.15 Oracle 9i的专用连接PGA存储器分配
9.15.1 Oracle 9i中的自动RAM内存管理
9.15.2 自调整Oracle 9i数据库
9.16 小结

第10章 调整Oracle表和索引

10.1 Oracle 9i中的自动空间管理
10.1.1 Oracle中的位图演化
10.1.2 Oracle 9i自由表算法
10.1.3 位图段管理特征
10.1.4 Oracle 9i自由表内部结构
10.1.5 自动空间管理的Oracle 9i工具
10.2 传统Oracle存储参数及性能
10.2.1 pctfree存储参数
10.2.2 pctused存储参数
10.2.3 freelists存储参数
10.2.4 OPS使用的freelist group存储参数
10.2.5 存储参数规则小结
10.3 传统自由表管理和Oracle对象
10.3.1 自由表中的链接与去除链接
10.3.2 减少自由表的重链接
10.4 表内部结构和自由表
10.5 根据数据行平均长度设置pctfree和pctused
10.6 缓冲区忙等待和自由表争用
10.6.1 利用STATSPACK发现等待争用
10.6.2 利用STATSPACK发现缓冲区忙等待
10.7 重组Oracle表
10.8 识别带有链接行的Oracle表
10.8.1 识别带有长行的表
10.8.2 识别稀疏表
10.9 为提高操作性能对Oracle表中的数据行重新排序
10.10 索引重建技术
10.10.1 何时需要重建索引
10.10.2 自动索引重建
10.11 识别Oracle 9i中的未用索引
10.11.1 监视会话的例子索引
10.11.2 用隐含参数调整索引争用
10.12 利用STATSPACK监视Oracle表和索引
10.12.1 分配STATSPACK扩展表
10.12.2 收集表和索引的STATSPACK快照
10.12.3 生成表和索引的报告
10.12.4 通过E-mail发布表报告
10.13 小结

第11章 调整Oracle SQL

11.1 SQL调整的目标
11.2 说明性SQL语法的问题
11.3 OracleSQL优化器
11.3.1 optimizer_mode=RULE
11.3.2 optimizer_mode=FIRST_ROWS
11.3.3 optimizer_mode=ALL_ROWS
11.3.4 optimizer_mode=CHOOSE
11.4 利用基于规则的优化进行调整
11.4.1 改变基于规则的驱动表
11.4.2 基于规则的优化器何时无法使用正确的索引
11.5 使用基于成本的优化进行调整
11.5.1 启用基于成本的优化器
11.5.2 为CBO收集统计数据
11.6 确定默认的optimizer_mode设置
11.7 其他的调整技术
11.7.1 带CBO SQL提示的调整
11.7.2 调整SQL子查询
11.7.3 文字性SQL语句的问题
11.7.4 在Oracle8i中使用cursor_sharing参数
11.7.5 带临时表的SQL调整
11.7.6 通过添加索引调整SQL
11.7.7 编写高效率SQL的一般原则
11.8 SQL调整过程
11.8.1 步骤1:识别库缓存中影响大的SQL
11.8.2 步骤2:提取并解释SQL语句
11.8.3 步骤3:调整SQL语句
11.9 SQL调整中实际案例分析
11.10 高级SQL运行方案分析
11.11 保存SQL调整的永久性改变
11.12 使用V$sql_plan和v$sql_workarea视图
11.13 小结

第12章 利用Oracle并行特性进行调整

12.1 使用Oracle并行查询
12.1.1 并行查询参数
12.1.2 设置优化并行度
12.1.3 使用并行查询提示
12.2 监视Oracle并行查询
12.2.1 利用STATSPACK监视Oracle并行查询
12.2.2 利用v$视图监视Oracle查询
12.2.3 并行查询和分布式对象
12.2.4 查找Oracle并行查询的候选表
12.3 使用并行DML
12.3.1 启用并行DML
12.3.2 Oracle表重组的并行化
12.3.3 并行索引的重建
12.4 小结

第13章 Oracle并行服务器环境的调整

13.1 Oracle簇服务器系统结构介绍
13.2 RAC数据分区
13.3 Oracle7到Oracle 8i的集成分布式锁管理器
13.4 对OPS环境的Oracle表设置
13.5 调整OPS环境
13.6 监视OPS的STATSPACK表
13.6.1 stats$rowache_summary表
13.6.2 stats$sgaxs表
13.6.3 stats$sysstat表
13.7 扩展STATSPACK以获取OPS信息
13.8 查询Oracle并行服务器的v$视图
13.9 比较实际应用簇和Oracle并行服务器
13.10 小结

第四部分 利用STATSPACK进行数据库报告

第14章 利用STATSPACK监视Oracle

14.1 标准STATSPACK报告
14.1.1 前言段
14.1.2 等待事件段
14.1.3 SQL段
14.1.4 表空间活动段
14.2 报警脚本程序概述
14.3 为DBA定制的异常警告报告
14.3.1 STATSPACK警告日报
14.3.2 服务器警告报告
14.3.3 Oracle问题的实时检测
14.3.4 对象增长周报
14.3.5 跟踪报警报告
14.3.6 Web服务器警告报告
14.3.7 缓冲区忙等待警告
14.4 STATSPACK反应报告
14.5 安排和定制Oracle报警报告
14.6 小结

第15章 利用WPACK进行趋势分析

15.1 利用Microsoft Excel绘制STATSPACK数据的图形
15.1.1 利用电子表格图表向导绘制STATSPACK数据图形
15.1.2 步骤1:定制STATSPACK报告
15.1.3 步骤2:在SQL*Plus中运行报告
15.1.4 步骤3:高亮显示并复制结果
15.1.5 步骤4:打开MS-Excel并粘贴数据
15.1.6 步骤5:将数据划分成数据列
15.1.7 步骤6: 数据分栏
15.1.8 步骤7:启动图表向导
15.1.9 步骤8:选择线条图
15.1.10 步骤9:完成图表向导并查看图表
15.1.11 步骤10:添加趋势线
15.2 用于预测的STATSPACK报告
15.2.1 用于趋势分析的基本STATSPACK度量
15.2.2 用于数据库服务器趋势分析的STATSPACK扩展
15.2.3 检查服务器以小时为单位的趋势
15.2.4 绘制一周中各天服务器统计数据的图表
15.3 基于Web的STKISPACK数据图形绘制
15.3.1 RRDtool工具
15.3.2 基于Web的其他绘图工具
15.4 STATSPACK浏览器产品
15.5 小结
 


20 01, 2005
Oracle 9i性能调整[好书]
作者 xzh2000 15:35 | Permalink 静态链接网址 | Comments 最新回复 (6) | Trackback 引用 (0) | 好书推荐



本书全面系统地介绍了在Oracle 9i环境中维持高性能的各种方法和技巧。本书由TUSC公司的CEO,Richard J.Niemiec亲笔撰写,其丰富的Oracle咨询和调试经验使得本书成为性能优化类书籍中的“权威”。书中以详尽的实例向读者展示了性能调整的最佳方案,并深入剖析了Oracle 9i中新引入的性能调整选项。
    本书主要内容:
·在不同情况下选择最佳的索引选项
·将重要的数据文件分布到各个可用的硬盘
·使用关键的init.ora参数优化数据库性能
·充分利用Oracle Enterprise Manager
·使用EXPLAIN、TRACE、TKPROF、STORED OUTLINES和其他工具
·根据需要使用提示,以改写优化器设置
·使用PL/SQL存储过程执行自动查询
·使用Parallel Executions Option(PEO)改进性能
·使用STATSPACK监视和调整数据库
·查询V$视图和X$表  

第1章 Oracle9i——Oracle9i新特性介绍(针对DBA和开发人员)

1.1 新的Oracle9i管理特性
1.1.1 迁移注意事项
1.1.2 不支持SVRMGRL和Connect Internal
1.1.3 DBCA和SYS账户安全性的增强
1.1.4 服务器参数文件
1.1.5 Automatic Undo Management
1.1.6 可恢复的空间分配
1.1.7 默认的临时表空间
1.1.8 Oracle托管的文件
1.1.9 动态内存管理
1.1.10 支持多种数据库块大小
1.1.11 游标共享
1.1.12 自调整的PGA
1.1.13 联机重定义表
1.1.14 其他管理特性
1.2 新的Oracle9i体系结构特性
1.2.1 新的分区选项和特性
1.2.2 对象元数据的提取
1.2.3 段空间自动管理
1.2.4 新的索引特性
1.3 新的Oracle9i数据仓库特性
1.3.1 外部表
1.3.2 视图约束
1.3.3 多表INSERT语句
1.4 新的Oracle9i SQL和PL/SQL特性
1.4.1 关联数组
1.4.2 Oracle的CASE语句和表达式
1.4.3 Oracle的MERGE语句
1.4.4 对ANSI/ISO SQL 1999规范的支持
1.4.5 其他的SQL和PL/SQL特性
1.5 新的Oracle9i备份和恢复特性
1.5.1 快速启动故障恢复(基于时间)
1.5.2 闪回查询
1.5.3 新的RMAN特性
1.5.4 新的Log Miner特性
1.5.5 Oracle9i Data Guard
1.6 实时应用群集(Real Application Clusters,RAC)
1.6.1 并行数据库
1.6.2 Oracle的RAC体系结构
1.6.3 Oracle RAC系统的内部运行机制
1.6.4 SCN处理
1.6.5 小结
1.7 技巧回顾

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

2.1 基本的索引概念
2.2 组合索引
2.3 Oracle ROWID
2.4 限制索引
2.4.1 使用不等于操作符(<>、!=)
2.4.2 使用IS NULL或IS NOT NULL
2.4.3 使用函数
2.4.4 比较不匹配的数据类型
2.5 选择性
2.6 群集因子(Clustering Factor)
2.7 二元高度(binary height)
2.8 使用柱状图
2.9 快速全局扫描
2.10 跳跃式扫描
2.11 索引的类型
2.11.1 B-树索引
2.11.2 位图索引
2.11.3 HASH索引
2.11.4 索引编排表
2.11.5 反转键索引
2.11.6 基于函数的索引
2.11.7 分区索引
2.12 快速重建索引
2.13 技巧回顾

第3章 磁盘I/O和碎片(针对DBA)

3.1 使用磁盘阵列
3.1.1 可用的RAID级别
3.1.2 简化安装和维护
3.1.3 磁盘阵列是否一直可用
3.1.4 考虑代价
3.2 在可用的磁盘之间分布关键数据文件
3.2.1 分开存储数据和索引文件
3.2.2 避免I/O磁盘争用
3.2.3 通过移动数据文件来均衡文件I/O
3.3 使用本地托管的表空间
3.3.1 创建本地托管的表空间
3.3.2 把字典托管的表空间迁移到本地托管的表空间
3.3.3 使用Enterprise Manager查看文件/表空间的信息
3.4 使用分区来避免磁盘争用
3.4.1 获得关于分区的更多信息
3.4.2 其他类型的分区
3.4.3 其他分区选项
3.5 使用索引分区
3.6 导出分区
3.7 消除碎片
3.7.1 使用正确的扩展大小
3.7.2 创建一个新表空间并把数据移到其中
3.7.3 导出和重新导入表
3.7.4 正确设定比例以避免链化现象
3.7.5 重建数据库
3.8 使用撤消管理
3.8.1 确定重做日志文件的大小是否存在问题
3.8.2 确定日志文件的大小和检查点的时间间隔
3.8.3 增加恢复的可能:在每次批处理后提交
3.9 使用回滚段
3.9.1 避免回滚段之间的争用
3.9.2 监控回滚段的等待和争用
3.9.3 增加回滚段
3.9.4 把大的事务隔离到它们自己的回滚段上
3.10 更简便的方法:UNDO表空间
3.11 结束有问题的会话
3.12 通过内存排序来减少磁盘I/O
3.13 在不同磁盘和控制器上存放多个控制文件
3.14 对写操作频繁的数据使用裸设备来提高I/O
3.14.1 使用裸设备的好处
3.14.2 使用裸设备的缺点
3.15 磁盘I/O的其他注意事项和提示
3.16 设计阶段需要注意的问题
3.17 技巧回顾

第4章 用初始他参数调整数据库(针对DBA)

4.1 重要的init.ora参数
4.2 不用重启就修改init.ora文件
4.3 用Enterprise Manager查看init.ora参数
4.4 调整DB_CACHE_SIZE来提高性能
4.4.1 在调整DB_CACHE_SIZE时使用V$DB_CACHE_ADVICE
4.4.2 保证数据缓存命中率超过95%
4.4.3 监控V$SQLAREA视图以查找较慢的查询
4.5 设定DB_BLOCK_SIZE来优化数据读取量的大小
4.5.1 调整SHARED_POOL_SIZE以优化性能
4.5.2 使用Oracle的多个缓冲池
4.5.3 调整PGA_AGGREGATE_TARGET以优化对内存的应用
4.5.4 修改SGA大小以避免分页和交换
4.5.5 了解OPTIMIZER_MODE:基于代价和基于规则的优化
4.5.6 创建足够的调度程序
4.5.7 25个重要的初始化参数
4.5.8 未记录入档的init.ora参数
4.5.9 了解典型的服务器
4.5.10 典型的服务器模式
4.6 技巧回顾

第5章 Enterprise Manager和调整包(针对DBA和开发人员)

5.1 Enterprise Manager控制台
5.2 Instance文件夹
5.2.1 实例管理——状态窗口
5.2.2 实例管理——启动选项
5.2.3 实例管理——初始化参数
5.2.4 实例管理——检查单个会话
5.2.5 实例管理——Memory Advisor
5.3 Schema文件夹
5.3.1 模式管理——检查特定的表
5.3.2 模式管理——检查特定的索引
5.3.3 模式管理——检查SYS信息
5.3.4 模式管理——检查包、过程和触发器
5.4 Security文件夹
5.5 Storage文件夹
5.6 Oracle SQL Scratchpad和SQL*PLUS表
5.7 Performance Manager
5.7.1 Performance Manager——Database Health Overview图表
5.7.2 Performance Manager——缓冲区缓存命中率
5.7.3 Performance Manager——库缓存命中率
5.7.4 Performance Manager——数据字典缓存命中率
5.7.5 Performance Manager——SQL区域
5.7.6 Performance Manager——内存排序命中率
5.7.7 Performance Manager——系统I/O率
5.7.8 Performance Manager——数据库实例信息
5.7.9 Performance Manager——构建自定义的图表
5.7.10 Performance Manager——Top图表和会话
5.8 Oracle调整包——SQL Analyze
5.8.1 SQL Analyze——EXPLAIN PLAN
5.8.2 SQL Analyze——执行统计
5.8.3 SQL Analyze——比较不同的计划
5.8.4 SQL Analyze——调整向导
5.9 索引调整向导
5.10 Oracle调整包——Oracle Expert
5.10.1 Oracle Expert——模式调整
5.10.2 Oracle Expert——为调整会话设定规则
5.10.3 Oracle Expert——进行修改并测试影响
5.10.4 Oracle Expert——检查建议
5.10.5 Oracle Expert——了解建议的细节
5.10.6 Oracle Expert——所建议的系统范围内的修改
5.11 Oracle调整包——表空间映射
5.12 Oracle Expert分析报告
5.13 商务影响报告
5.13.1 服务级别的报告
5.13.2 应用程序运行状况评估
5.14 技巧回顾

第6章 实用工具简介(针对DBA和开发人员)

6.1 Oracle的TRACE实用程序
6.1.1 对简单查询使用TRACE的简单步骤
6.1.2 TRACE输出部分
6.1.3 更复杂的TKPROF输出
6.1.4 深入探讨TKPROF输出
6.1.5 单独使用EXPLAIN_PLAN
6.1.6 EXPLAIN PLAN——从上至下读取和从下至上读取
6.1.7 阅读EXPLAIN PLAN
6.1.8 另一种EXPLAIN PLAN输出方法:构建树结构
6.1.9 另一个使用树的例子
6.1.10 在开发产品中利用TRACE/EXPLAIN发现有问题的查询
6.1.11 PLAN_TABLE表中的重要列
6.1.12 Oracle支持的一些有用的程序包
6.1.13 适用于未记录入档的TRACE操作的INIT.ORA参数
6.1.14 使用Stored Outline
6.2 技巧回顾

第7章 基本的提示句法(针对DBA和开发人员)

7.1 最常用的提示
7.1.1 谨慎使用提示
7.1.2 首先修正设计方案
7.2 可用的提示和分组
7.2.1 改变执行路径
7.2.2 使用访问方法提示
7.2.3 使用查询转换提示
7.2.4 使用连接操作提示
7.2.5 使用并计执行
7.2.6 其他提示
7.3 指定提示
7.4 指定多个提示
7.5 使用别名
7.6 使用提示
7.6.1 使用CHOOSE提示
7.6.2 使用RULE提示
7.6.3 使用FIRST_ROWS提示
7.6.4 使用ALL_ROWS提示
7.6.5 使用FULL提示
7.6.6 使用INDEX提示
7.6.7 使用NO_INDEX提示
7.6.8 使用INDEX_JOIN提示
7.6.9 使用AND_EQUAL提示
7.6.10 使用INDEX_COMBINE提示
7.6.11 使用INDEX_ASC提示
7.6.12 使用INDEX_DESC提示
7.6.13 使用INDEX_FFS提示
7.6.14 使用ORDERED提示
7.6.15 使用LEADING提示
7.6.16 使用ORDERED_PREDICATES提示
7.6.17 使用ROWID提示
7.6.18 使用NO_EXPAND提示
7.6.19 使用DRIVING_SITE提示
7.6.20 使用USE_MERGE提示
7.6.21 使用USE_NL提示
7.6.22 使用USE_HASH提示
7.6.23 使用PUSH_SUBQ提示
7.6.24 使用PARALLEL提示
7.6.25 使用NOPARALLEL提示
7.6.26 使用APPEND提示
7.6.27 使用NOAPPEND提示
7.6.28 使用CACHE提示
7.6.29 使用NOCACHE提示
7.6.30 使用CLUSTER提示
7.6.31 使用HASH提示
7.6.32 使用CURSOR_SHARING_EXACT提示
7.7 使用提示可能遇到的问题
7.8 提示一览表
7.9 技巧回顾

第8章 调整查询(针对初级DBA和开发人员)

8.1 查询V$SQLAREA和V$SQL
8.1.1 在V$SQLAREA视图中选出最占用资源的查询
8.1.2 在V$SQL视图中选出最占用资源的查询
8.2 确定何时使用索引
8.3 遗忘索引
8.4 创建索引
8.5 查看表上的索引
8.6 正确当地建立索引
8.7 修正差的索引
8.8 在SELECT和WHERE中使用索引
8.9 使用快速全局扫描
8.10 使查询魔术般加速
8.11 在内存中缓存表
8.12 使用多个索引(利用最佳选择性)
8.13 使用索引合并
8.14 处理受限制的索引
8.15 使用基于函数的索引
8.16 了解“古怪”的OR
8.17 使用EXISTS函数
8.18 技巧回顾

第9章 表的连接和其他高级调整技术

9.1 连接方法
9.1.1 嵌套循环连接
9.1.2 排序合并连接
9.1.3 群集连接
9.1.4 哈希连接
9.1.5 索引连接
9.2 表连接的初始化参数
9.2.1 排序合并连接参数
9.2.2 哈希连接参数
9.3 比较主要的连接方法
9.4 双表连接:等尺寸表(基于代价)
9.5 双表索引连接:等尺寸表(基于代价)
9.6 强制执行特殊的连接方法
9.7 在多表连接中除去连接记录(候选行)
9.8 在大小不同的表间进行双表连接
9.9 三表连接
9.10 位图连接索引
9.11 第三方性能调整工具
9.12 调整分布式查询
9.13 一切就绪
9.14 各种调整技术摘要
9.14.1 实时应用群集(Real Application Clusters,RAC)
9.14.2 RedHat炙手可热:Linux造成的改变
9.14.3 外部表
9.14.4 数据快照太旧:开发人员的编程难题
9.14.5 设置事件以转储每次等待
9.14.6 数据块转储:最后的建议(仅针对最高级的DBA)
9.15 使用简单的数学方法调整性能
9.15.1 传统的数学分析
9.15.2 方法论的七个步骤
9.15.3 模式分析
9.15.4 数学方法总结
9.16 更多的数学方法:应用控制理论
9.17 技巧回顾

第10章 使用PL/SQL提高性能(针对DBA和开发人员)

10.1 使用DBMS_APPLICATION_INFO进行实时监控
10.2 在数据库的表中记录计时信息
10.3 减少PL/SQL程序的单元迭代和迭代的时间
10.4 使用ROWID进行迭代处理
10.5 将数据类型、IF语句的排列和PLS_INTEGER标准化
10.5.1 确保比较运算中的数据类型相同
10.5.2 根据条件出现的频率来排序IF条件
10.5.3 使用PLS_INTEGER PL/SQL数据类型进行整数运算
10.6 减少对SYSDATE的调用
10.7 减少MOD函数的使用
10.8 在共享池中固定对象
10.8.1 将PL/SQL对象语句固定(缓存)到内存中
10.8.2 固定所有的包
10.9 标识需要固定的PL/SQL对象
10.10 使用和修改DBMS_SHARED_POOL_SIZES
10.11 从DBA_OBJECT_SIZE中获取详细的对象信息
10.12 发现无效的对象
10.13 发现己禁用的触发器
10.14 将PL/SQL表用于快速参考表查询
10.15 查找和调整所使用对象的SQL
10.16 在处理DATE数据类型时使用时间信息
10.17 调整和测试PL/SQL
10.18 了解PL/SQL对象定位的含义
10.19 使用回滚段打开大型游标
10.20 使用数据库的临时表来提高性能
10.21 集成用户跟踪机制以定位执行位置
10.22 限制动态SQL的使用
10.23 为初学者提供的例子
10.23.1 创建PL/SQL代码
10.23.2 创建过程
10.23.3 执行PL/SQL过程
10.23.4 创建函数
10.23.5 在SQL中执行GET_CUST_NAME函数
10.23.6 创建数据包
10.23.7 在数据库触发器中使用PL/SQL
10.24 技巧回顾

第11章 使用并行特性提高性能(针对DBA)

11.1 并行操作的基本概念
11.2 并行DML和DDL语句和操作
11.3 Oracle 9i的并行DML语句和操作
11.4 并行处理和分区
11.5 操作内部和操作之间的并行处理
11.6 使用并行操作生成表和索引的示例
11.7 并行DML语句和示例
11.7.1 并行DML的约束条件
11.7.2 并行DML语句示例
11.8 通过V$视图监控并行操作
118.1 V$PQ_TQSTAT
11.8.2 V$PQ_SYSSTAT
11.8.3 V$PQ_SESSTAT
11.9 在并行操作时使用EXPLAIN PLAN和AUTOTRACE
11.10 调整并行执行和Oracle 9i初始化参数
11.11 并行加载
11.12 性能比较和监控并行操作
11.13 使用并行处理时的其他注意事项
11.14 技巧回顾

第12章 V$视图(针对DBA和开发人员)

12.1 V$视图的创建和访问
12.1.1 获得所有V$视图的数量和列表
12.1.2 查找用于创建V$视图的X$表
12.1.3 查找组成DBA视图的底层对象
12.1.4 使用有帮助的V$脚本
12.1.5 内存分配摘要(V$SGA)
12.1.6 内存分配的细节($SGASTAT)
12.1.7 在V$PARAMETER中发现init.ora的设置
12.1.8 测定数据的命中率(V$SYSSTAT)
12.1.9 测定数据字典的命中率(V$ROWCACHE)
12.1.10 测定共享SQL和PL/SQL的命中率(V$LIBRARYCACHE)
12.1.11 确定需要固定的PL/SQL对象
12.1.12 通过V$SQLAREA查找有问题的查询
12.1.13 检查用户的当前操作及其使用的资源
12.1.14 查找用户正在访问的对象
12.1.15 使用索引
12.1.16 确定锁定问题
12.1.17 关闭有问题的会话
12.1.18 查找使用多会话的用户
12.1.19 查找磁盘I/O问题
12.1.20 查找回滚段的内容
12.1.21 检查空闲列表是否充足
12.1.22 检查角色和权限设置
12.1.23 V$视图的种类
12.2 技巧回顾

第13章 X$表(针对高级DBA)

13.1 X$表介绍
13.1.1 有关X$表的误解
13.1.2 授权查看X$表
13.2 创建V$视图和X$表
13.3 获得所有X$表的列表
13.4 获得所有的X$索引列表
13.5 对X$表和索引使用提示
13.6 共享池
13.7 监控共享池的查询
13.7.1 ORA-04031错误
13.7.2 空间分配过大而引起的争用
13.7.3 碎片化
13.7.4 共享池和/或Java池中空闲内存过低
13.7.5 库缓存命中率
13.7.6 大量的硬解析
13.7.7 门锁等待和/或休眠
13.7.8 其他调整选项
13.8 重做
13.9 初始化参数
13.10 缓存/数据块
13.10.1 缓存状态
13.10.2 占用数据块缓存的段
13.10.3 热数据块/门锁争用和等待事件
13.11 实例/数据库
13.12 高效使用X$表及其策略
13.13 相关的Oracle内部机制
13.13.1 跟踪
13.13.2 事件
13.13.3 转储
13.13.4 Oradebug
13.14 X$表的分组
13.15 X$表及相关的非V$固定视图
13.16 常见的X$表连接
13.16.1 9i中新增的X$表
13.16.2 未记录入档的固定视图
13.16.3 未来版本的影响
13.17 技巧回顾

第14章 使用STATSPACK调整等待和闩锁(针对高级DBA)

14.1 安装STATSPACK
14.1.1 PERFSTAT账户的安全管理
14.1.2 安装之后
14.1.3 搜集统计数据
14.1.4 运行统计数据报表
14.2 解释STATSPACK的输出结果
14.2.1 报表头信息
14.2.2 负载简档
14.2.3 实例的效率
14.2.4 首要等待事件
14.2.5 首要的SQL语句
14.2.6 实例活动统计数据
14.2.7 表空间和文件I/O的统计数据
14.2.8 其他的内存统计数据
14.2.9 回滚/撤消统计数据
14.2.10 门锁统计数据
14.2.11 数据字典和库缓存的统计数据
14.2.12 SGA内存统计数据
14.2.13 非默认的init.ora参数
14.3 STATSPACK输出结果中需首先查看的十项内容
14.3.1 管理STATSPACK数据
14.3.2 更新STATSPACK
14.3.3 删除STATSPACK
14.4 技巧回顾

第15章 执行快速系统检查(针对DSA)

15.1 总体性能指数(TPI)
15.2 教育性能指数(EPI)
15.3 系统性能指数(SPI)
15.4 内存性能指数(MPI)
15.4.1 缓冲区命中率
15.4.2 数据字典缓存命中率
15.4.3 库缓存命中率
15.4.4 内存排序命中率
15.4.5 空闲的数据缓冲区的比例
15.4.6 最浪费内存的前十个语句占所有语句的比例
15.4.7 调整前25个最浪费内存的语句
15.4.8 固定/缓存对象
15.5 磁盘性能指数(DPI)
15.5.1 调整滥用磁盘读操作的25个主要语句
15.5.2 最浪费磁盘读操作的前十个语句占所有语句的比例
15.5.3 表/索引的分离
15.5.4 关键任务表中的链接
15.5.5 分离关键的Oracle文件
15.5.6 回滚段的平衡
15.5.7 临时段的平衡
15.6 总体性能指数(TPI)
15.7 系统综合检查的示例
15.7.1 评级系统
15.7.2 系统检查评级分类的示例
15.7.3 需要立刻解决的问题项
15.7.4 其他需要解决的问题项
15.8 系统信息列表
15.8.1 与内存有关的值
15.8.2 与磁盘有关的值
15.8.3 与CPU有关的值
15.8.4 与备份和恢复有关的信息
15.8.5 命名约定和/或OFA标准以及安全信息
15.8.6 DBA知识评级
15.9 技巧回顾

第16章 使用UNIX工具监控系统(针对DBA)

16.1 UNIX工具
16.1.1 使用sar命令监控CPU的使用
16.1.2 使用top命令发现系统中最影响性能的用户
16.1.3 使用uptime命令监控CPU的负载
16.1.4 使用mpstat命令确定CPU瓶颈
16.1.5 将ps命令与已选出的V$视图相结合
16.1.6 使用sar命令监控磁盘I/O问题
16.1.7 使用iostat确定磁盘I/O瓶颈
16.1.8 使用sar命令和vmstat命令监控分页/交换
16.1.9 使用ipcs命令确定共享内存的使用情况
16.1.10 使用vmstat命令监控系统的负载
16.1.11 监控磁盘空闲空间
16.1.12 监控网络性能
16.2 技巧回顾

附录A 主要的init.ora参数(针对DBA)

A.1 不再支持的init.ora参数
A.2 不建议使用的init.ora参数
A.3 25个最重要的init.ora参数
A.4 必须记住的最重要的十个init.ora参数
A.5 最重要的13个未入档的init.ora参数
A.6 已入档的init.ora参数列表(V$PARAMETER)
A.7 未入档的init.ora参数列表(x$ksppi/x$ksppcv)
A.8 不写书的十个重要原因
A.9 技巧回顾

附录B V$视图(针对DBA和开发人员)

B.1 V$视图、GV$视图和X$表的创建
B.2 Oracle9i(9.2.0.1.0)的GV$视图
B.3 Oracle9i(9.2.0.1.0)的V$视图
B.4 用于创建V$视图的X$表的Oracle 9i脚本

附录C X$表(针对DBA)

C.1 按名称排序的Oracle9i X$表
C.2 Oracle9i X$索引
C.3 交叉引用V$视图的Oracle9i X$表
C.4 交叉引用X$表的Oracle9i GV$视图
C.5 GV$视图没有引用的Oracle9i X$表


07 01, 2005
PL/SQL的编码规则[转贴]
作者 xzh2000 19:04 | Permalink 静态链接网址 | Comments 最新回复 (0) | Trackback 引用 (0) | 好书推荐
应遵循的PL/SQL编码规则
http://www.net130.com 发布日期:2004-6-6
 

应遵循的PL/SQL编码规则

作者:Steven Feuerstein

提高编写PL/SQL代码数量及质量的四个简单易行指导方针

我从1990年就开始编写PL/SQL代码。这意味着我已经编写了几万行的软件代码,但我确信,其中的绝大多数代码都非常拙劣,而且难以维护。

幸运地是,我发现找到并遵循编写出更好代码的新方法还为时不晚。就是在去年,我的代码质量有了显著改进;这些改进主要是由于制定了一些简单的规则,并像纪律一样加以遵守。

本文为PL/SQL新手及有经验的开发人员提出了四条建议;遵守其中任何一条,你的代码质量都会有提高。这四点建议都采纳,你可能会惊奇地猛然发现:你竟然是一个非常好的程序员,要远远超乎你的想象。

所有工作都独自完成

我们很少有人是孤立工作的;大多数PL/SQL开发工作是在相对较大的机构中进行的。但我们基本上还是在自己的小隔间里用自己的设备独自工作。几乎没有PL/SQL开发小组进行正规的代码复查或系统测试。

我不可能通过这篇文章改变你们开发小组的基本状态。因此,我仔细地选取出以下几点建议。实施其中任何一点并不需征得管理人员同意。不论你的小组是大是小,都不必让其中的每个人都赞同这些编码规则。你只需按以下建议来改变你的本人的编码方式:

1. 严格遵循命名约定,好像它们就是你的生命支柱。
2. 戒除编写SQL的嗜好:编写的SQL越少越好。
3. 使执行部分短小:告别"意大利面条式的代码"。
4. 找一位伙伴:非常赞同找个人来监督你的工作。

1. 遵循命名约定

如果你建立并严格遵循一套命名约定,特别是对于应用程序组件的,你就可以节省很多时间。

当然,遵循命名约定的想法并没有什么新意,你可能已经听烦了。所以我并不提出什么宏伟的命名计划,而是给出一些非常具体而明确的约定,然后证明这些约定会多么有用。

前几个月我一直在为PL/SQL开发人员设计、构建一种新工具。它名为Swyg(可以在www.swyg.com中找到),可以帮助程序员完成代码的生成、测试及重用的工作。它具有几个独特的组件。我为每个组件指定了一个由两个字母组成的缩写名称,如下所示:

SF-Swyg的基础部件
SM-Swyg的元数据
SG-Swyg的生成程序
SL-Swyg的代码库
ST-Swyg的单元测试

于是,我便遵循表1中的命名约定,同时使用这些缩写。遵循这些约定有什么好处呢?一般来讲,如果我要求一致的命名规则,我就可以更流畅更高效地编写代码。

明确地说,这些约定具有可预测性,意思是说我编写的SQL程序能生成有用的脚本。例如,通过使用表1中的约定,可以生成Swyg中所有基础包的安装脚本。执行这些工作的SQL*Plus脚本如清单1所示。这类脚本非常有用,因为它意味着我不必手动维护安装脚本。当我向Swyg方案中增加另一个表,并生成一组相关包时,我只要运行我的脚本,更新后的安装脚本便会跳出来。

2. 戒除编写SQL的嗜好

编写的SQL越少越好,这似乎与我们的直觉不太一致。对于PL/SQL开发人员来说,这是一个奇特的建议,因为PL/SQL的主要优点之一就是可以毫不费力地在代码中编写SQL语句。不过,这种简易性也是这种语言的一个致命的弱点。

可以将纯粹的SQL语句直接置于PL/SQL代码中,而无需JDBC或ODBC之类的中间层。因此,无论何时何地,PL/SQL开发人员只要需要SQL语句,他们通常就会向其应用程序代码中嵌入SQL语句。那么这样做有什么问题吗?

在PL/SQL代码中到处使用SQL语句必然会导致以下后果:

 

尽管实际表现不同,但同一逻辑语句仍会出现重复,从而导致过多的语法分析,且难于优化应用程序的性能。
暴露商务规则和方案。这直接在SQL语句中包含了执行商务规则的逻辑。这些规则总在变化,所以应用程序的维护成本会急剧增加。
 

当然,你要编写的每一个PL/SQL应用程序几乎都是基于基础表和视图的。你需要执行SQL语句。问题不在于是否执行,而是何时执行、如何执行。

如果你对数据结构进行封装,或者将它们隐藏于一个PL/SQL代码层(通常是一个代码包)之后,那么你的应用程序将会更健壮,而且你还会发现创建和维护变得更易多了。

我们来看一个简单的例子。 假定我需要编写一个处理某员工工作的程序。第一件事是获取该员工的全名,定义为"姓名逗号(,)姓";然后我可以进行详细分析。清单2给出了这种情况下我很可能要编写的这类代码的一个示例。

一切似乎都是这么简单和直接;这些代码可能会有什么错误呢?实际上真是非常糟糕。最主要的是我暴露了一个商务规则:全名的结构。我可能要花费数小时来对此代码及其所基于的应用程序进行测试。但就在它刚刚投入使用时,我才知道客户会不断地打电话告诉我,实际上,他们的全名应该表示为"名空格姓"。

现在怎么办?搜索所有位于引号内的单个逗号?

现实的解决方案是使用隐藏所有细节、只提供一组预定义、预测试及预优化并能完成所有任务的程序包。清单3为基于封装代码重新编写的process_employee过程。hr_employee_tp包提供了用于定义保存姓名的局部变量的类型;hr_employee_rp包含有基于一种商务规则而返回全名的函数。

将显示PL/SQL语句灌入SQL代码很容易,同样,谈论封装这些语句是如何重要也不费劲。但另一方面,编写执行封装任务的代码却具有挑战性;甚至是不现实的。生成这些包或许更有意义。

几年前,我曾帮助构建这样一个生成程序。该程序段为PL/Generator,现在由Quest Software公司拥有,PL/SQL开发社区可以免费使用。你可以从我的网站www.StevenFeuerstein.com/puter/gencentral.htm下载。要知道,其封装体系结构与我在前面所概括的约定不同。PL/Generator创建了一个单独的包,它包含了一个表的类型、查询和变化逻辑的全部内容。

当你不再编写太多的SQL,而是调用执行SQL的程序时,无论你是生成还是编写自己的定制封装,你的应用程序都会受益匪浅。

3. 使执行部分短小

面对现实吧:总是与我们的判断和最新的一系列新年决议相左,我们必须停止编写意大利面条式的代码:庞大而冗长,人们实际上不可能理解它们,更不用说维护或升级了。怎样才能避免"意大利面条"呢?

实际上,答案很简单:决不允许执行部分超过50或60行。这种大小使你能在一页纸或一个屏幕上查看该代码块的整个逻辑结构,这也意味着你可以真实地领会该程序的意图,而且完全凭直觉就能理解它。

你可能非常同意上述观点,但同时又嘲笑我的建议:程序代码永远不超过50行。没错,你应当嘲笑,因为这当然是不可能的。毫无疑问,你需要超过50行的可执行代码;问题是你把这些代码放在哪,以及你怎样加以组织。

如果采取以下做法,你的确能够应对各种复杂的要求,并把代码限制在50行以内:

将所有的商务规则和离散逻辑块置于其自已的程序(通常是函数)中,从而在任何可能的时候慎重地重用代码。
尽量使用在程序的声明部分定义的局部模块、过程和函数。
假定我在编制一个呼叫中心应用程序。我需要编写一个程序,它要满足下面的要求:

"对于特定部门的每个员工,将其工作量(分派给该员工的呼叫次数)同该部门员工的平均工作量进行比较。如果某员工的工作量低于平均工作量,便将下一待处理呼叫分派给此人,并基于这种情况安排约定。"

我从以前的工作中获悉:我的朋友Claudia已经编写了一个分析包,它会返回工作量方面的信息。但是分派待处理呼叫和安排约定都是全新的工作,需求文档的其余部分对此进行了详细说明。

最初我想把这15页的内容全都看完,但我没有那样做。我使用了一种称为"逐步求精法"或"由顶向下设计"的技术,并先编写了清单4中的代码来实现该程序。

下面给出了清单4中最关键代码行的解释;由该程序(紧凑的执行部分)的最后开始,向上进行。这似乎有悖于直觉,但这的确是通读用逐步求精法编写的程序的最好方式。

第22~30行。用一个游标FOR循环(cursor FOR loop)来对指定部门的所有员工进行迭代处理。在第24~25行,利用分析包中的程序判定当前的员工是否工作量不足。在第27~28行,调用三个程序:assign_next_open_case、schedule_case和next_appointment。我还不知道怎样实现这些程序,但我知道它们通过其名称和参数表表达了需要事先完成的工作。

第10~19行。为第27~28行中的三个程序创建"stub",也就是占位程序。注意,它们是局部模块,在assign_workload中进行定义,且不能从其他任何程序调用。

第5~8行。定义一个游标,以获得指定部门的所有员工。现在可以设法编译此代码。

对这样一个小程序成功完成编译好像是个小胜利,也的确如此。完成正确编译,然后是简单测试,然后增加一点代码,再进行正确编译,以此类推,诸如此类的小胜利缔造出构造精良的程序,而且会非常满意。

我还可以验证该分析程序是有效的,并且找出了要分派的任务适当雇员。这些工作全部完成后,我将从三个程序中挑出一个,比如assign_next_open_case,进行下一步或下一级别的精细设计。我要阅读该任务的文档,并在assign_next_open_case里编写一个简短的执行部分,它可反映该任务的概况。

很快,我的局部过程有了它自己的局部过程和函数,但在该过程的每一步,我的代码都很短、可读、易于测试、可根据需要进行调整。

4. 找一位好伙伴

计算机并不会编程,人才会。

有多少次你弯着腰、驼着背坐在计算机前,因无法找出代码中的错误而感到非常郁闷?先是几分钟过去了,接着又过了几小时。最后,对自己都厌烦了,感到非常失败,你把头伸出你的小隔间并请朋友过来帮你看一看。

通常会有下面三种情况之一出现:

当你的朋友从她的椅子上站起来时,一切都在瞬间变得非常清楚。
你的朋友瞥了一眼屏幕,马上就指出了问题所在。
你的朋友不负责该系统中你所做的部分,所以你必须说明你的程序在干什么。当你逐步讲解逻辑时,引起错误的问题所在会突然暴露在你面前。
事实就是自己很难调试自己的代码,因为你自己对它太投入、太专注了。


这个问题最好的解决办法是由开发经理创造这样一种文化:各种想法是共享的、不懂是可以原谅的并不会受到处罚、定期进行建设性的代码评审。不幸的是,这些文化上的改变是难以实现的。

与此同时,我建议在帮助改变你所在小组的文化的过程中你应起带头作用。找到另一位开发人员,最好比你经验丰富,并建立一种"伙伴"关系:在出现问题时,他可以充当你的参谋,当然,你也可以充当他的参谋。事前达成共识:不知道所有问题的答案并没有什么不对。

然后为你自己制定一条简单的规则:不要为一个错误苦思冥想超过半个小时。30分钟过去后,把你的伙伴叫过来,让人类心理学为你服务,而不是跟你作对。

获得一种新工作方式的四个步骤

本文为你提供了可以采取的用于改变你的编程体验四个步骤,而无须投资新的工具或改变整个小组的工作流程。这四步甚至可以不全部遵循,只要遵守一步都会让你受益。

Steven Feuerstein (steven@stevenfeuerstein.com) 是PL/SQL语言方面的一位权威人士。Feuerstein撰写了9本有关PL/SQL (全部由O'Reilly & Associates出版公司出版)的书籍,其中包括《Oracle PL/SQL最佳实践(Oracle PL/SQL Best Practices)》和《Oracle PL/SQL编程(Oracle PL/SQL Programming)》。他还是Quest Software公司的资深技术顾问。

对象名称结构注释生成(DDL)文件
_表名,如SM_TASK,用于在普通的Mentat组件中定义的任务。_.tab
主键列id标准是:(几乎)每个表都包含一个按一个序列生成的id列。对于交叉表等有一些例外。N/A
用于生成主键的序列__seq用于一个表主键的序列名,如SG_SCRIPT_SEQ,它为Mentat产生脚本表生成一个新主键。_.seq
查询封装包__qp包含用以在基础表(如SL_SOURCE_QP)中检索数据的标准API,它有助于在Mentat可重用库中查询各元素的源代码。说明:__qp.pks
主体:__qp.pkb
改变封装包__cp包含用以改变(INSERT、UPDATE、DELETE)某基础表(如ST_UNITTEST_CP)中的数据的标准API,它使我能够维护单元测试定义。说明:__cp.pkb
主体:__cp.pks
类型封装包__tp包含用于指定表(如SG_GEN_RUN_TP)的预定义类型--包括集合、REF CURSORS、记录。说明:__tp.pks
主体:NA (type definitions do not need a package body)
规则封装包__rp包含程序,通常是函数,它隐藏了关系到该实体的商务规则的细节。说明:__rp.pks
主体:__rp.pkb
其他物件包__xp包含特定实体的自定义逻辑。说明:__xp.pks
主体:__xp.pkb

 

关键字
  • 是由两个字母组成的缩写。对于Swyg,它可以是SF、SM、SG、SL或ST。
  • 是商务实体名,如TASK用于定义某人要完成任务列表;SCRIPT用于代码生成模板;等等。

1246
27 12, 2004
Oracle性能优化科学与艺术
作者 xzh2000 14:49 | Permalink 静态链接网址 | Comments 最新回复 (3) | Trackback 引用 (0) | 好书推荐

第1章 性能优化的挑战

1.1 为什么要进行性能优化
1.2 编写本书的原因
1.3 本书读者对象
1.4 读者的好消息
1.5 医师到魔术师的方法
1.5.1 可适应性的需要
1.5.2 理解而非技巧
1.5.3 避免猜测
1.5.4 银弹
1.5.5 解决错误问题
1.5.6 揭露一个大秘密
1.5.7 与Oracle保持同步更新
1.6 艺术还是科学
1.7 预优化
1.8 小结

第2章 许多优化策略失败的原因

2.1 失败的策略
2.2 不完善的性能优化方法
2.2.1 银弹方法
2.2.2 偷工减料
2.2.3 快速培训班
2.2.4 偏爱的思想
2.2.5 解决错误的问题
2.2.6 猜测法
2.2.7 避免责备
2.2.8 其他障碍
2.3 小结

第3章 Oracle医师

3.1 定义问题
3.1.1 确定需求
3.1.2 定义需求的艺术
3.1.3 世忌孤军奋战
3.1.4 Oracle医生的“就职誓言”
3.1.5 无需太多的技术
3.2 找到主诉症状
3.2.1 “数据库是坏的”
3.2.2 仔细倾听
3.2.3 适时地问一些问题
3.2.4 查看所展示的问题
3.2.5 必要时寻求帮助
3.3 小结

第4章 处理人际关系

4.1 性能优化问题中的人为因素
4.2 DBA的角色
4.2.1 集中解决客户的问题
4.2.2 采取一个积极的方法
4.2.3 建立相互信任的人际关系
4.2.4 准确地报告问题
4.2.5 避免傲慢的态度
4.2.6 承担责任
4.2.7 避免责备
4.2.8 询问问题
4.2.9 接受批评
4.3 小结

第5章 Oracle侦探

5.1 验证问题的存在
5.1.1 问题确实存在吗
5.1.2 检查基本信息
5.1.3 错误消息
5.1.4 在控制环境下重新运行应用程序
5.1.5 检查运行日志
5.1.6 查询V$SQL视图以找到SQL语句
5.1.7 未使用绑定变量所带来的问题
5.1.8 采用工具监控应用程序
5.1.9 监视活动和非活动会话
5.2 量化问题
5.2.1 需要关注的问题
5.2.2 方法
5.2.3 生成跟踪文件
5.2.4 计时信息
5.2.5 许可及文件大小
5.2.6 TKPROF
5.3 注意所有异常因素
5.4 小结

第6章 收集更多的线索

6.1 等什么
6.2 等待事件的类型
6.3 视图概述
6.3.1 V$EVENT_NAME
6.3.2 V$SYSTEM_EVENT
6.3.3 V$SESSION_EVENT
6.3.4 V$SESSION_WAIT
6.4 使用系统事件10046进行跟踪
6.5 等待事件的使用例子
6.6 重要的警告
6.6.1 不是数据库引起的延迟
6.6.2 无法监测CPU时间
6.6.3 没有监测到的逻辑读
6.6.4 时间精确度
6.7 小结

第7章 Oracle病理学家

7.1 隔离根本原因
7.2 找出性能降低的根源
7.2.1 找出真正的原因
7.2.2 性能预算
7.3 简化
7.4 分治法
7.4.1 分化SQL代码
7.4.2 简化表连接
7.5 活动时间表方法
7.6 性能问题的常见原因
7.6.1 应用程序设计
7.6.2 数据库设计
7.6.3 init.ora参数
7.6.4 批处理任务的干扰
7.6.5 硬件
7.7 寻找根本原因的其他建议
7.7.1 简单的计时测试
7.7.2 大的结果集
7.8 小结

第8章 分析SQL瓶颈

8.1 SQL优化的作用
8.1.1 SQL分析人员的好消息
8.1.2 SQL分析的其他好处
8.2 使用新的数据库功能
8.2.1 需要重新学习一些内容
8.2.2 更改过程中的稳定性
8.2.3 工具集中的新工具
8.3 从哪儿开始
8.3.1 查看统计数字
8.3.2 产生新的统计数字
8.3.3 确保运行的SQL可实现预期的功能
8.3.4 查看结果集的大小
8.3.5 各种优化过程入口的汇总
8.4 Oracle执行计划
8.4.1 获得执行计划
8.4.2 准备使用EXPLAIN PLAN功能
8.4.3 运行EXPLAN PLAN语句
8.4.4 执行计划的内容
8.4.5 Oracle提供的其他脚本
8.4.6 使用SQL *Plus AUTOTRACE获得执行计划
8.4.7 解释执行计划
8.5 视图和过滤
8.6 子查询
8.7 SQL优化的其他技巧
8.7.1 对象浏览工具
8.7.2 索引浏览工具
8.7.3 注意全表扫描
8.7.4 不要忽略逻辑读
8.7.5 指导开发人员
8.7.6 考虑缓存效果
8.8 计划表更为高级的功能
8.9 小结

第9章 分析SQL连接

9.1 什么是连接
9.1.1 等值连接和θ连接
9.1.2 内连接
9.1.3 外连接
9.2 连接技巧
9.2.1 嵌套循环
9.2.2 排序合并
9.2.3 哈希连接
9.2.4 群集连接
9.3 连接优化
9.3.1 选择合适的连接
9.3.2 SQL提示
9.4 分析连接的图形化方法
9.4.1 显示表和连接条件
9.4.2 列出过滤统计数字
9.4.3 开始连接
9.4.4 继续连接
9.4.5 多个条件
9.4.6 处理到大表的连接
9.5 影响连接的init.ora参数
9.6 其他连接主题
9.6.1 连接远程表
9.6.2 笛卡尔积
9.6.3 数据仓库的特殊连接
9.7 小结

第10章 病理学家的工具箱:其他策略

10.1 分析缓慢的数据库
10.1.1 是否每个人都觉得性能很慢
10.1.2 是否能够将问题归结于一部分原因
10.2 找出最差的症状
10.2.1 监视活动会话
10.2.2 确保没有阻塞会话
10.2.3 彻底检查网络
10.2.4 查看资源消耗大户
10.2.5 磁盘等待时间
10.2.6 查看参数极值的设置
10.2.7 留心分布式查询
10.3 操作系统工具
10.3.1 top
10.3.2 uptime
10.3.3 sar
10.3.4 sar选项
10.3.5 使用sar查找历史记录
10.3.6 iostat
10.3.7 vmstat
10.3.8 Windows操作系统中的工具
10.4 Oracle Statspack
10.4.1 安装Statspack
10.4.2 使用PERFSTAT快照
10.4.3 运行Statspack报告
10.4.4 报告示例
10.4.5 基础信息
10.4.6 缓存大小
10.4.7 加载简档
10.4.8 实例效率
10.4.9 前五个等待事件
10.4.10 与前台进程相关的所有等待事件
10.4.11 与后台进程相关的所有等待事件
10.4.12 实例统计
10.4.13 表空间统计数字
10.4.14 文件I/O统计数字
10.4.15 缓冲池统计数字
10.4.16 实例恢复统计数字
10.4.17 PGA聚集内存统计数字
10.4.18 PGA内存统计数字
10.4.19 回滚段统计数字
10.4.20 回滚段存储
10.4.21 撤销段摘要
10.4.22 闩锁活动
10.4.23 SGA内存摘要
10.4.24 init.ora参数
10.4.25 删除过时的快照数据
10.4.26 使用Statspack的建议
10.5 其他技巧
10.5.1 Oracle 9i对Statspack的改进
10.5.2 后台揭密:快照的实际工作
10.6 小结

第11章 Oracle艺术家

11.1 绘制解决方案
11.1.1 常规解决方案
11.1.2 更为复杂问题的解决方案:特殊的性能策略
11.2 Oracle Bug
11.2.1难道处处都有 Bug
11.2.2 找出大Bug:报警
11.2.3 TAR的麻烦世界
11.2.4 其他排除Bug的方法
11.3 新的优化选项
11.3.1 Database Resource Manager
11.3.2 物化视图
11.3.3 查询改写
11.4 “不可能”的问题
11.4.1 与其他Oracle专业人员联系
11.4.2 咨询系统管理员
11.4.3 Metalink
11.4.4 Oracle论坛
11.4.5 白皮书
11.4.6 有用的Web网站
11.5 小结

第12章 艺术家的调色板

12.1 SQL提示
12.1.1 何时使用SQL提示
12.1.2 如何使用提示
12.1.3 优化器模式提示
12.1.4 表和索引提示
12.1.5 连接提示
12.1.6 特殊的SQL提示
12.1.7 SQL提示疑难解分析
12.1.8 语法注意事项
12.2 PGA自动内存管理
12.2.1 设置PGA目标
12.2.2 PGA目标的优化
12.2.3 使用新的PGA参数
12.2.4 估算PGA需求
12.2.5 特殊的PGA视图
12.2.6 特殊的PGA术语
12.2.7 监视PGA内存优化
12.2.8 计算新的PGA内存目标
12.3 柱状图
12.3.1 柱状图需求
12.3.2 柱状图的样式
12.3.3 Oracle风格的柱状图
12.3.4 生成柱状图的传统方法
12.3.5 生成柱状图的新方法
12.3.6 查看柱状图
12.3.7 柱状图的局限性
12.4 小结

第13章 Oracle魔术师

13.1 设置舞台
13.1.1 测试解决方案
13.1.2 考虑对产品系统的影响
13.1.3 保存现有系统
13.2 挥动魔棒
13.2.1 念动咒语!让所有不满意的用户消失
13.2.2 确定性能变化
13.2.3 检查统计数据
13.2.4 观察意外出现的结果
13.3 如果犯了错
13.3.1 是否是正确的修正
13.3.2 系统如何不同
13.3.3 捕获相关的SQL
13.4 做好收尾工作
13.4.1 将解决方案记录入档
13.4.2 性能改进日志
13.4.3 结束与客户的交流
13.5 下一步操作
13.5.1 公布所学的内容
13.5.2 创建性能公文夹
13.6 小结

第14章 案例分析

14.1 为什么要花时间进行案例分析
14.2 使用案例分析
14.3 小结

附录A 有用的V$视图定义


博客日历
« 五月 2012 »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
搜索
最新发表
文章分类
文章归档
网站链接
新闻聚合