监控Oracle 数据库中长时间运行进程的两种方式,通过这些方 法,我们可以监控单条语句的 长时间操作,监控存储过程的运行进度,甚至自己'生成'进度信息. 关键词:监控进度V$SESSION_LONGOPS 当Oracle 存储过程运行时间较长时,我们希望客 户端能了解到它在后台执行的状况或者进度信息(类 似WINDOWS 安装软件时的进度条信息),这样可以知 道运行在后台的应用进程是否终止或者休眠,更近一 步要求,最好能知道进行到哪一步骤,还有多少时间才 能完成. 简单到一条SQL 语句的情况,如果执行时间较长, 我们如何得到它的运行状况?是否后台还在运行?虽 然可以查看SQL 的执行计划了解它的执行步骤,但如 何知道它运行到哪一个步骤了呢?如何才能估计出它 的合理的较为精确的执行时间呢? Oracle 数据库前端发出执行命令后,进程在后台 执行,普通开发人员一般无法了解到后台在做什么,一 般采用的方法是用DBMSOUTPUT.PUT_LINE 来打印出 来,但DBMS—OUTPUT.PUT—LINE 打印的信息受缓冲区 大小限制,如果信息较多就容易溢出,而且如果存储过 程执行时间较长,只有在其执行完后,这些信息才会打 印出来,这就增加了调试周期,影响了调试效果.有的 开发人员在存储过程中通过写日志表的形式来记录进 度,但需要COMMIT 后其他进程才能看到这些日志信 息,而在某些控制结构中(如游标CURSOR 循环)COM— MIT,则很容易引起ORA 一01555 错误,造成程序出错. 下面介绍两种监控方法. 如何监控单条长语句从ORACLE8 开始,出现一个新的动态视图:V $SESSION_LONGOPS,从这个视图可以获知一些操作 (如全表扫描,并行查询,RMAN,排序等)的执行进度, 我们先来了解一下V$SESSION—LONGOPS 视图的一些 重要字段: 列说明 sID 会话标识 5ERIAL#会话序列号 OPfE 操作的简短描述 TARG 盯操作的对象,如xx TAR~_DESC目标描述 SOFAR 目前已执行单位数目 ToTAIWORK 总单位数目 UNlTS 单位 START_TIME 开始执行时间 LAST_ UPDATE_TIME 统计数据最后更新时间 TIME_ REMAINING 估计剩余时间c ELAPSED_SECONDS 已执行时间(秒) MEsSAGE 统计数据汇总信息 USERA^^E 用户名 ~L_ADDRES5 语句的地址,,用于和V$sql_text 等关联 语句的hash 地址,用于和V$sql_texlSQLHASH VALUE等关联 这个动态视图显示各个运行时间超过6 程.这些进程包含许多备份和恢复功能,统计数据收集,查询等. 执行以下语句就可以得到数据库中各个长时间操 作的进程信息: select'Icfromv$sesslon_ longopswheretime_ re- malnlng0 我们也可以用图形化工具查看,如TOAD,OEM中 均可查看长操作进程进度信息. Oracle 自带的管理工具OracleEnterpriseManager (OEM)提供了图形化查看长操作的功能,如: 计算机系统应用2007 Quest公司的数据库管理工具TOAD 也可以看到 长操作信息,如: 表的统计信息. 长时问运行的SQL 语句可以用V$SESSION—LON? 为了能监控到查询进程执行的进度,必需使用 CBO 优化器并且: 设置TlMED—STATISTICS或者SQL—TRACE 用ANALYZE语句或者DBMS—STAT 包收集相关 108 实践经验P 帕cficalExpen GOPS来监控.实际上,长时间运行的存储过程也可以 监控.那是否任何操作都可以通过这个视图来监控进 度呢?很遗憾,V$SESSION—LONGOPS 只会报告它认为 耗时长的操作.对于NEsTEDLOOP/UNIQUEINDEX READS/INDEXRANGEScANS 等执行速度很快的操作, 2007 期计算机系统应用由于它们执行一般不超过6 秒,因此将不会出现在V $SESSION—LONGOPS 如何监控自定义存储过程单条长语句可以用上面的方法监控,Oracle 动生成V$SE.SSION— LONGOPS 记录.那么存储过程中 有许多小操作,如何监控进度呢?其实,我们也可以手 工生成V$SESSION—LONGOPS 记录,方法是调用DBMS APPLICATION—INFO 包来生成自定义进度信息. 从Oracle7.2 开始,提供了DBMS—APPLICATION— INFo 包,通过调用这个包,应用可以将自己的名字和 动作填写到V$SESSION 和V$SQLAREA 的MODULE ACTION列中.V$SESSION 列出每个会话的用户名,操 作系统机器名,终端名,程序名等. 应用可以在执行模块时设置模块名和动作名,模 块名一般是甩户自定义的.而动作名一般描述模块中 的当前执行的事务的名字. DBMSAPPLICATION_INFO 包包含以下过程 SET_ MODULE 设置当前运行程序的模块名 SET__AEl'ION 设置当前模块的当前动作名 SESSION—LON-在V$SESSIONLONGOPS视图中 GoPS 插入一行进度信息 SETMODULE过程设置模块名和动作名: createorreplaceproceduredel—cust(v_cust—Id varchar2) begindbms—— application—— info.set— module(module—— name="delcust". actlon_name="deletetablecust)i deletefromcustwherecustld=v_ cusLId; dbms_appllcatlon— Info.seLmodule(,); end;以上设置的模块名和动作名可以通过查询V $sqlarea 获取. 如:selectsql—text,module,actionfromv $sqlareawheremodule="del_cust: sql_textmoduleadion Deletefr0mcustdel_ custdeletetableoust 1rowselected. SET_SESSION—LONGOPS 过程用于在V$session— longops 中插入一行,开发人员可以调用此过程设置长 时间操作的状态信息,这样,任何其他其他会话都可以 看到这个进度信息.如下例所示: declare nohlntnumberdefaultdbmsapplicatlon_info.set_ session— Iongops_ nohint; IdndexnumberdefaultInohlnt: slnonumber;begin forlIn1..8888888888 loop update....; dbms_ appllcaflon— Info.setsesslon_ longops (rlndex=l_rlndex, slno=I_slno. op_name="updateahugetable. target=126, target_desc='.msgdescription context=0.sOfar=j. totalwork=8888888888. units=loops endloop;end; 然后,从另一个会话来执行以下语句selectfromv$sesslon_ longopswheretlmere? malnlng0; 也可以用图形化工具TOAD 或OEM来查看. 因此,采用本文说明的方法,Oracle 开发人员可以 比较方便的监控长操作进程的进度信息,也可以自己 设置监控信息,来了解后台存储过程的运行效率.甚 至,可以在存储过程或SQL 语句提交执行后马上观察 其执行进度,如果比较缓慢,则可以中断其执行,进行 调优,从而缩短调试周期,提高开发效率.
成都创新互联公司是一家专业提供广西企业网站建设,专注与成都网站建设、成都网站制作、成都h5网站建设、小程序制作等业务。10年已为广西众多企业、政府机构等服务。创新互联专业的建站公司优惠进行中。
TPC-C学习笔记
摘录:本文章来自:
TPC-C学习笔记
2�TPCC基准测试
TPCC值被广泛用于衡量C/S环境下,由服务器和客户端构筑的整体系统的性能,它由事物处理性能委员会(TPC,Transaction Processing Corp)制定,TPC为非赢利性国际组织。
TPCC值可以反映出系统的性能价格比。TPCC测试系统每分钟处理的任务数,单位为tpm,(transactions per minute)。系统的总体价格(单位为美元)除以TPCC值,就可以衡量出系统的性价比,系统的性价比值越小,系统的性价比越好。
需要注意的是,TPC-C值描述的是C/S整体系统的性能,它与系统的服务器和客户机的性能都有关系,也就是说,同样的服务器配置不同的客户端将会影响TPCC值,任何厂商和测试者都可以根据TPC提供的测试规范构造出自己最优的系统,当然测试的结果要经过TPC审核。
---------------------------------------------------------------------------------------------------------------
性能测试指标介绍
TPC-C
作为一家非盈利性机构,事务处理性能委员会(TPC)负责定义诸如TPC-C、TPC-H和TPC-W基准测试之类的事务处理与数据库性能基准测试,并依据这些基准测试项目发布客观性能数据。TPC基准测试采用极为严格的运行环境,并且必须在独立审计机构监督下进行。委员会成员包括大多数主要数据库产品厂商以及服务器硬件系统供应商。
相关企业参与TPC基准测试以期在规定运行环境中获得客观性能验证,并通过应用测试过程中所使用的技术开发出更加强健且更具伸缩性的软件产品及硬件设备。
TPC-C是一种旨在衡量联机事务处理(OLTP)系统性能与可伸缩性的行业标准基准测试项目。这种基准测试项目将对包括查询、更新及队列式小批量事务在内的广泛数据库功能进行测试。许多IT专业人员将TPC-C视为衡量“真实”OLTP系统性能的有效指示器。
TPC-C基准测试针对一种模拟订单录入与销售环境测量每分钟商业事务(tpmC)吞吐量。特别值得一提的是,它将专门测量系统在同时执行其它四种事务类型(如支付、订单状态更新、交付及证券级变更)时每分钟所生成的新增订单事务数量。独立审计机构将负责对基准测试结果进行公证,同时,TPC将出据一份全面彻底的测试报告。这份测试报告可以从TPC Web站点()上获得。
tpmC定义: TPC-C的吞吐量,按有效TPC-C配置期间每分钟处理的平均交易次数测量,至少要运行12分钟。
1.TPC-C规范概要
TPC-C是专门针对联机交易处理系统(OLTP系统)的,一般情况下我们也把这类系统称为业务处理系统。
TPC-C测试规范中模拟了一个比较复杂并具有代表意义的OLTP应用环境:假设有一个大型商品批发商,它拥有若干个分布在不同区域的商品库;每个仓库负责为10个销售点供货;每个销售点为3000个客户提供服务;每个客户平均一个订单有10项产品;所有订单中约1%的产品在其直接所属的仓库中没有存货,需要由其他区域的仓库来供货。
该系统需要处理的交易为以下几种:
New-Order:客户输入一笔新的订货交易;
Payment:更新客户账户余额以反映其支付状况;
Delivery:发货(模拟批处理交易);
Order-Status:查询客户最近交易的状态;
Stock-Level:查询仓库库存状况,以便能够及时补货。
对于前四种类型的交易,要求响应时间在5秒以内;对于库存状况查询交易,要求响应时间在20秒以内。
逻辑结构图:
流程图:
2.评测指标
TPC-C测试规范经过两年的研制,于1992年7月发布。几乎所有在OLTP市场提供软硬件平台的厂商都发布了相应的TPC-C测试结果,随着计算机技术的不断发展,这些测试结果也在不断刷新。
TPC-C的测试结果主要有两个指标:
● 流量指标(Throughput,简称tpmC)
按照TPC的定义,流量指标描述了系统在执行Payment、Order-status、Delivery、Stock-Level这四种交易的同时,每分钟可以处理多少个New-Order交易。所有交易的响应时间必须满足TPC-C测试规范的要求。
流量指标值越大越好!
● 性价比(Price/Performance,简称Price/tpmC)
即测试系统价格(指在美国的报价)与流量指标的比值。
性价比越小越好!
---------------------------------------------------------------------------------------------------------------
[Oracle] How to Use Open Source Tools to Implement Your Own TPC-C
作者:Fenng
日期:Mar 14 2004 (v0.13)
出处:
版本:0.93
--------------------------------------------------------------------------------
本文简介
介绍如何利用开源工具实现Oracle数据库环境中的TPC-C.对DBA、开发人员、BI实施者有一定的参考价值.
引言描述
设想一下这样一种情况:
您正在负责公司的一个OLTP类型的数据库项目,面临数据库服务器选型的问题:如何选择硬件才能满足产品环境的业务要求? 这个事情是“拍脑袋” 能决定的吗?
不可否认,硬件选型是一门艺术,选择合适的硬件,能给公司节省大笔的费用,选择不能满足业务需求的服务器产品,不但花了冤枉钱,还会对将来的业务产生影响。
可能大家首先会想到参考服务器的TPC-C的信息。提到TPC-C,可能很多人对此都感到既熟悉又陌生,因为经常听人说起,但是具体的问下去,能说清楚的又没有多少人,而且,从大家口中得到的还不尽相同。那么什么是TPC/TPC-C这些都代表什么意思呢?
先说一下TPC-C,TPC-C是联机事务处理(on-line transaction processing , OLTP)的基准程序。TPC-C模拟一个批发商的货物管理环境。TPC-C使用三种性能和价格度量,其中性能由TPC-C吞吐率衡量,单位是tpmC。tpm是transactions per minute的简称;C指TPC中的C基准程序。它的定义是每分钟内系统处理的新订单个数。
了解了这些内容,您可能会想:我们公司的PC服务器完全是自己攒出来的,如何进行TPC-C的衡量的?也去参考TPC官方站点上的信息?不要忘了,TPC.org 上公布的测试结果都是各大厂商根据自己的系统进行了充分优化之后的出来的结果。打个比方,TPC公布的数值就好比崭新的法拉利跑车经过专业技师们的精心检查保养,然后在专用跑道上跑出来的速度值,而我们的情况可能是法拉利(甚至是夏利)要在乡村土路上行驶,可比性大打折扣。
有的朋友会想:那我们可以根据自己的情况,拿一个秒表在“乡村土路”上测试一下看看呀。这样的意义也是显而易见的,对我们的实际的环境不是更具有参考价值?不错,这也正是本文的目的:让我们利用开源(Open Source)工具来实现自己的针对Oracle数据库的TPC-C。
Hammerora—the Open Source Oracle Load Test Tool
首先介绍一下Hammerora。从创作者对这个工具的标题描述可以看出,Hammerora是一款Oracle数据库负载测试工具。该工具可以在Oracle 8i、9i和10g等版本上使用。当前可以用在Linux/Unix和Windows上。初步实现了跨平台。Hammerora 完全用TCL/TK写就,以GPL版权形式发布。
作者是Steve Shaw。该项目的主页在: 。
Hammerora的设计原理是解析Oracle的Trace文件,并把它们转化为Oratcl程序,然后在Oracle数据库中用多个用户并发的对用户的事务进行“回放”。我们知道,Oracle的Trace文件能够翔实的记录用户对数据库的操作。这样Hammerora能够保证对用户环境的真实模拟。
Hammerora最初是用以学习的目的:期望是模拟数据库的一定数量的用户。这样一个小的基于家庭的学习开发系统就能够比较接近产品环境。这个工具已经成长为一个Oracle数据库做压力测试--从小的数据库到大的基于RAC的集群。
TCL语言已经用来提供高性能的和Oracle数据库的OCI集成,而无需重新编译生成的程序。每个生成的程序具有严格的TCL/Oratcl兼容性,并且可以在Hammerora的命令行Shell下运行。TCL的强大功能和灵活性意味着潜在的功能是无穷尽的。TCL线程包用来实现对Oracle数据库的多个并发连接。
Hammerora包含Oracle存储过程和TCL驱动脚本用来运行TPC-C基准程序。但是,我们先要构建一个同TPC-C规范相符的数据库。这样,我们需要用到Orabm。
Orabm
Orabm是Geoff Ingram (High-Performance Oracle: Proven Methods for Achieving Optimum Performance and Availability一书的作者)构建的一个程序包,包含了一套SQL脚本和几个命令行程序。Orabm数据装载程序(Orabmload)构建了一组遵从TPC-C标准的数据用以测试。Orabm的程序包和源代码可以从它的主页面( ) 得到。
Orabm的运行机制
Orabm的运行机制在Geoff Ingram有明确的说明,这里翻译如下:Orabm通过在每个用户指定的并发数据库会话(session) 中运行用户执行数量的数据库事务来进行工作.事务通过ORABM模式下的ORABM_SERVERSIDE_STRESS存储过程运行。对每个并发会话来说,ORABM_SERVERSIDE_STRESS运行在orabm命令行下指定的事务数,并返回该会话在采样间隔完成时的TPS值.要确保所有并发会话都是在采样间隔期间处理事务,TPS值仅包括事务的中间的80%,也即:初始的10%和最后的 10%将忽略掉。
更详细信息可以参考 的内容.
安装步骤
1) 安装Oracle OCI 库
对Oracle 9i 来说,如果没有安装该组件的话,可能要重新运行runInstall,在Oracle 9i Client products树中选择"Oracle Call Interfaces" .
对Oracle 10g来说,Oracle 10 OCI 库应该是默认安装的.
2) 安装TCL
cd /usr/local/src/tcl8.4.5/unix
rm -f config.cache
./configure --enable-threads --enable-shared
make clean
make
make install
3 安装TK
cd /usr/local/src/tk8.4.5/unix
rm -f config.cache
./configure --with-tcl=../../tcl8.4.5/unix --enable-threads --enable-shared
make clean
make
make install
4 安装TCL Threads
cd /usr/local/src/thread2.5.2/unix
rm -f config.cache
sh ../configure --enable-threads --enable-shared
make clean
make
make install
5 安装Oratcl
对10g来说,要编辑配置文件,在1728 行附近, FOUND_ORACLE=0 那一行的下面添加如下部分内容:
echo "checking for Oracle 10.0 style toplevel (libclient10.a)" 1 6
echo "configure:1730: checking for Oracle 10 style toplevel(libclient10.a)" 5
for f in $oracle_directory $oratest1 $oratest2 $oratest3 \
$oracle4 /opt/oracle /u/oracle /usr/oracle /usr/local/oracle ; do
echo "$ac_t""looking for lib/libclient10.a in $f" 16
if test -r "$f/lib/libclient10.a" ; then
ORA="$f/lib"
ORACLE_HOME=$f
echo "$ac_t""setting ORA to $ORA" 16
testver=10
ORA_MAJOR_VERSION=10
ORA_MINOR_VERSION=0
FOUND_ORACLE=1
break
fi
done
export ORACLE_HOME=your_oracle_home_directory
cd /usr/local/src/oratcl-4-1-branch/unix
rm -f config.cache
sh ../configure --with-tcl=../../tcl8.4.5/unix \
--with-oracle-directory=$ORACLE_HOME --with-oracle-version=9 ( or 10 or 8! ) \
--enable-threads --enable-shared
vi Makefile - 把所有的 -rpath 改做 -Wl,-rpath,
make clean
make
make install
sqlplus orabm/orabm @delivery_sp.sql
sqlplus orabm/orabm @new_order_sp.sql
sqlplus orabm/orabm @ostat_sp.sql
sqlplus orabm/orabm @payment_sp.sql
sqlplus orabm/orabm @slev_sp.sql
步骤 操作 命令
1 创建 ORABM用户(用TOOLS做默认表空间,
TEMP 表空间为临时表空间) sqlplus system/pwd @orabm_user
2 创建表 sqlplus system/pwd @orabm_tab
3 装载数据 $orabmload Warehouses 1
4 创建索引 sqlplus system/pwd @orabm_ind
5 分析表和索引 sqlplus system/pwd @orabm_analyze
6 创建压力测试PL/SQL 过程 sqlplus system/pwd @orabm_serverside_stress
7 把表和索引数据缓冲到SGA sqlplus system/pwd @orabm_cache
把tpc-c.tcl脚本载入Hammerora中(要查看TCL文件注意把过滤正确的文件扩展名:不是*.trc 而是*.tcl ),在该tpc-c.tcl中查找connect字符串,调整为你的数据库用户连接信息。并调整虚拟用户信息。
测试运行
运行Hammerora,创建需要的用户数, 来模拟TPC-C 基准程序(注意调整好执行Hammerora程序的环境变量,最好直接用Oracle用户来执行).
TPC基准程序及tpmc值
—兼谈在使用性能度量时如何避免误区
今天的用户在选用平台时面对的是一个缤纷繁杂的世界。用户希望有一种度量标准,能够量化计算机系统的性能,以此作为选型的依据。作者曾在美国从事过数年计算机性能评价工作,深深体会到,计算机的性能很难用一两种度量来 评价,而且,任何度量都有其优缺点,尤其是当使用者对性能度量了解不深时,很容易被引入一些误区,甚至推演出错误的结论。本文以TPC基准程序为例,给出一 些实际建议,以帮助用户避免进入这些误区。
一、什么是TPC和tpmC?
tpmC值在国内外被广 泛用于衡量计算机系统的事务处理能力。但究竟什么是tpmC值呢?作者曾向一些 用户、推销人员乃至某些国外大公司的技术人员问过这个问题,但回答的精确度 与tpmC值的流行程度远非相称。tpmC这一度量也常被误写为TPM或TPMC。
1、TPC
TPC(Transaction Processing Performance Council,事务处理性能委员会)是由数10家会员公司创建的非盈利组织,总部设在美国。该组织对全世界开放,但迄今为止,绝大多数会员都是美、 日、西欧的大公司。TPC的成员主要是计算机软硬件厂家,而非计算机用户,它的功 能是制定商务应用基准程序(Benchmark)的标准规范、性能和价格度量,并管理测 试结果的发布。
TPC的出版物是开放 的,可以通过网络获取()。TPC不给出基准程序的代码,而只 给出基准程序的标准规范(Standard Specification)。任何厂家或其它测试者都可以根据规范,最优地构造出自己的系统(测试平台和测试程序)。为保证测试结果的客观性,被测试者(通常是厂家)必须提交给TPC一套完整的报告(Full Disclosure Report),包括被测系统的详细配置、分类价格和包含五年维护费用在内的总价 格。该报告必须由TPC授权的审核员核实(TPC本身并不做审计)。现在全球只有几个审核员,全部在美国。
2、tpmC
TPC已经推出了四套基准程序,被称为TPC-A、TPC-B、TPC-C和TPC-D。其中A和B已经过时,不再使用了。TPC-C是在线事务处理(OLTP)的基准程序,TPC-D是决策支持(Decision Support) 的基准程序。TPC即将推TPC-E,作为大型企业(Enterprise)信息服务的基准程序。
TPC-C模拟一个批发 商的货物管理环境。该批发公司有N个仓库,每个仓库供应10个地区,其中每个地 区为3000名顾客服务。在每个仓库中有10个终端,每一个终端用于一个地区。在运 行时,10×N个终端操作员向公司的数据库发出5类请求。由于一个仓库中不可能 存储公司所有的货物,有一些请求必须发往其它仓库,因此,数据库在逻辑上是 分布的。N是一个可变参数,测试者可以随意改变N,以获得最佳测试效果。
TPC-C使用三种性能 和价格度量,其中性能由TPC-C吞吐率衡量,单位是tpmC。tpm是transactions per minute的简称;C指TPC中的C基准程序。它的定义是每分钟内系统处理的新订单个数。要注意的是,在处理新订单的同时,系统还要按表1的要求处理其它4类事务 请求。从表1可以看出,新订单请求不可能超出全部事务请求的45%,因此,当一个 系统的性能为1000tpmC时,它每分钟实际处理的请求数是2000多个。价格是指系 统的总价格,单位是美元,而价格性能比则定义为总价格÷性能,单位是$/tpmC。
二、如何衡量计算机系统的性能和价格
在系统选型时,我们一定不要忘记我们是为特定用户环境中的特定应用选择系统。切忌为了“与国际接 轨”而盲目套用“国际通用”的东西。在性能评价领域,越是通用的度量常常越是不准确的。据我所知,美国的一些大用户从不相信任何“国际通用”的度量,而是花相当精力,比如预算的5%,使用自己的应用来测试系统,决定选型。在使用任何一种性能和价格度量时,一定要弄明白该度量的定义,以及它是在什么系统配置和运行环境下得到的,如何解释它的意义等。下面我们由好到差讨论三种方式。
1、在真实环境中运行 实际应用
最理想的方式是搞一个试点,要求制造商或系统集成商配合将系统(含平台、软件和操作流程)在一个 实际用户点真正试运行一段时间。这样,用户不仅能看到实际性能,也能观察到系统是否稳定可靠、使用是否方便、服务是否周到、配置是否足够、全部价格是否合理。如果一个部门需要购买一批同类的系统,这种方式应列为首选,因为它不仅最精确、稳妥,也常常最有效率,用户还可先租一套系统作为试点。用这种方式得到的度量值常常具有很明确和实际的含义。
2、使用用户定义的基准程序
如果由于某种原因第一种方式不可行,用户可以定义一组含有自己实际应用环境特征的应用基准程序。 我举两个例子:近年来,由于R/3软件是应用层软件,SAP公司的基准程序获得了越来越多国外企业的认可;中国税务总局最近也开发了自己的基准程序,以帮助税务系统进行计算机选型。这种方式在中国尤其重要,因为中国的信息系统有其特殊性。
3、使用通用基准程序
如果第1种和第2种方式都不行,则使用如TPC-C之类的通用基准程序,这是不得已的一种近似方法。因 此,tpmC值只能用作参考。我们应当注意以下几点:
(1)实际应用是否与基准程序相符
绝大多数基准程序都是在美国制订的,而中国的企事业单位与美国的运作方式常常不一样(恐怕也不应该或不可能一样)。在使用TPC-C时,我们应该清楚地知道:我的应用是否符合批发商模式?事务请求是否与表1近似?对响应时间的要求是否满足表1?如果都不是,则tpmC值的参考价值就不太大了。
(2)TPC度量的解释
TPC基准程序是用来测系统而不是测主机的,厂家肯定要充分优化他们的被测系统。此处的“系统”包括主机、外设(如硬盘或RAID)、主机端操作系统、数据库软件、客户端计算机及其 操作系统、数据库软件和网络连接等。在很多厂家的TPC测试系统中,主机的价格只是系统总价格的1/4或更小,而硬盘的价格有可能占到总价格的1/3以上,因为TPC-C要求被测系统必须保存180天的事务记录。如果同样的主机被用到用户的环境中,厂家报的tpmC值就意义不大,因为用户的实际系统与厂家原来用于TPC测试的系统大不一样。当同样的主机用在不同的系统中时,tpmC值可能有相当大的变化,现在很多用户还没有意识到这一点。
我举一个例子。假设用 户希望购买一批同类系统,每一系统至少需要1GB的内存和50GB的硬盘。厂家A、B、C 各报了三个价格相当的系统,tpmC值分别为3000、2800、2600。用户是否应该选厂 家A的产品呢?答案是:不一定。厂家用于测试tpmC值的系统与实际提供给用户的系统配置大不一样。tpmC最低的厂家C提供给用户的系统反而有可能性能最好,不 论是以实际系统的tpmC值还是以用户的实际应用性能来衡量。
(3)TPC测试的成本
TPC-C和TPC-D都是很复杂的基准程序,做一个严格的测试是很消耗资源的,厂家当然不会说出他们花费了多少钱和时间。但据国外知情人士透露,一个厂家做第一个TPC-C测试需 要几十万到上百万美元的资金和半年左右的时间投入。因此,很多TPC的度量值都 是估计的。由于计算机系统换代频繁,如果用户一定要用通过审核的度量值,就必 须多等待半年时间,因此而不能用最先进的系统。中国的厂家通过审核的时间则 更长。
综上所述,我们对中国 用户(尤其是大用户)在计算机系统的选型方面有如下建议:
最好建立一个真实的试点,因为实际应用环境是检验计算机系统的最好标准。
中国的行业应该建立符合自己实际应用的基准程序和测试标准。中国税务总局的做法值得提倡。国家有关部门应该建立独立的测试中心,制定跨行业、符合中国企事业运作模式的性能测试标准。
“国际通用”的度量可以作为参考值,而不应作为必要条件。尤其是一定要弄清这些流行度量有什么含义,是在什么样的系统环境中测得的,以及基准程序是否符合企业真实的业务流程和运作模式。
Trackback:
如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
在一个系统中,往往会出现一些长事务进行大批量的数据处理,这些事务往往占据大量系统资源,而且运行时间长。如果我们不能有效的监控这些事务,可能会影响到其他事务的运行,甚至可能会由于事务没有在预期时间内完成作业,到了业务高峰时期仍然在运行而导致系统被hung。
实际上,oracle提供了一个视图让DBA来监控长事务的运行状况及历史信息。下面介绍如何使用这个视图来查看长事务信息——v$session_longops。
在oracle中,运行时间超过6秒的事务就被视为长事务。确切地说,这个视图显示的就是时间超过6秒的一些操作,包括备份和恢复、统计数据收集、查询中的各种操作。在视图的各个字段中,totalwork表示该操作要完成所需要做的总的工作单位数;sofar则是目前已经完成的工作单位数;unit则表明工作单位是什么,例如,全表扫描操作中,是以数据块为单位;eplapsed_seconds是操作已经完成的时间,time_remaining是操作的剩余时间。另外,如果操作涉及到的是sql语句,则可以通过sql_address和sql_hash_value查询到相关语句。
对于sql查询,如果要使该视图可以查询到相关记录,还需要满足以下2个条件:
1、 设置TIMED_STATISTICS为TRUE或者设置SQL_TRACE为TRUE;
2、 相关对象需要已经被分析过。
下面的例子演示如何使用该视图:
SQL create table t_test2 as select a.* from user_objects a, user_objects b;
Table created.
SQL analyze table t_test2 compute statistics;
Table analyzed.
SQL show parameter timed_statistics
NAME TYPE VALUE
------------------- ------------------------ ---------------------
timed_statistics boolean TRUE
SQL select count(1) from t_test2;
查询运行6秒后,没有结束,在另一个会话中查询视图:
SQL select opname, target, round(sofar/totalwork*100,2) as progress,
time_remaining, elapsed_seconds from v$session_longops
2 where sofar totalwork;
OPNAME TARGET PROGRESS TIME_REMAINING ELAPSED_SECONDS
-------------- ---------------- ------------ ---------------- -----------------
Table Scan DEMO.TEST2 6.34 635 43
但是,使用该视图查询长事务操作,也是有一些限制的。例如,对于语句,需要满足以上两个条件,否则不能从视图中查询到相关操作。另外一个限制就是,这个视图只能能查询到如单对象操作,full
table scan、fast full index
scan、sort等,而不能查到多对象操作,如join。看以下例子:
SQL create table t_test as select * from all_objects;
Table created.
SQL analyze table t_test compute statistics;
Table analyzed.
SQL select count(*) from t_test a, t_test b;
运行时间超过10秒后,我们在另外会话中查询视图:
SQL select opname, target, round(sofar/totalwork*100,2) as progress,
time_remaining, elapsed_seconds from v$session_longops
2 where sofar totalwork;
no rows selected
我们看下以上语句的查询计划:
SELECT STATEMENT, GOAL = CHOOSE Cost=1288140 Cardinality=1
SORT AGGREGATE Cardinality=1
MERGE JOIN CARTESIAN Cost=1288140 Cardinality=940587561 IO cost=1288140
TABLE ACCESS FULL Object owner=CSSOWNER Object name=T_TEST Cost=42 Cardinality=30669
BUFFER SORT Cost=1288098 Cardinality=30669
TABLE ACCESS FULL Object owner=CSSOWNER Object name=T_TEST Cost=42 Cardinality=30669
可以看到,该语句的主要消耗的操作是MERGE JOIN
CARTESIAN,即笛卡尔乘积。尽管查询计划中也存在表扫描,但是由于表本身的数据量不大,因此表扫描的代价并不大,cpu时间消耗不大,因此没有被记录:
SQL set timing on
SQL
SQL select count(*) from t_test;
COUNT(*)
----------
30669
Elapsed: 00:00:00.11
参看集群状态
[11:34:11oracle@node1 ~]crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.dba.db application ONLINE ONLINE node2
ora....l1.inst application ONLINE ONLINE node1
ora....l2.inst application ONLINE ONLINE node2
ora.dba.rac.cs application ONLINE ONLINE node2
ora....ll1.srv application ONLINE ONLINE node1
ora....ll2.srv application ONLINE ONLINE node2
ora....SM1.asm application ONLINE ONLINE node1
ora....E1.lsnr application ONLINE ONLINE node1
ora.node1.gsd application ONLINE ONLINE node1
ora.node1.ons application ONLINE ONLINE node1
ora.node1.vip application ONLINE ONLINE node1
ora....SM2.asm application ONLINE ONLINE node2
ora....E2.lsnr application ONLINE ONLINE node2
ora.node2.gsd application ONLINE ONLINE node2
ora.node2.ons application ONLINE ONLINE node2
ora.node2.vip application ONLINE ONLINE node2
查看集群资源信息
[12:59:42oracle@node2 ~]srvctl config database -d dba -a
node1 null1 /u01/app/oracle/product/10.2.0/db_1
node2 null2 /u01/app/oracle/product/10.2.0/db_1
DB_NAME: dba
ORACLE_HOME: /u01/app/oracle/product/10.2.0/db_1
SPFILE: +DATA/dba/spfilenull.ora
DOMAIN: wang.com
DB_ROLE: null
START_OPTIONS: null
POLICY: AUTOMATIC
ENABLE FLAG: DB ENABLED
查看连接信息
[13:01:55oracle@node2 ~]srvctl config database -d dba -t
Example client-side TNS entry for service rac:
rac = (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=db_vip)(PORT=dedicated_port))(CONNECT_DATA=(SERVICE_NAME=rac.wang.com)(FAILOVER_MODE=(TYPE=SELECT)(METHOD=BASIC))))
Example client-side TNS entry for service name:
name = (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=db_vip)(PORT=dedicated_port))(CONNECT_DATA=(SERVICE_NAME=name.wang.com)(FAILOVER_MODE=(TYPE=SELECT)(METHOD=BASIC))))
查看服务信息
[13:02:20oracle@node2 ~]srvctl config service -d dba -a
rac PREF: null2 null1 AVAIL: TAF: basic
name PREF: null2 null1 AVAIL: TAF: basic
[13:02:45oracle@node2 ~]srvctl config service -d dba -s rac
rac PREF: null2 null1 AVAIL:
[13:03:01oracle@node2 ~]srvctl config service -d dba -s rac -a
rac PREF: null2 null1 AVAIL: TAF: basic
查看ASM信息
[13:05:41oracle@node2 ~]srvctl config asm -n node1
+ASM1 /u01/app/oracle/product/10.2.0/db_1
[13:05:44oracle@node2 ~]
[13:05:53oracle@node2 ~]srvctl config asm -n node2
+ASM2 /u01/app/oracle/product/10.2.0/db_1
[13:05:56oracle@node2 ~]
查看监听信息
[13:05:57oracle@node2 ~]srvctl config listener -n node2
node2 LISTENER_NODE2
[13:06:15oracle@node2 ~]
[13:06:16oracle@node2 ~]srvctl config listener -n node1
node1 LISTENER_NODE1
查看数据库状态
[13:08:40oracle@node2 ~]srvctl status database -d dba
Instance null1 is running on node node1
Instance null2 is running on node node2
[13:08:43oracle@node2 ~]srvctl status database -d dba -v
Instance null1 is running on node node1 with online services rac name
Instance null2 is running on node node2 with online services rac name
查看监听状态
[13:09:27oracle@node2 ~]srvctl status instance -d dba -i null1,null2
Instance null1 is running on node node1
Instance null2 is running on node node2
[13:09:40oracle@node2 ~]srvctl status instance -d dba -i null1,null2 -v
Instance null1 is running on node node1 with online services rac name
Instance null2 is running on node node2 with online services rac name
查看节点应用状态
[13:10:29oracle@node2 ~]srvctl status nodeapps -n node1
VIP is running on node: node1
GSD is running on node: node1
Listener is running on node: node1
ONS daemon is running on node: node1
[13:11:44oracle@node2 ~]srvctl status nodeapps -n node2
VIP is running on node: node2
GSD is running on node: node2
Listener is running on node: node2
ONS daemon is running on node: node2
查看节点ASM状态
[13:11:47oracle@node2 ~]srvctl status asm -n node1
ASM instance +ASM1 is running on node node1.
[13:12:26oracle@node2 ~]srvctl status asm -n node2
ASM instance +ASM2 is running on node node2.
测试TAF
设定服务TAF模式为BASIC
RAC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = node2-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = rac.wang.com)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 180)
(DELAY = 5)
)
)
)
查看集群状态
[11:55:50oracle@node2 dbs]crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.dba.db application ONLINE ONLINE node2
ora....name.cs application ONLINE ONLINE node2
ora....ll1.srv application ONLINE ONLINE node1
ora....ll2.srv application ONLINE ONLINE node2
ora....l1.inst application ONLINE ONLINE node1
ora....l2.inst application ONLINE ONLINE node2
ora.dba.rac.cs application ONLINE ONLINE node2
ora....ll1.srv application ONLINE ONLINE node1
ora....ll2.srv application ONLINE ONLINE node2
ora....SM1.asm application ONLINE ONLINE node1
ora....E1.lsnr application ONLINE ONLINE node1
ora.node1.gsd application ONLINE ONLINE node1
ora.node1.ons application ONLINE ONLINE node1
ora.node1.vip application ONLINE ONLINE node1
ora....SM2.asm application ONLINE ONLINE node2
ora....E2.lsnr application ONLINE ONLINE node2
ora.node2.gsd application ONLINE ONLINE node2
ora.node2.ons application ONLINE ONLINE node2
ora.node2.vip application ONLINE ONLINE node2
连接数据库进行长事务查询
[11:59:41oracle@node1 ~]sqlplus sys/oracle@rac as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Thu May 27 11:59:56 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options
SYS@NODE2:null2show parameter service_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string dba.wang.com, rac, name
SYS@NODE2:null2
SYS@NODE2:null2show parameter db_name;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_name string dba
SYS@NODE2:null2
SYS@NODE2:null2show parameter instance_name;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string null2
SYS@NODE2:null2select * from dba_objects;
在事务执行过程中关闭当前所连接的实例
[12:00:47oracle@node2 admin]srvctl stop instance -i null2 -d dba -o abort
可观察到该长事务中断若干秒后继续查询
2005-10-22 21:50:51 2005-10-22 21:51:00 2005-10-22:21:50:51 VALID N N N
观察集群状态
[oracle@node1 ~]$ crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.dba.db application ONLINE ONLINE node2
ora....name.cs application ONLINE ONLINE node2
ora....ll1.srv application ONLINE ONLINE node1
ora....ll2.srv application ONLINE OFFLINE
ora....l1.inst application ONLINE ONLINE node1
ora....l2.inst application OFFLINE OFFLINE
ora.dba.rac.cs application ONLINE ONLINE node2
ora....ll1.srv application ONLINE ONLINE node1
ora....ll2.srv application ONLINE OFFLINE
ora....SM1.asm application ONLINE ONLINE node1
ora....E1.lsnr application ONLINE ONLINE node1
ora.node1.gsd application ONLINE ONLINE node1
ora.node1.ons application ONLINE ONLINE node1
ora.node1.vip application ONLINE ONLINE node1
ora....SM2.asm application ONLINE ONLINE node2
ora....E2.lsnr application ONLINE ONLINE node2
ora.node2.gsd application ONLINE ONLINE node2
ora.node2.ons application ONLINE ONLINE node2
ora.node2.vip application ONLINE ONLINE node2
1、首先找到Net Manager。
2、打开后会看到左侧有四个按钮图标,中间的Oracle Net配置下有一个服务命名。
3、鼠标点击“服务命名”后,点击左侧的绿色加号,出现如图所示界面,输入“网络服务名”,网络服务名是自己命名的,没有硬性限制。
4、点击“下一步”后,点击TCP/IP协议,如图所示。
5、点击“下一步”,设置“服务名”,连接类型一般是“数据库默认设置”,如图所示。
6、点击“下一步”就会显示“测试”界面,代表设置已经完成,一般Oracle上默认的有sys用户和scott用户,scott用户的密码是:tiger。
查询是数据的一个重要操作。用户发送查询请求,经编译软件变异成二进制文件供服务器查询,后返回查询结果集给用户,查询会产生一个虚拟表,看到的是表形式显示的结果,但结果并不真正的存储,每次执行查询只是从数据表中提取数据,并按照表的形式显示出来。
SELECT 列名
FGROM 表名
[WHERE 查询条件表达式]
[GROUP BY 分组表达式]
[HAVING 分组查询表达式]
[ORDER BY 排序的列名 [ASC或DESC]]
group by 用于对查询的结果分组统计,通过对group by后面的名字进行分组后输出结果。
group by后面还可以跟多列表示 多列分组 ,在多列分组时放前面的优先分组。
group by 列名,列名
having 子句用于限制分组显示结果,其只能和group by一起连用。在where中没有办法直接使用聚合函数,即sum avg等无法使用,所以引用了having,在having中可以使用这些函数。
order by 表示排序,后跟列名和排序方式。如果什么都不加默认为升序。ASC表示升序,DESC表示降序。
在Oracle中还可以设置多列排序
order by 列名1 升降,列名2 升降;
前面的为主要排序,后面的为次一级排序。
注:碰到自己与自己比较的情况下,不能用having,可以创建一个新列。
注:如果select语句同时包含group by,having,order by,按group by,having,order by排序
分组和聚合一起使用,目的是为了统计信息。
where是为了from服务的,只能跟 真实的字段 ,用来筛选from子句中指定的操作所产生的行
group by 用来分组where子句的输出
having 用来从分组的结果中筛选行
order by用来对筛选的结果进行排序
(1)分组函数:max min avg sum count
max表示该列的最大值,min表示该列的最小值,avg表示该列的平均值,sum表示该列的和,count表示该列的行数。
注:分组函数(max、min、avg、count、sum)只能出现在选择列表中having子句、order by子句、不能出现在where子句和group by子句中。
(2)多表查询
多表查询是指两个和两个以上的表或者是视图的查询,在实际应用中,当查询单个表不能满足需求时,一般使用多表查询。如:显示sales部门位置和其员工的姓名,这种情况下需要使用到(dept表和emp表)。
多表查询的连接一般可以分为:内连接、左外连接、右外连接、全连接。
注:在使用多表查询的时候每个表可以设置别名,如果表指定了别名,那么语句中所有语句必须使用别名,而不能再使用实际表名。且在写属性的时候如果属性为其中一个表特有的属性则不需要写别名,如果是两个表都有则必须指定是哪一个表的哪个属性格式为:表名.属性名。
select 列名 from 表1 别名,表2 别名...
注:e是emp的别名,d是dept的别名。
但如果对表进行了操作则需要设置别名,如:查询每个部门中工资高于该部门平均工资的员工人数。在其中有一个avg表,这个表必须设置别名(提醒:如果仅有一个被修改的表,则可以不设置别名,但如果有多个表则必须设置别名)。
内连接
内连接通过使用比较运算符来使每个表的通用列中的值匹配来组成一个新表,即:把两个表中间共有的那些行拿出来进行连接,如果某些行不是两个表共有的,则不进行连接。
select
from 表1
inner join 表2
on 匹配条件
或
select
from 表1 表2
where匹配条件
左外连接
左外连接与内连接的区别是:设置左外连接的时候设置了主表和附表,主表在前,附表在后。内连接是将两个表匹配的地方输出出来,而左外连接则是主表全写,附表一一对应,附表有则加上,没有不写。
select
from 表1
left join 表2
on 匹配条件
右外连接
右外连接和左外连接基本相同只是右外连接的主表写在后边。
select
from 表1
right join 表2
on 匹配条件
全连接
全连接是在等值连接的基础上将左表和右表的未匹配数据都加上,使用的关键字为full outer join或者full join。
select
from 表1
full join 表2
on 匹配条件
自连接
还有一种特殊情况即自连接,在Oracle中一个表无法与自己进行比较,所以当需要自己表的两个信息做比较的时候也需要使用连接来连接,即同一张表的连结查询。
(3)子查询
子查询是指嵌套在其他sql语句中的select语句,也叫嵌套查询。sql语句执行顺序为从右到左执行,所以在执行查询时会先执行左侧的子查询后进行主查询。
子查询分为单行子查询和多行子查询,单行子查询是指返回一行数据的子查询语句,多行子查询是指返回多行数据的查询语句。子查询还可以分为多列子查询、多行子查询、多列多行子查询。
在进行子查询时如果内部查询不返回任何记录,则外部条件中字段DEPTNO与NULL比较永远为假,也就是说外部查询不返回任何结果。
总结为:
单行子查询是指子查询只返回单列、单行数据
多行子查询是指返回单列多行数据,都是针对单列而言的
多列子查询则是指查询返回多个列数据的子查询语句
单行子查询
where deptno = (单行数值)
多行子查询
where deptno in ( 多行数值 )
多列子查询:
where (job,deptno)=(select job,deptno from emp where ename='KING')
多列多行子查询
where (job,deptno) in (select job,deptno from emp where ename='KING')
单行子查询
在单行子查询的外部查询中可以使用=、、、=、=、等比较运算符。
内部查询返回的结果必须与外部查询条件中字段(DEPTNO)相匹配。
多行子查询
在WHERE子句中使用多行子查询时,可以使用多行比较运算符(IN,ALL,ANY)。
IN:等于任何一个。
ALL:和子查询返回的所有值比较。例如:salALL(1,2,3)等价于sal3,即大于所有。
ANY:和子查询返回的任意一个值比较。例如:salANY(1,2,3)等价于sal1,即大于任意一个就可以。
注:ANY运算符必须与单行比较运算符结合使用,并且返回行只要匹配子查询的任何一个结果即可。
多列子查询
多列子查询和多行子查询相同,只是使用多列子查询的时候会有多列进行匹配。
(4)集合运算
为了合并多个select语句的结果,可以使用集合操作符号union,union all,intersect,minus。
union:该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行
union all:该操作与union相似,但是它不会取消重复行,而且不会排序
intersect:使用该操作符用于取得两个结果集的交集
minus:使用该操作符用于取得两个结果集的差集,它只会显示存在第一个集合中,而不存在第二个集合中的数据
总结为集合运算就是将两个或者多个结果集组合成一个结果集。
intersect 交集 返回两个查询共有的记录
union all 并集 返回各个查询的所有记录,包括重复的记录
union 交集 返回各个查询的所有记录,不包括重复的记录
MINUS 补集 返回第一个查询检查出的记录减去第二个查询检索出来的记录之后剩余的记录
注意:当使用集合操作的时候,查询所返回的列数以及列的类型必须匹配,列名可以不同。
(1)Distinct关键字
在Oracle中,可能出现若干相同的情况,那么可以用Distinct消除重复行
(2)多表查询与单行子查询可以实现相同的功能
查询出销售部(sales)下面的员工姓名,工作,工资
(3)显示高于自己部门平均工资的员工信息
分析:
1.找到所有部门的平均工资
select deptno,avg(sal) from emp group by deptno;
2.找到所有人的工资信息
select ename,sal,deptno from emp;
3.把两个结果集使用多表连接组合组合起来
select * from emp,(select deptno,avg(sal) avgsal from emp group by deptno) damao where emp.deptno=damao.deptno;
4.去掉低于平均工资的那些数据即可:
select * from emp,(select deptno,avg(sal) avgsal from emp group by deptno) damao where emp.deptno=damao.deptno and salavgsal;
(4)emp表介绍
字段 类型 描述
empno NUMBER(4) 表示雇员编号,是唯一编号
ename VAECHAR2(10) 表示雇员姓名
job VARCHAR2(9) 表示工作职位
mgr NUMBER(4) 表示一个雇员的领导编号
hiredate DATE 表示雇佣日期
sal NUMBER(7,2) 表示月薪,工资
comm NUMBER(7,2) 表示奖金,或者称为佣金
deptno NUMBER(2) 部门编号