在本教程中,您将在几个阶段中分析并执行 C 程序以了解 Oracle OBDC 驱动程序的特性和功能。
您将学习如何创建和使用报告(ADDM 报告 — Automatic Database Diagnostic Monitor,以及 AWR 报告 — Automatic Workload Repository)以对示例应用程序的性能和瓶颈问题进行分析。随着报告的运行,您分几个阶段来分析和优化示例程序。最终将产生一个高效的应用程序。
大约 60 分钟。
开始本教程之前,您应该:
1. | 安装 Oracle Database 11g 第 2 版(如果尚未安装) |
|
2. | 安装 ODBC 驱动程序。 |
|
3. | 下载 odbclab.zip 文件并将其解压缩到您的工作目录(即 /home/oci/odbclab)中。 |
在本教程中,您将采用分步方式分几个阶段来运行和优化应用程序。从未经过优化的代码开始,每个阶段通过使用语句缓存、客户端结果集缓存等特性为这个未经优化的阶段添砖加瓦,最终使程序性能得以改善。几个阶段展示了 LOB 处理以及通过一个引用游标进行获取等特性。
AWR 报告和 ADDM 报告
Automatic Workload Repository (AWR) 是每个 Oracle Database 中内置的一个信息库。Oracle Database 定期生成所有重要统计信息和负载信息的快照并将这些快照存储在 AWR 中。
Automatic Database Diagnostic Monitor (ADDM) 能让 Oracle Database 对自身的性能进行诊断并确定可以解决所发现问题的方法。每次进行 AWR 统计捕获之后会都会自动运行该监视程序,从而使性能诊断数据随时可用。
要运行这些报告,可以使用本教程提供的 reports.sql 脚本。在您要查看的每个阶段中,由相应的 C 文件生成的可执行文件以及一些额外的参数将传递给该脚本 (reports.sql)。
ODBC 概述
这里使用 ODBC 驱动程序的 C 源代码文件名为 stage1.c、stage2.c、stage3.c、stage4.c、stage5.c 和 stage6.c,另外还有一个名为 helper.c 的通用库文件,这里所有的阶段都将使用它。这些文件存放于 /home/oci/odbclab 位置。示例 ODBC 应用程序
示例应用程序使用 odbchol/welcome 模式。它生成随机编号,模拟 Web 输入来更新和查询 MYEMP 表。
在 odbchol 模式中定义了以下对象:
MYEMP 表的定义为:
CREATE TABLE myemp ( empno number(4) primary key, ename varchar2(10), job varchar2(9), mgr number(4), hiredate date, sal number(7,2), comm number(7,2), deptno number(2)) ;
为了演示 LOB 特性,定义了下表:
CREATE TABLE lob_table( article_no number(5), article_nm varchar2(50), article_text clob, comments clob) LOB(article_text) STORE AS SECUREFILE (TABLESPACE SYSAUX COMPRESS low CACHE), LOB(comments) STORE AS SECUREFILE (TABLESPACE SYSAUX COMPRESS low CACHE) ;
在该 ODBC 应用程序中使用了以下三个过程:
其主要的 C 函数为:
要对各个阶段的源代码进行编译和链接,可以使用 make 实用程序。
ODBC 安装和使用
按照以下步骤建立和安装 Unix ODBC driver manager。
本节不进行任何优化。这里 main 线程生成所请求数量的线程,并且以一个线程函数 (thread_function()) 作为每个线程开始时应调用的初始例程。“main”线程生成新线程。
每个线程执行以下操作:
然后将这些线程合并起来,计算并输出所有查询的性能统计信息。
. |
打开一个终端窗口。 转到 /home/oci/odbclab 目录下,启动 SQL*Plus。以 system 用户身份登录。使用口令“manager”。 查看 stage1.c 文件的内容。可使用一个文本编辑器来查看内容。 注意:如果当前的工作环境为 Linux,可能需要更改权限以便执行 stagen 文件。为此,在命令提示符处执行以下命令: chmod 777 stage* exit
|
---|---|
. |
使用 gmake 实用程序生成 stage1 源代码的 C 可执行程序和库。打开一个终端窗口,转到(用“cd”命令)阶段文件所在位置 (/home/oci/odbclab),执行 gmake 实用程序。 cd $HOME/oci/odbclab gmake stage1
|
. |
reports.sql 脚本存放在 $HOME/oci/odbclab/sql 目录中。在一个新的终端会话中,转到 $HOME/oci/odbclab/sql 目录。 cd $HOME/oci/odbclab/sql 启动 SQL*Plus。在您的 SQL*Plus 会话中,运行 reports.sql 脚本。将 stage1 文件传递给该脚本。添加参数,指定迭代 10 次以增加负载并生成结果,将线程数设置为 10。 (注意:我们有意将迭代次数设置为 10 这么一个较低的值,目的是节省此练习的时间。而对于此阶段生成的固有的报告,迭代次数设置为 1000。) @reports.sql "../stage1 -i 10 -t 10" 报告运行时会显示完成百分比。
|
. |
当提示输入报告名称时,请输入: stage1_odbc 这会生成两个报告,它们保存在当前目录中:
每个阶段都会为您提供生成的示例结果。这些文件位于 /home/oci/odbclab/doc 子文件夹下。这些示例结果文件名为:
注意:由于环境不同,您的结果可能会与提供的示例结果不同。为了本教程内统一起见,我们查看的是生成的示例结果。
|
. |
查看 stage1_results_addm.txt 报告内容。 (您可以在一个文本编辑器中打开该文件,也可以在您的 SQL*Plus 会话中向上滚动查看该文件) 注意 Summary of Findings 部分。
|
. |
查看 stage1_results_awr.htm 报告内容。 找到位于 /home/oci/odbclab/doc 子文件夹下的 stage1_results_awr.htm 文件。双击文件名,在浏览器中打开该文件(或右键单击并选择 Open with "Web-Browser" 选项)。 查看该报告。 向下滚动到 Main Report。单击 SQL Statistics 链接。 注意 Elapsed Time 统计信息。随着您经历每个阶段并采用不同的调优方法,这些数值将改变(将改善)。
|
本节将使用数组 fetch 和可滚动游标选项来优化 C 代码。在此阶段中,使用一个数组执行多行获取,该数组针对每次获取可保存 ARRAY_SIZE 行。除了 multirow_fetch() 函数之外,此阶段的其余代码与 stage1 代码相同。
multirow_fetch() 函数通过一个以 FETCH_LOOP 计数的循环获取成倍的 ARRAY_SIZE(定义于函数自身中)个记录行。在该程序中,ARRAY_SIZE 设置为 3,意味着该程序一次获取 3 行。在第一次循环中获取首个 3 行,在第二次循环中获取第二个 3 行,继续下去直到命中 FETCH_LOOP 计数。
此阶段包含一个新的名为 scrollable_cursor 的函数,意在展示在 ODBC 中对可滚动游标选项的使用,并说明如何使用这些选项来获取数据。此函数中使用以下选项:SQL_FETCH_NEXT、SQL_FETCH_PRIOR、SQL_FETCH_FIRST、SQL_FETCH_LAST、SQL_FETCH_ABSOLUTE 和 SQL_FETCH_RELATIVE。
. |
查看 stage2.c 文件的内容。 找到 /home/oci/odbclab 目录下的 stage2.c 文件。 右键单击 stage2.c 文件,选择 Open with "Text Editor" 选项。 在 stage2.c 中使用了数组 fetch 和一些可滚动游标选项。
|
---|---|
. |
使用 gmake 实用程序生成 stage2 源代码的 C 可执行程序和库。打开一个终端窗口,转到(用“cd”命令)阶段文件所在位置 (/home/oci/odbclab),执行 gmake 实用程序。 cd $HOME/oci/odbclab
gmake stage2
|
. |
在终端窗口中执行 stage2 文件。 同时指定迭代参数 500,线程参数 30,指定 verbose 选项以输出详细信息。 ./stage2 -i 500 -t 30 -v 注意:此阶段未生成 AWR 和 ADDM 报告,因为使用了可滚动游标。 |
在本节中,您将启用语句缓存特性。 此阶段将启用语句缓存特性,除此之外与第 1 阶段相同。为此,我们将在 .odbc.ini 文件中将“StatementCache=”设置为 T。
. |
编辑 .odbc.ini 文件,将 StatementCache 选项设置为 True。.odbc.ini 文件位于您的 Oracle Home 目录中。 $ cd $HOME $vi .odbc.ini 找到 StatementCache 选项,将其值从“F”更改为“T”。 保存此文件。(使用 :w 命令进行保存。) 键入 ZZ 退出编辑器。
|
---|---|
. |
使用 gmake 实用程序生成 stage3 源代码的 C 可执行程序和库。打开一个终端窗口,转到(用“cd”命令)阶段文件所在位置 (/home/oci/odbclab),执行 gmake 实用程序。 cd $HOME/oci/odbclab
gmake stage3
|
. |
在您的 SQL*Plus 会话中,运行 reports.sql 脚本。将 stage3 文件传递给该脚本。添加参数,指定迭代 1000 次以增加负载并生成结果,将线程数设置为 10。 @reports.sql "../stage3 -i 1000 -t 10" 报告运行时会显示完成百分比。
|
. |
当提示输入报告名称时,请输入: stage3_odbc 这会生成两个报告,它们保存在当前目录中:
每个阶段都会为您提供生成的示例结果。这些文件位于 /home/oci/odbclab/doc 子文件夹下。这些示例结果文件名为:
注意:由于环境不同,您的结果可能会与提供的示例结果不同。为了本教程内统一起见,我们查看的是生成的示例结果。
|
. |
查看 stage3_results_addm.txt 报告内容。 (您可以在一个文本编辑器中打开该文件,也可以在您的 SQL*Plus 会话中向上滚动查看该文件) 注意 Summary of Findings 部分。
|
. |
查看 stage3_results_awr.htm 报告内容。 找到位于 /home/oci/odbclab/doc 子文件夹下的 stage3_results_awr.htm 文件。双击文件名,在浏览器中打开该文件(或右键单击并选择 Open with "Web-Browser" 选项)。 查看该报告。 向下滚动到 Main Report。单击 SQL Statistics 链接。 注意,与 stage1 相比,这里的 Elapsed Time(s) 明显减少。 |
. |
禁用语句缓存。 编辑 .odbc.ini 文件,将 StatementCache 选项设置为 False。.odbc.ini 文件位于您的 Oracle Home 目录中。 $cd $HOME vi .odbc.ini 找到 StatementCache 选项,将其值从“T”更改为“F”。 保存此文件。(使用 :w 命令进行保存。) 键入 ZZ 退出编辑器。
|
在本节中,您将了解客户端结果集缓存特性。您可通过使用客户端结果集缓存特性来改善性能。
. |
您将需要启用客户端结果集缓存特性。 在您的 init.ora 文件中,确保将以下参数设置为如下所示:. client_result_cache_size=65536 client_result_cache_lag=1000000 compatible=11.0.00.0 如果该项设置不存在,您需要:
|
---|---|
. |
查看 stage4.c 文件的内容。可使用一个文本编辑器来查看内容。
|
. |
使用 gmake 实用程序生成 stage4 源代码的 C 可执行程序和库。打开一个终端窗口,转到(用“cd”命令)阶段文件所在位置 (/home/oci/odbclab),执行 gmake 实用程序。 cd /home/oci/odbclab gmake stage4
|
. |
在您的 SQL*Plus 会话中,运行 reports.sql 脚本。将 stage4 文件传递给该脚本。添加参数,指定迭代 1000 次以增加负载并生成结果,将线程数设置为 10。 @reports.sql "../stage4 -i 1000 -t 10" 报告运行时会显示完成百分比。
|
. |
当提示输入报告名称时,请输入: stage4_odbc 这会生成两个报告,它们保存在当前目录中:
每个阶段都会为您提供生成的示例结果。这些文件位于 /home/oci/odbclab/doc 子文件夹下。这些示例结果文件名为:
注意:由于环境不同,您的结果可能会与提供的示例结果不同。为了本教程内统一起见,我们查看的是生成的示例结果。
|
. |
查看 stage4_results_addm.txt 报告内容。 (您可以在一个文本编辑器中打开该文件,也可以在您的 SQL*Plus 会话中向上滚动查看该文件) 注意 Summary of Findings 部分。
|
. |
查看 stage4_results_awr.htm 报告内容。 找到位于 /home/oci/odbclab/doc 子文件夹下的 stage4_results_awr.htm 文件。双击文件名,在浏览器中打开该文件(或右键单击并选择 Open with "Web-Browser" 选项)。 查看该报告。 向下滚动到 Main Report。单击 SQL Statistics 链接。
查看该报告。注意,与 stage1 相比,这里的 Elapsed Time(s) 明显减少。 单击 SQL Statistics 下面的 SQL ordered by Executions 链接。
|
在本节中,我们将对 query_salary() 函数(该函数调用一个 PL/SQL 过程)进行修改以使用一个引用游标。除了 query_salary() 函数中的更改之外,其余仍与 stage1 相同。
. |
查看 stage5.c 文件的内容。 找到 /home/oci/odbclab 目录下的 stage5.c 文件。 右键单击 stage5.c 文件,选择 Open with "Text Editor" 选项。 在 stage5.c 中,我们将修改 query_salary 函数使其使用一个引用游标。PL/SQL 过程(employeespack.emproc)为 SQL 语句打开一个游标,这将选择部门中具有所传入 empno 的所有员工。该程序将通过返回的引用游标获取所有记录行。在声明中,ref-curosr 是一个 IN/OUT 参数,empno 是一个 IN 参数。
|
---|---|
. |
使用 gmake 实用程序生成 stage5 源代码的 C 可执行程序和库。 使用 gmake 实用程序生成 stage5 源代码的 C 可执行程序和库。打开一个终端窗口,转到(用“cd”命令)阶段文件所在位置 (/home/oci/odbclab),执行 gmake 实用程序。 cd $HOME/oci/odbclab gmake stage5
|
. |
在终端窗口中执行 stage5 文件。 ./stage5 注意:此 stage5 示例不需要 AWR 和 ADDM 报告。Stage5 说明在 ODBC 应用程序中如何使用引用游标。 |
通过此阶段来演示 ODBC 中对 LOB 的处理。将修改 update_salary() 函数。用该函数来更新此 OBE 中定义的“lob_table”中的 LOB 列。query_salary() 和 multirow_fetch() 保持不变,仍与 stage1 相同。
注意:由于使用的是 SecureFile LOB,请确保在 init.ora 文件中设置以下参数:
compatible=11.2.0.0.0
本节中定义了一个 LOB 表。该表存储一系列的文章和一些来自读者的评论。该表有以下几列:
将 update_salary() 函数修改为:
. |
查看 stage6.c 文件的内容。 找到 /home/oci/odbclab 目录下的 stage6.c 文件。 右键单击 stage6.c 文件,选择 Open with "Text Editor" 选项。 update_salary() 函数经过了修改。该函数更新此 OBE 中定义的“lob_table”中的 LOB 列。query_salary() 和 multirow_fetch() 函数保持不变,仍与 stage1 相同。
|
---|---|
. |
使用 gmake 实用程序生成 stage6 源代码的 C 可执行程序和库。 使用 gmake 实用程序生成 stage6 源代码的 C 可执行程序和库。打开一个终端窗口,转到(用“cd”命令)阶段文件所在位置 (/home/oci/odbclab),执行 gmake 实用程序。 cd $HOME/oci/odbclab gmake stage6
|
. |
在终端窗口中执行 stage6 文件。同时指定迭代参数 5,线程参数 5,指定 verbose 选项以输出详细信息。 ./stage6 -i 5 -t 5 -v 注意:此阶段无需 AWR 和 ADDM 报告,因为此阶段是为了演示如何通过 ODBC 应用程序进行 LOB 读/写/更新。 |
在本教程中,您学习了如何:
关于 Oracle | | 招聘 | 联系我们 | 网站地图 | 法律声明 | 使用条款 | 您的隐私权利 | |