??xml version="1.0" encoding="utf-8" standalone="yes"?> ~冲池命中率 q个比率说明了ؓ面h提供服务Ӟ数据库管理器不需从磁盘装入页Q即该页已经在缓冲池中)p处理请求的旉癑ֈ比?/p> 计算Q?/p> BPHR = (1 - ((~冲池数据物理读 + ~冲池烦引物理读) / (~冲池数据逻辑?+ ~冲池烦引逻辑? ) ) * 100% 索引命中?/p> q个比率表明了可以在~冲池中扑ֈ的页面能够满的对烦引页的所有读h所占的癑ֈ比?/p> 计算Q?/p> IHR = (1 - (~冲池烦引物理读 / ~冲池烦引逻辑? ) ) * 100% 数据命中?/p> q个比率说明了可以在~冲池中扑ֈ的页面能够满的Ҏ据页的所有读h所占的癑ֈ比?/p> 计算Q?/p> DHR = (1 - (~冲池数据物理读 / ~冲池数据逻辑? ) ) * 100% l论 ~冲池命中率大于 80% 被认为是理想的。对?OLTP pȝ来说Q该值的理想情况是尽可能接近?100% Q烦引命中率更是如此Q?/p> 要提高缓冲池的命中率Q可以增加缓冲池的大,也可以考虑分配多个~冲池,可以为每个经常访问的h自己的表I间的大型表使用一个缓冲池Q也可以Zl小型表使用一个缓冲池?/p>DB2 ~冲池调优Bufferpools
1、用命?db2 get dbm cfg |find "SVCENAME" 查找到TCP/IP 服务?/span>
2、到pȝ配置文g里找到service name 对应?port number
windowsQ查?c:\windows\system32\drivers\etc\services
aixQ?nbsp; 查看 /etc/services
如下Q?/span>
DB2_DB2 60000/tcp
DB2_DB2_1 60001/tcp
DB2_DB2_2 60002/tcp
DB2_DB2_END 60003/tcp
db2c_DB2 50000/tcp
3、?netstat -an 命o查找tcp/ip 服务的端?/span>
4、修改端口号
直接修改services文g中当前服务名对应的端口号
如:db2c_DB2 50000/tcp
然后重启数据库即OK db2stop db2start
5、另外附上一个关?a target="_blank" style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; color: #6795b5; text-decoration: none; cursor: pointer; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; word-wrap: break-word;">linuxpȝ下的查找ҎQ摘抄帖子)Q?/span>
In JDBC configurations for WPA, you have to specify the port that DB2 is listening on. I usually look for /etc/services or try one of 50000/50001 and it usually works. In SUSE Linux, both the solutions did not work and there was another process (Multithreaded routing toolkit aka mrt) was listening on port 50000.
So how do we find out the DB2 port in a reliable way? Read on...
Step 1: Set the DB2 environment.
$ . ~db2inst1/sqllib/db2profile
Step 2: Find the service name for DB2 instance. It basically involves running "db2 get dbm cfg" command and finding a line containing SVCENAME.
$ svc=`db2 get dbm cfg | grep SVCENAME | cut -d= -f2 | awk '{print $1}'`
Step 3: Find the service name that you got from Step 2 in /etc/services or %SYSTEMROOT%\system32\drivers\etc\services. That is the port DB2 is listening on. $ grep $svc /etc/services
Hope you find this useful.
用sqoop做测试,发现端口?0000被占用了Q所以就更改了一下DB2的端口号?/span>
W一步,dDB2数据库的实例用户Q我q里是db2inst1
db2 get dbm cfg|grep SVCENAME
可以看到对应的SVCENAME的名U是什么?/span>
q里Ҏ出现一个问题。按照网上有的,会将SVCENAME改ؓ端口P那个是错误的。一定要这个名U和services中的名称l一?/span>
W二步,退回到root用户Q?/span>
vim /etc/servicesQ找到对应的SVCENAME的名U所对应的端口号?/span>
我这里直接编辑成50001
W三步,先关数据库,再开可以了?/span>
db2stop
db2start
实际上没有复杂的步骤Q只是好多h写的比较的ؕQ还不加解释说明Q所以坑了些?/span>
可以通过db2 get dbm cfgQ查询数据库理器配|参敎ͼ可以查到端口号或端口名?/p>
CZQ?/p>
$ db2 get dbm cfg | grep -i svcTCP/IP Service name (SVCENAME) = 50000
50000是端口号了?/p>
如果查到的是端口名,可以通过|络服务配置文g来找到对应关pR?/p>
CZQ?/p>
$ db2 get dbm cfg | grep -i svc
TCP/IP Service name (SVCENAME) = db2c_DB2
q时Q就需要查找db2c_DB2对应的端口号了?/p>
$ cat /etc/services | grep db2c_DB2
db2c_DB2 60000/tcp
q个60000是端口号了?/p>
如果DB2是装在windows的server上,那么需要查找这个配|文件了QC:\WINDOWS\system32\drivers\etc\services格式Qdb2c_DB2 50000/tcp
如果下:Table_A表和Table_B表,要求查询出在Table_A表中不在Table_B表中的记录?/p>
很容大家W一旉相当的写法是Q?/p>
SELECT * FROM dbo.Table_A AS a WHERE a.ID NOT IN ( SELECT b.ID FROM dbo.Table_B AS b)
然而查询出来ƈ没有辑ֈ预期?/p>
ID Name
001 张三
003 王五
原因很简单:׃NULL不能q行如何?#8220;操作”
–如果null参与术q算Q则该算术表辑ּ的gؓnull。(例如Q?Q?Q?Q? 加减乘除Q?/p>
–如果null参与比较q算Q则l果可视为false。(例如Q?gt;=,<=,<> 大于Q小于,不等于)
–如果null参与聚集q算Q则聚集函数都置为null。除count(*)之外?/p>
--如果在not in子查询中有null值的时?则不会返回数据?nbsp; Q最单的解释请参考下面的评论说明Q?nbsp;
--正确写法 SELECT * FROM dbo.Table_A AS a WHERE a.ID NOT IN ( SELECT b.ID FROM dbo.Table_B AS b WHERE b.ID IS NOT NULL ) --排除NULL值参与运符比较 --修改为关联查询方? --正确写法1 SELECT * FROM dbo.Table_A AS a WHERE NOT EXISTS ( SELECT * FROM dbo.Table_B AS b WHERE a.ID = b.ID ) --正确写法2 SELECT * FROM dbo.Table_A AS a LEFT OUTER JOIN dbo.Table_B AS b ON a.ID = b.ID WHERE b.ID IS NULL
在DB2中,null?#8216;’是完全不同的两个东西?/p>
NULL是一个不定值它不能通过列D滤,只能通过IS NULL 或者IS NOT NULL方式qo
?#8216;’可以用inQ?Q?lt;>,>,<来比较判断?br style="-webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;" />
此外Q若一个属性的gؓnullQ则select昄Ӟ会以-代替Q?#8216;’则直接什么都不显C?/p>
select * from t1 where exists ( select null from t2 where y = x )
for x in ( select * from t1 ) loop if ( exists ( select null from t2 where y = x.x ) then OUTPUT THE RECORD end if end loop
我们的项目中使用CIBM的DB2数据库,pȝ开发语a是C++Q操作数据库是直接在C++中编写ESQLQ嵌入式SQLQ语句。在使用中发玎ͼ只要有文件名?位相同,造成部分文g中的代码失效?
原因Q?/strong>
------------------
db2默认情况下?.sqC的名字生?.bndQ又?.bnd的文件名部分在数据库中做l定Q徏一个同名的package。而db2的package的名字是?a >八字节长度限?/font>的,造成前八位文件名相同的C++代码QM后面的覆盖前面的?
知道原因好办事了?
解决Q?/strong>
------------------
取原始文件名的md5摘要前N位,拼成bnd文g的名字,再以此文件去目标数据库做l定Q这样package׃会前后覆盖了?
makefile中实际的做法Q?/strong>
------------------------%.C : %.sqC
db2 connect to $(dbName) user $(dbUser) using $(dbPassword);\
db2 prep $*.sqC bindfile;\
cp $*.bnd ${shell echo $* |md5sum -|cut -c1-8}_$*.bnd;\
db2 bind ${shell echo $* |md5sum -|cut -c1-8}_$*.bnd;\
db2 connect reset; \
db2 terminate;
在这专栏文章中Q我讨论如何创建分Q解释分的定义如何决定各个记录的存储位置?
范围分区?/p>
数据分区也称_当前 DB2 只支持范围分区方案)Q一个数据分区包含一个行子集Q这些行存储在与表中其他行集不同的地斏V不同的数据分区可以ȝ在不同的表空间中Q也可以ȝ在相同的表空间中。CREATE TABLE 语句?PARTITION BY 子句中提供的信息军_表数据的分区方式。这个可选子句的语法取决于是希望?DB2 在指定的表数据范围内均匀地生成每个分_q是要手工控制每个范围的边界。对于给定的表数据范围自动生成分区的语法是:
PARTITION BY <RANGE>
([ColumnName] <NULLS LAST | NULLS FIRST> ,...)
(
STARTING <FROM> [Start | MINVALUE | MAXVALUE] |
STARTING <FROM> ([Start | MINVALUE | MAXVALUE] ,...)
<INCLUSIVE | EXCLUSIVE>
ENDING <AT> [End | MINVALUE | MAXVALUE] |
ENDING <AT> ([End | MINVALUE | MAXVALUE] ,...)
<INCLUSIVE | EXCLUSIVE>
EVERY <(>[Constant] <DurationLabel> <)>
,...)
手工指定分区的语法是Q?/p>
PARTITION BY <RANGE>
([ColumnName] <NULLS LAST | NULLS FIRST> ,...)
(
<PARTITION [PartitionName]>
STARTING <FROM> [Start | MINVALUE | MAXVALUE] |
STARTING <FROM> ([Start | MINVALUE | MAXVALUE] ,...)
<INCLUSIVE | EXCLUSIVE>
ENDING <AT> [End | MINVALUE | MAXVALUE] |
ENDING <AT> ([End | MINVALUE | MAXVALUE] ,...)
<INCLUSIVE | EXCLUSIVE>
<IN [TSName]>
<INDEX IN [IndexTSName]>
<LONG IN [LongTSName]>
其中Q?/p>
ColumnNameQ用名称指定一个或多个列(最?16 列)Q这些列的值用来决定数据行应该存储在哪个数据分Z。(指定的列l成表的分区?— 参见Ҏ “选择表分区键”。)数据cd?LONG VARCHAR、LONG VARGRAPHIC、BLOB、CLOB、DBCLOB、XML、基于这些数据类型的 distinct cd和结构化数据cd的列都不能作为数据分区键的组成部分?/p>
PartitionNameQ指定分配给要创建的数据分区的惟一名称?/p>
StartQ指定每个数据分区的范围下限?/p>
EndQ指定每个数据分区的范围上限?/p>
ConstantQ在使用语法的自动生成Ş式时Q指定每个数据分围的宽度。从 STARTING FROM 值开始创建数据分区,数据分区的范围内包含指定数量的倹{支持这U语法的条g是分区键由单一列组成,q一列的数据cd是数字、日期、时间或旉戟?/p>
DurationLabelQ如果分区键列的数据cd是日期、时间或旉戻Iq个参数指定?Constant 值相关的旉单位。这个参数的有效值是QYEAR、YEARS、MONTH、MONTHS、DAY、DAYS、HOUR、HOURS、MINUTE、MINUTES、SECOND、SECONDS、MICROSECOND ?MICROSECONDS?/p>
TSNameQ指定存储每个数据分区的表空间?/p>
IndexTSNameQ指定存储每个数据分区的分区索引的表I间?/p>
LongTSNameQ指定存储长列的值的表空间?/p>
注意Q尖括号 (< >) 中的参数是可选的Q方括号 ([ ]) 中的参数或选项是必需的,必须提供它们Q逗号后面跟着省略?(...) 表示前面的参数可以重复出现多ơ?/p>
因此Q如果希望创Z个名?SALES 的分Q把每个季度的数据存储在单独的分ZQ每个分区驻留在不同的表I间中,那么可以执行以下 CREATE TABLE 语句Q?/p>
CREATE TABLE sales
(sales_date DATE,
sales_amt NUMERIC(5,2))
IN tbsp0, tbsp1, tbsp2, tbsp3
PARTITION BY RANGE (sales_date)
(STARTING '1/1/2010' ENDING '12/31/2010'
EVERY 3 MONTHS)
?1 说明生成的表是什么样的?/p>
?1. 一个简单分中存储的数据
另一斚wQ如果希望创Z个名?INVENTORY 的分Q把物品~号?1 ?100 之间的行存储在一个表I间中的一个分ZQ把~号?101 ?200 之间的行存储在另一个表I间中的另一个分ZQ以此类推,那么可以执行下面?SQL 语句Q?/p>
CREATE TABLE inventory
(item_no INT,
desc VARCHAR(20))
PARTITION BY (item_no NULLS FIRST)
(PARTITION PRODUCE STARTING MINVALUE ENDING 100 IN tbsp0,
PARTITION DAIRY STARTING 101 ENDING 200 IN tbsp1,
PARTITION BAKERY STARTING 201 ENDING 300 IN tbsp2,
PARTITION MEAT STARTING 301 ENDING 400 IN tbsp3)
选择表分区键
选择有效的表分区键列对于发挥表分区的优势非常重要。最有效的表分区键列是有利于分区消除的列。例如,如果通常按日期查询表中的记录Q那么应该用日期或时间列q行表分区?/p>
同样Q如果希望随着旉的推UL表数据的一部分删除或存档,应该Ҏ期望的记录存档方式进行表分区。例如,如果希望把三q前的所有数据都存档Q应该按周、月或季度进行表分区Q这样就可以分别在每周、每月或每季度末删除一个老分区?/p>
对于q个CZQITEM_NO 值在 1 ?100 之间的行存储在名ؓ PRODUCE 的分ZQ这个分区的数据写到表空?TBSP0 中)QITEM_NO 值在 101 ?200 之间的行存储在名ؓ DAIRY 的分ZQ这个分区的数据写到表空?TBSP1 中)Q依ơ类推;ITEM_NO gؓ NULL 的行存储在 PRODUCE 分区中?/p>
一定要注意Q当指定 NULLS FIRST 选项ӞW一个分区必M MINVALUE 开始。(同样Q如果?NULLS LAST 选项Q最后一个分区必ȝ束于 MAXVALUE。)否则Q在插入分区键列?NULL 值的记录Ӟ会?“data out of bounds” 错误。另外,每个分区的数据、烦引和长列数据可以攑֜不同的表I间中。如果不为烦引或长列指定表空_分区索引和长列数据会存储在与数据相同的表I间中?/p>
在默认情况下Q范围包含边界本w。要想防止在某一分区中存储特定的记录Q可以用 EXCLUSIVE 选项创徏范围。例如:
CREATE TABLE sales
(sales_date DATE,
sales_amt NUMERIC(5,2))
IN tbsp0, tbsp1, tbsp2, tbsp3
PARTITION BY RANGE (sales_date)
(STARTING '1/1/2010' ENDING '3/31/2010' EXCLUSIVE,
STARTING '3/31/2010' ENDING '6/30/2010' EXCLUSIVE,
STARTING '6/30/2010' ENDING '9/30/2010' EXCLUSIVE,
STARTING '9/30/2010' ENDING '12/31/2010')
在这个示例中Q销售日期ؓ 3/31/2010 的记录不会存储在表空?TBSP0 中,而是存储在表I间 TBSP1 中?/p>
当在分区表中插入行时Q会Ҏ键值及其所处的范围自动地把它放到适当的数据分Z。如果键g处于表的M范围内,插入操作׃p|q生一个错误?/p>
L地移入和Ud数据
使用分区表的另一个优ҎQ可以轻村֜在表中添加新数据Q作为新的数据分区)Q同时可以轻村֜删除q存档老数据。在下一专栏文章中Q我讲解添加(UdQ和删除Q移出)数据分区的过E。还要讨?DB2 9.7 中的改进如何大大加快Ud和移出数据分区的速度Q减这些操作生的q扰?
d:/>db2 ? sql0911n
SQL0911N因ؓ死锁或超Ӟ所以当前事务已回滚。原因码?br /> "<原因?gt;"?br />
解释:
当前工作单元涉及到未解决的对使用对象的争用,因此不得不回滚?br />
原因码如下:
2 ׃死锁而导致事务已回滚?br />
68 ׃锁定时而导致事务已回滚?br />
72 因ؓ存在与事务中所涉及?nbsp;DB2 Data Links Manager
有关的错误,所以事务已回滚?br />
注释: 必须再次输入与工作单元相关的更改?br />
应用E序已回滚至上一?nbsp;COMMIT?br />
用户响应:
Z帮助避免死锁或锁定超Ӟ寚w旉q行的应用程序或有可能遇到死?br />的应用程序频J发?nbsp;COMMIT 操作Q如果有可能的话Q?br />
联合pȝ用户Q死锁可能发生在联合服务器或数据源上。没有检跨数?br />源ƈ潜在地跨联合系l的死锁的机制。有可能标识使请求失败的数据源(
参阅 Problem Determination Guide 以确定哪一个数据源?nbsp;SQL
语句的处理失败)?br />
当处?nbsp;SQL 语句的某些组合时Q通常会发生死锁或者预期会发生死锁。徏?br />您设计应用程序来可能避免死锁?br />
sqlcode : -911
sqlstate : 40001
d:/>
今天看了一文章,觉得不管怎么sortheap的重要性都不ؓq。理由我后面肯定会写详细的,q里写记录下Q占个位|:
----2007.07.10.00?3Q没惛_?0可以ؓ9号呢 Q?号刚q?img alt="" src="http://acme1921209.iteye.com/javascripts/fckeditor/editor/images/smiley/msn/sad_smile.gif" />Q?/p>
========================
感觉学的不是很好Q没有达到目标,但还是把q?天学的写上吧 ?/p>
1.sortheap在数据库配置说明上是q样的:定义要用于专用排序的专用内存늚最大数目,或者要用于׃n排序的共享内存页的最大数目。现在这个项目ƈ没有启动分区q行性,所以此参数只是表示要用于专用排序的专用内存늚最大数目。不知道是我没理解好Q还是db2没有说好Q其实这个参数还有个很重要的作用Q数据库在执行散列连接sql的时候也用到此内存区域。db2 ?个表q行q接的时候,只有3U类型:嵌套Q合qӞ散列。其中散列连接用的最多(我在执行复杂sql的时候是q样的,单的没有试q大家可以测试下Q。进行散列连接的时候,数据库会把其中一个表的内容复制到sortheap对应的内存中Q如果sortheap对应的内存不够大Q就会吧余下的数据库复制C时表I间中。然后进行连接比较。可以想x作内存和操作盘的差别吧Q所以我们应量大的讄sortheapQ他不溢出到硬盘中Q或者很溢出。(关于上面3中嵌套,合ƈQ散列连接类型,可以看下面的附gQ附件中有很详细的说明)
2. 查看是否溢出的方法:
大家执行下面的命令: db2 gen snapshot for db on 数据库名 Q这个命令不需要打开db2的快照开养Idb2有些默认的快照信息)。在输出的信息中查找下面的信息:
已分配的专用排序堆L = 0
已分配的׃n排序堆L = 0
׃n排序堆高水位标记 = 0
总计排序 = 34600
总计排序旉Q毫U) = 35491
排序溢出 = 2384
zd排序?nbsp; = 0
?/p>
散列q接?nbsp; = 38808
散列循环?nbsp; = 0
散列q接溢出?nbsp; = 534
散列连接溢出数 = 1
排序溢出 /总计排序 可以得到溢出比例 Q?font size="+0">如果溢出比例大于 3 个百分点Q那么在应用E序 SQL 中会出现严重的或意外的排序问题。因为正是溢出的存在表明发生了大的排序,所以理想的情况是发现没有排序溢出或臛_其百分比于一个百分点?br />如果出现q多的排序溢出,那么“应?#8221;解决Ҏ是增加SORTHEAP的大。然而,q样做只是掩盖了真实的性能问题。相反,您应该确定引h序的 SQL q更改该 SQL、烦引或集来避免或减少排序开销。如果溢出比例大?5 Q作ZU经验之谈)Q那么每个事务的排序数可能很大。虽然某些应用程序事务执行许多小的组合排序(它们不会溢出q且执行旉很短Q,但是它消耗了q多?CPU。当SortsPerTX很大Ӟ按我的经验,q些机器通常会受?CPU 的限制。确定引h序的 SQL q改q存取方案(通过索引、群集或更改 SQLQ对提高事务吞吐率是极ؓ重要的?/font>Q?/p>
散列q接?nbsp; 是在执行sql的时候进行散列连接的数目。这里只说下散列循环?nbsp;的意义,其他参数的意义在下面的附件中都有很详l的说明Q?nbsp; 我在试的时候,把sortheap讄?6个页Q然后执行复杂的sqlQ散列@环数有|而且很高。一般看到散列@环数有值就要注意,他说明你的sortheap或?font size="+0">SHEAPTHRESQ实例参数Q太低了。现在的试情况p明sortheap太低了。另外一U情?font size="+0">SHEAPTHRES太低的原因: SHEAPTHRES已经分配l前面的代理q程了,再有代理q程甌sortheap的时候,SHEAPTHRES已经辑ֈ上限了,q个时候db2׃l申请sortheap的进E很的|此时代理q程q行散列q接的时候就需要把很多数据攑ֈ盘上,q个时候就会导致散列@环数值很高,q个时候大家可以增?SHEAPTHRESq行观察?/font>
3.查看排序溢出的sqlҎQ?首先打开快照监视器: db2 update monitor switches using sort on statements on ;
然后q段旉Q?分钟可以了Q执?get snapshot for all on 数据库名Q?/p>
在输出的信息中查找:语句排序溢出 = 1 Q看对应的sqlq道了Q对sql的执行计划分析下明白了?/font>
记得在测试完要关?快照开养I db2 update monitor switches using sort off statements off;
本文的目的就是通过详细的实例来阐述如何在DB2 UDB 中监控死锁的发生。在DB2 UDB中有两种cd的监控器Q快照监控器和事件监控器。快照顾名思义是数据库连l状态下的一个切面,通过快照监控器,你可以很方便地查看当前连接的应用E序Q当前等待的锁,当前的死锁,以及正在执行的SQL语句Q同时你可以查看~冲区,表和表空间的用法。如果保存历史数据,q且能够做出比较Q对于分析数据库的ƈ发性能有很大的帮助?/p>
但是我们q不能预什么时候发生死锁,所以如果有一个后台程序能够一直监控数据库的活动,记录下所有的死锁事gQ这对于数据库管理员来说是非帔R要的。DB2 UDB提供了事件监控器。通过不遗漏地获得一D|间内所有的数据库事Ӟ在本文中只关心其中的死锁事gQ,事g监控器提供了一U可以分析历史数据(本文的重点)Q预将来趋势的可能。DB2 UDB同时提供了DB2 Performance Expert (DB2/PE) 或者类似的E序用来生成分析报表Q不q这已经出了本文的范畴?/p>
锁是控制应用E序q发的数据库软g机制Q锁用来防止以下情况的发生:
1Q?丢失以前更新
2Q?不可重复d
3Q?讉K未提交数?/p>
锁的模式包括׃n锁和排他锁,׃n锁允许其他程序读取已l被其他׃n锁占用的资源Q所以也叫读锁,排他锁意味着在释放资源以前其他的应用E序无法讉K同一资源Q所以也叫写锁。此外,DB2 UDB q提供了不同的锁U别Q不同的应用E序可能会要求访问不同范围的数据Q锁U别有利于充分利用系l资源,提高pȝ性能。若一个应用程序请求一个锁Q而该锁被另外一个应用程序所使用且不能共享,DB2 UDB ׃挂v前一个应用程序。锁升是当LOCKLIST (LOCKLIST代表锁能够占用的内存I间) 耗尽或者一个应用程序所拥有的锁大于MAXLOCKS*LOCKLIST的时候(MAXLOCKS 代表应用E序所拥有的锁占所I间的百分比Q,DB2 UDB p图把几个行别的锁合qؓ一个表U别的锁Q从而释NI间。虽焉升本nq不耗费多少旉Q但是锁住整个表通常会大大地降低q发性能?/p>
当应用程序处于挂L态超q了一D规定的旉后,DB2 UDB׃自动中止q个应用E序Q同时会向SQLCA发送描q性的错误信息。当两个或者更多的应用E序都持有另外一个应用程序所需资源上的锁,没有q些资源Q那些应用程序都无法l箋完成其工作的时候,׃发生死锁?/p>
在DLCHKTIME时之后QDB2 UDB会中止发生死锁的某个应用E序Q通常为所做工作最的那个应用E序Q,q会释放q个应用E序所持有的所有的锁,q允许别的应用程序l工作,DB2 UDB 向被终止的应用E序的SQLCA发送描q性的错误信息。LOCKTIMEOUT 指定一个应用程序被允许的锁{待的时_q将避免全局的死锁从而导致整个应用崩溃。如果LOCKTIMEOUT 的gؓ-1Q应用程序会{待直到该锁被释放或者发生一个死锁?/p>
事g监控器用来收集当一个数据库事g发生时所兌的应用程序的信息。这里的事g指,q接Q死锁,声明和事务。你可以定义你想监控的事件类型的监控器。比如说Q一个死锁监控器是用来监控死锁的发生?/p>
在DB2 UDB 中存在两U和死锁有关的事件类型:
Z详细说明事g监控器在死锁监控中的用途,我引入了一个简单的死锁场景来触发一个死锁,在随后的章节Q我会告诉读者如何分析监控结果以及根据结果来避免死锁的发生?/p>
q里我们需要至三个应用程序来调用DB2 CLIQ一个用来监控死锁的发生Q另外两个用来生死锁。我们可以用DB2 UDB 安装旉带的SAMPLE数据库?/p>
1Q?首先建立一个死锁事件监控器
db2 connect to sample db2 "create event monitor dlmon for tables, deadlocks with details write to file 'C:\dlmon'" mkdir C:\dlmon db2 "set event monitor dlmon state 1" |
2Q?用另外两个应用程序来产生一个死?/p>
Session A
db2 connect to sample db2 +c "insert into employee values('000350', 'Truman', 'I', 'Jiang', 'B00', '5892', '1999-02-21', 'Engineer', 19, 'M', '1978-06-17', 60000, 2000, 6000)" |
现在应用E序A拥有了一个EMPLOYEE表的行别的排他?/p>
Q注: +c 代表不自动提交SQL语句QDB2 ?autocommit 是缺省设|,也可以通过 db2 update command options using c off 关闭该缺省选项。)
db2 connect to sample db2 +c "insert into project values('AD3300', 'Dead Lock Monitor', 'B00', '000350', 7.00, '1982-07-21', '1983-02-03', 'AD3111')" |
现在应用E序B拥有了一个PROJECT表的行别的排他?/p>
Session A
db2 +c "select projname from project" |
应用E序A需要PROJECT表上所有行的共享锁Q但是因为PROJECT表正在被应用E序B以排他锁的Ş式独占,q时候应用程?p入一个锁{待的状态?/p>
Session B
db2 +c "select firstnme from employee" |
应用E序B也进入一个锁{待的状态。此时就出现了一个死锁状态?/p>
3Q?两个本n处于锁等待ƈ且占有资源的应用E序互相{待另外一Ҏ持有的资源,q时候Session A和Session B出C死锁状态,q种状态一直会延箋直到死锁查器Q超出DLCHKTIME旉以后Q检查出一个死锁ƈ且回滚其中的一个事务?/p>
Session B
SQLN0991N 因ؓ死锁或者超Ӟ当前事务已经被回滚。原因码?"2". SQLSTATE=40001 q时候死锁事件监控器׃记录q个死锁Q同时应用程序A可以完成他的工作? |
PROJNAME ---------------------------------------- …… 20 条记录已选择 |
db2 connect reset |
db2 connect reset |
4Q?通过 db2evmon 工具可以获得死锁信息的日志,q且把日志文件导入到本地机器的文件系l当中。在下面一节,我们详l分析导出的日志文g?/p>
Session Monitor db2 connect reset db2evmon -path c:\dlmon > c:\dlmon\dllog1.txt |
本节我们开始详l分析上一节生的监控l果Q从监控导出的日志文件中Q我们可以分析出死锁发生的时_U别Q模式以及生死锁的SQL语句Q从而据此来q一步地修正可能q序ƈ发设计或者数据库设计所D的缺陗?/p>
-------------------------------------------------------------------------- EVENT LOG HEADER Event Monitor name: DLMON Server Product ID: SQL08022 …… Server instance name: DB2 -------------------------------------------------------------------------- -------------------------------------------------------------------------- Database Name: SAMPLE Database Path: C:\DB2\NODE0000\SQL00001\ …… -------------------------------------------------------------------------- 3) Deadlock Event ... Deadlock ID: 1 …… 4) Connection Header Event ... Appl Handle: 949 …… 5) Deadlocked Connection ... Deadlock ID: 1 Participant no.: 2 Participant no. holding the lock: 1 Appl Id: G9B56A72.HE13.01B406083205 Appl Seq number: 0001 Appl Id of connection holding the lock: G9B56A72.HD13.02CE06083152 …… Deadlock detection time: 2006-01-06 16:34:27.327582 Table of lock waited on : EMPLOYEE (A锁发生的? Schema of lock waited on : JT Tablespace of lock waited on : USERSPACE1 Type of lock: Row QA锁别ؓ行锁Q? Mode of lock: X - Exclusive QA锁模式ؓ排他锁) Mode application requested on lock: NS - Share (and Next Key Share) Q在A排他锁上要求B׃n锁,发生死锁Q? …… Text : select name from employee Q生B׃n锁的SQL语句Q? List of Locks: Q当前所有锁的列表) …… Lock Name : 0x020005000D0000000000000052 Lock Attributes : 0x00000008 Release Flags : 0x40000000 Lock Count : 1 Hold Count : 0 Lock Object Name : 13 Object Type : Row Tablespace Name : USERSPACE1 Table Schema : JT Table Name : PROJECT Mode : X - Exclusive Q在PROJECT表上有一个排他锁Q? …… Lock Name : 0x02000300000000000000000054 Lock Attributes : 0x00000000 Release Flags : 0x00000001 Lock Count : 1 Hold Count : 0 Lock Object Name : 3 Object Type : Table Tablespace Name : USERSPACE1 Table Schema : JT Table Name : EMPLOYEE Mode : IS - Intent Share Q在EMPLOYEE表上有一个共享锁Q? Locks Held: 6 Locks in List: 6 …… 9) Table Event ... Table schema: JT Table name: EMPLOYEE Record is the result of a flush: FALSE Table type: User Data object pages: 1 …… Rows read: 35 Rows written: 1 …… Tablespace id: 2 Table event timestamp: 2006-01-06 16:37:28.972501 Q记录EMPLOYEE表上发生的事Ӟ |
我们可以分析一下dllog1.txt 文gQ来准确定位死锁发生的原因,看看5QDeadlocked Connection: 我们可以看出死锁发生的表是EMPLOYEEQ同时我们也可以判断是一个对于已被排他锁占有的资源申请共享锁所D的死锁。更加重要的是我们得C产生死锁的SQL语句Q从上面我们可以推断Z定存在别的应用程序在以独占锁的方式占用EMPLOYEE表,q很有可能就是对于EMPLOYEE表的插入或者更新动作造成的?/p>
而这最有可能就是插入或者更C务时间过长所D的,D事务旉q长的原因大体有两种Q一是来自于q发E序的设计和~写Q二是来自于数据库的设计和数据库参数的调整?/p>
本节我们通过仔细地分析事件监控器的结果来推断出导致死锁发生的原因Q从而采取有效的措施去避免死锁的发生。这些措施包括调整数据库参数Q或者修改应用程序的代码Q或者修改SQL语句甚至是数据库的设计来提高代码和SQL语句执行的效率?/p>
早地考虑数据库设计中的ƈ发性问题,p可以提高代码执行的效率,降低E序开发和l护的成本,q里我们提出了一些避免死锁,提高应用E序q发性的Ҏ?/p>
——数据库技术和“事务处理”专家
1998q度的图灵奖授予了声誉卓著的数据库专家詹姆斯·格雷(James Gray)或称吉姆·格雷(JimGrayQJim是James的昵U?。这是图灵奖诞生32q的历史上,l数据库技术的先驱查尔?#183;巴赫?Charles WQBachmanQ?973)和关pL据库之父埃d?#183;Ud(Edgar FQCoddQ?981)之后Q第3位因在推动数据库技术的发展中做出重大A献而获此殊荣的学者?/font>
格雷生于1944q_在著名的国加州大学伯克利分校计机U学p获得博士学位。其博士论文是有关优先文法语法分析理论的。学成以后,他先后在贝尔实验室、IBM、Tandem、DEC{公司工作,研究方向转向数据库领域?/font>
在IBM期间Q他参与和主持过IMS、System R、SQLQDS、DB2{项目的开发,其中除System R仅作为研I原型,没有成ؓ产品外,其他几个都成为IBM在数据库市场上有影响力的产品?/font>
在Tandem期间Q格雷对该公司的主要数据库品ENCOMPASSq行了改q与扩充Qƈ参与了系l字典、ƈ行排序、分布式SQL、Nonstop SQL{项目的研制工作?/font>
在DECQ他仍然主要负责数据库品的技术。格雯入数据库领域Ӟ关系数据库的基本理论已经成熟Q但各大公司在关pL据库理pȝ(RDBMS)的实现和产品开发中Q都遇到了一pd技术问题,主要是在数据库的规模愈来愈大Q数据库的结构愈来愈复杂Q又有愈来愈多的用户׃n数据库的情况下,如何保障数据的完整?Integrity)、安全?Security)、ƈ行?Concurrency)Q以及一旦出现故障后Q数据库如何实现从故障中恢复(Recovery)。这些问题如果不能圆满解冻I无论哪个公司的数据库产品都无法进入实用,最l不能被用户所接受。正是在解决q些重大的技术问题,使DBMS成熟q利进入市场的q程中,格雷以他的聪明才智发挥了十分关键的作用?/font>
目前Q各DBMS解决上述问题的主要技术手D和Ҏ如下Q?/font>
1Q把Ҏ据库的操作划分ؓUC?#8220;事务”(?#8220;事务?#8221;Qtransaction)的一个个原子单位。事务是事务处理(transaction processing)的基本执行单位,即一个事务中的操作要么全部被执行Q要么全部都不执行,卛_行所谓all or none的原则。一个事务一般以一?#8220;开?#8221;语句(begin)开始,先从数据库中取出一些数据,然后q行所需的处理,最后以“提交”语句(commit)l束。如事务中发生异常,则用“异常l止”语句(abort)?#8220;回退”语句(rollback)撤销本事务执行过E中Ҏ据库已做的所有更?x谓undo)Q将数据库恢复到事务开始时的正状态,以保障数据的完整性、一致性?/font>
2Q用户在Ҏ据库发出操作hӞpȝҎ关的不同_度(granularity)的数据元?字段、记录以x个文?“加锁”(10cking)Q加锁的数据被暂时止其他用户讉K(我们q里仅是一U简化的解释Q实际上Q根据用户对数据h的不同性质Q加锁的数据如何对待另一用户的请求,呈现复杂的情况,例如Q如果加锁的数据被修改Q那是绝对禁止其他用戯问的Q而如果加锁的数据只用于读出,则其他用Ldhq将是允许的。这由所?#8220;锁相Ҏ矩?#8221;——lock compatibility matrix理和控?。操作完成后“解锁”(unlocking)。这一机制用以既保持事务之间的“q发?#8221;Q又保证数据?#8220;完整?#8221;?/font>
3Q徏立系l运行日?10g)Q记载各事务的始炏V终点以及在事务中被更新q的面的改前和改后状况(before image和afterimage)Q以便在pȝ出现散障使数据库遭到破坏Ӟ能根据定期或不定期ؓ数据库所作的备䆾(backup)加上日志中的信息数据库恢复到系l故障前的正状态,同时又能保留最后一ơ备份以来对数据库所作的修改?/font>
4。对数据库的M更新分两阶段提交(two-phase commit)。这是基于一个事务可能同时涉及两个不同的数据库系l而必需的,q在分布式系l中ؓ重要?/font>
上述及其他各U方法可ȝ?#8220;事务处理技?#8221;(transaction processing technique)。格雷在事务处理技术上的创造性思维和开拓性工作,使他成ؓ该技术领域公认的权威。他的研I成果反映在他发表的一pd论文和研I报告之中,最后结晶ؓ一部厚厚的专著Transaction ProcessingQConcepts and Techniques(Morgan Kaufmann PublishersQ?993Q另一作者ؓ德国斯图加特大学的AQReuter教授)。事务处理技术虽然诞生于数据库研IӞ但对于分布式pȝQclientQserverl构中的数据理与通信Q对于容错和高可靠性系l,同样h重要的意义?/font>
格雷的另一部著作是The Benchmark HandbookQfor Database and Transaction Processing SystemsQ第1版于1991q_W?版于1993q出版,也是Morgan Kaufmann出版Cև版的。格雯是该出版C?#8220;数据理pȝ丛书”的主~?/font>
格雷在数据库学术界十分活跃。国际上定期或不定期举行的一些重要的数据库学术会议如VLDB、SIGMOD上,都能见到他的w媄Q听C的声韟뀂除了在公司从事研究开发外Q他q兼职在母校伯克利、斯坦福大学、布达佩斯大学从事过教学和讲学活动?992q_VLDB杂志(The VLDB Journal)创刊Q他ZQȝ?/font>
格雷是ACM?988q授予IBM的System R以Y件系l奖?位得奖h之一Q其?人是Donald Chamberlin、Raymond Lorie、Gianfranco Putzolu、Patricia Selinger和Irving Traiger。正是由于格雷在数据库技术方面的声誉QY件业中的“巨无?#8221;微Y公司?993q决定进入大型关pL据库市场Ӟ才不惜用U种手段把格雷从DEC公司挖过来。因格雷不喜Ƣ微软总部所在的多雨的西雅图Q愿意留在阳光灿烂的旧金山,微Y特地在旧金山开辟第二个微Y研究院v湑研究中心BARC(Bay Area Research Center)Q安排格雷Q该研Iȝ。格h然不负所望,领导一个研制小l开发出了MS SQL Server 7Q?Q成为微软历史上一个里E碑式的版本Q而且也成为当今关pL据库市场上的g者?/font>
格雷是在1999q??日于亚特兰大举行的ACM全国会议上接受图灵奖的。格雷发表了“信息技术今后的目标”的演?What Next?一A dozen remaining IT problems)Q纵Z信息技术发展中有关的几个方向性问题。后来,该文l修改后在SIGMOD的会上以What Next?一A dozen IT Research Goals为题再次发表。格L演说在对计算技术的发展作ȝ性回时认ؓQ英国数学家巴贝?Charles BabageQ?791—1871)?9世纪所梦想和追求的计算Z天已l基本实玎ͼ国数学家布什(Vannevar BushQ?890—1974Q曾ȝ斯福ȝ的科学顾?20世纪40q代所设想?#8220;梅米克斯”MEMEX?#8220;记忆延?#8221;(MEMory EXtender)当前已接q实玎ͼ而图灉|提出的智能机器离实现q有一D距,目前的计机q难以通过“囄试”。ؓ了完全实Cq?位科学巨人的理想Q格雷呼吁美国政府要重视支持对IT技术的长期研究Q认为其重要意义不亚?00q前杰弗?Thomas JeffersonQ?743—1826Q?#8220;独立宣言”的v草者,国W三LȝQ?801—1809在位)军_? 500万美元从法国政府手中买回路易斯安娜领?Louisiana TerritoryQ这是位于密西西比河和洛矶山脉之_北至加拿大,南达墨西哥湾的大块土圎ͼ面积? 070 000km2)q一被称为Louisiana Purchase的著名历史事Ӟ然后又派Z刘易斯上?Captain Meriwether Lewis)和克拉克(William Clark)为首?#8220;发现军团(Corps for Discovery)到西部探险直臛_qx岸Qؓ最lŞ成美国如今的版图奠定了基。格雯为,一个好的IT长期目标应具有以?个关键性:
1Q可理解?nbsp; 目标应能单表qƈ被h理解?/font>
2Q有挑战?nbsp; 如何辑ֈ目标不是很明昄?/font>
3Q用途广?nbsp; 不只对计机U学家有用,而是对大多数人有用?/font>
4Q可试?nbsp; 以便查项目进展ƈ知道目标是否已经辑ֈ?/font>
5Q渐q?nbsp; 中间有若q里E碑Q以查项目进展ƈ鼓舞研究人员q下厅R?/font>
在以上论Ҏ持下Q格h出的几个IT技术的长期研究目标如下Q?/font>
1Q规模可伸羃?scalability)?/font>
2Q通过囄试?/font>
3Q语韛_文本的{?Speech to Text)?/font>
4Q文本到语音的{?Text to Speech)?/font>
5Q机器视觉,能像Z栯别物体和q动?/font>
6.个h?#8220;梅米克斯”Q可记录人所看到和听到的一切,需要时快速检索出来?/font>
7Q世界的“梅米克斯”Q即建立文本、音乐、图像、艺术、电q“全集”(corpus)Q可回答有关的Q何提问,像hcM安样快而好地做索引Q做文摘?/font>
8Q虚拟现?格雷用了TelePreseneeq个词,参见?969q图灵奖获得者明斯基的介l??/font>
9Q无故障pȝ(Trouble-Free Systems)?/font>
10Q安全系l?Secure Systems)?/font>
11Q高可用pȝ(AlwaysUp)?/font>
12Q自动程序设?Automatic Programming)?/font>
格雷的图灵奖演说全文已由W者译出,摘要刊于《中国计机报?000q?月,有兴的读者可以一阅?/font>
目前Q格h人正在从事Scalabilityq一长期目标的研IӞ他是微Y“规模可~的服务器研I小l?#8221;(Scalable Servers Research Group)的高U研I员Q该目已有若干研究成果在网上公布?/font>
格雷的电子信׃ؓQ?/font>
gray @ microsoftQcom
他的因特|个ZؓQ?/font>
httpQ?/wwwQresearchQmicrosoftQcom/researchQbarcQgray
(引用?http://202.207.0.245:9001/jisuanjifazhanshi/tuling/33.htm)
---雇员?EMPLOYE)
以下是代码片D: CREATE TABLE EMPLOYE ( EMPLOYEID INTEGER NOT NULL,---员工? NAME VARCHAR(20) NOT NULL,---姓名 SALARY DOUBLE---薪水 ); INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY) VALUES (1,'张三',1000), (2,'李四',2000), (3,'王五',3000), (4,'赵六',4000), (5,'高七',5000); |
--l理?MANAGER)
以下是代码片D: CREATE TABLE MANAGER ( EMPLOYEID INTEGER NOT NULL,---l理? NAME VARCHAR(20) NOT NULL,---姓名 SALARY DOUBLE---薪水 ); INSERT INTO MANAGER (MANAGERID,NAME,SALARY) VALUES (3,'王五',5000), (4,'赵六',6000); |
---雇员?EMPLOYE)
以下是代码片D: CREATE TABLE EMPLOYE ( EMPLOYEID INTEGER NOT NULL,---员工? NAME VARCHAR(20) NOT NULL,---姓名 SALARY DOUBLE---薪水 ); INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY) VALUES (1,'张三',1000), (2,'李四',2000), (3,'王五',3000), (4,'赵六',4000), (5,'高七',5000); |
--l理?MANAGER)
以下是代码片D: CREATE TABLE MANAGER ( EMPLOYEID INTEGER NOT NULL,---l理? NAME VARCHAR(20) NOT NULL,---姓名 SALARY DOUBLE---薪水 ); INSERT INTO MANAGER (MANAGERID,NAME,SALARY) VALUES (3,'王五',5000), (4,'赵六',6000); |
--更新存在?/p>
以下是代码片D: UPDATE EMPLOYE AS EM SET SALARY=(SELECT SALARY FROM MANAGER WHERE MANAGERID=EM.EMPLOYEID) WHERE EMPLOYEID IN ( SELECT MANAGERID FROM MANAGER ); |
---插入不存在的
以下是代码片D: INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY) SELECT MANAGERID,NAME,SALARY FROM MANAGER WHERE MANAGERID NOT IN ( SELECT EMPLOYEID FROM EMPLOYE ); |
--更新存在?/p>
以下是代码片D: UPDATE EMPLOYE AS EM SET SALARY=(SELECT SALARY FROM MANAGER WHERE MANAGERID=EM.EMPLOYEID) WHERE EMPLOYEID IN ( SELECT MANAGERID FROM MANAGER ); |
---插入不存在的
以下是代码片D: INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY) SELECT MANAGERID,NAME,SALARY FROM MANAGER WHERE MANAGERID NOT IN ( SELECT EMPLOYEID FROM EMPLOYE ); |
上面的处理是可以的,但是我们q可以有更简单的ҎQ就是用Merge语句Q如下所C:
以下是代码片D:
|
以下是代码片D: MERGE INTO EMPLOYE AS EM USING MANAGER AS MA ON EM.EMPLOYEID=MA.MANAGERID WHEN MATCHED AND EM.SALARY WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY); MERGE INTO EMPLOYE AS EM USING MANAGER AS MA ON EM.EMPLOYEID=MA.MANAGERID WHEN MATCHED AND EM.SALARY WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY); |
不仔l的朋友可能没有看出上面两条语句的区别,哈哈Q请仔细Ҏ一下这两条语句。上面的语句中多了ELSE IGNORE语句Q它的意思正如它英文的意思,其它情况忽略不处理。如果你认ؓ理论上应该不存在EM.SALARY>MA.SALARY的数据,如果有,说明有问题,你想抛个异常Q怎么办?如下Q?/p>
以下是代码片D: MERGE INTO EMPLOYE AS EM USING MANAGER AS MA ON EM.EMPLOYEID=MA.MANAGERID WHEN MATCHED AND EM.SALARY WHEN MATCHED AND EM.SALARY>MA.SALARY THEN SIGNAL SQLSTATE '70001' SET MESSAGE_TEXT = 'EM.SALARY>MA.SALARY' WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY) ELSE IGNORE; MERGE INTO EMPLOYE AS EM USING MANAGER AS MA ON EM.EMPLOYEID=MA.MANAGERID WHEN MATCHED AND EM.SALARY WHEN MATCHED AND EM.SALARY>MA.SALARY THEN SIGNAL SQLSTATE '70001' SET MESSAGE_TEXT = 'EM.SALARY>MA.SALARY' WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY) ELSE IGNORE; |
对于EM.SALARY>MA.SALARY的情况,如果你不x异常Q而是删除EMPLOYE中的数据Q怎么办?如下Q?/p>
以下是代码片D: MERGE INTO EMPLOYE AS EM USING MANAGER AS MA ON EM.EMPLOYEID=MA.MANAGERID WHEN MATCHED AND EM.SALARY WHEN MATCHED AND EM.SALARY>MA.SALARY THEN DELETE WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY) ELSE IGNORE; MERGE INTO EMPLOYE AS EM USING MANAGER AS MA ON EM.EMPLOYEID=MA.MANAGERID WHEN MATCHED AND EM.SALARY WHEN MATCHED AND EM.SALARY>MA.SALARY THEN DELETE WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY) ELSE IGNORE; |
以上单介l了Merge语句的用,它的应用不只是上面介l的情况Q其实它可以应用在很多其他语句不好处理情况,q需要你d玎ͼC熟能生y
下面是相应的输出Q?br>DB2 Universal Database Version 7.2, 5622-044 (c) Copyright IBM Corp. 1991, 2001
Licensed Material - Program Property of IBM
IBM DATABASE 2 SQL Explain Tool
Processing package DB2INST1.P0203450.
******************** PACKAGE *********************
Package Name = DB2INST1.P0203450
--------Prep Date = 2002/12/17
--------Prep Time = 16:02:04
--------Bind Timestamp = 2002-12-17-16.02.04.373971
--------Isolation Level ---------= Cursor Stability
--------Blocking---------------- = Block Unambiguous Cursors
--------Query Optimization Class = 5
--------Partition Parallel ------= No
--------Intra-Partition Parallel = No
--------Function Path----------- = "SYSIBM", "SYSFUN", "DB2INST1"
Processing Section 1.
-------------------- SECTION ----------------------
......
-------------------- SECTION ----------------------
Section = 2
SQL Statement:
update STAFF set NAME = 'test'
where ID = 350
Estimated Cost = 75
Estimated Cardinality = 2
Access Table Name = DB2INST1.STAFF ID = 2,3
| #Columns = 2
| Relation Scan
| | Prefetch: Eligible
| Lock Intents
| | Table: Intent Exclusive
| | Row : Update
| Sargable Predicate(s)
| | #Predicates = 1
Update: Table Name = DB2INST1.STAFF ID = 2,3
End of section
Optimizer Plan:
------UPDATE
------( -2)
------/-- \
-TBSCAN --Table:
--( 3) --DB2INST1
---| -----STAFF
Table:
DB2INST1
STAFF
......
可以用下面命令找出数据库中存在的E序包:
db2 "select pkgschema, pkgname from syscat.packages"
上面例子中的E序包DB2INST1.P0203450是一个存储过E?/font>
-------------------
讄当前模式Q?/pre>set current path = oais(模式?查看当前的模式:db2 values(current path)讄为默认的、缺省的Q?/pre>set current path = system path----------------------------------------详细的列表信息请查看Q?see IBM publib site for Database tuning overview.
]]>
db2 "select * from Linux_CPU" L提示表未定义.后来发现表名大小写问?应该在db2提示W下q行 select * from "Linux_CPU"或者db2 "select * from \"Linux_CPU\""才正?.晚上?a onclick="javascript:tagshow(event, 'IBM');" href="javascript:;" target=_self>IBM|站上查到详l说?
Document #:1807545I27000 |
游标改用普通游标?br>游标取出当前记录后,fork子进E?br>主进E只从游标取数?br>子进E进行事务、处理、判断、修改状态、提交等{?br>主进E等子进E的l束信号Q然后取下一条记录?br>E序D: declare test_cur cursor with hold for select .... from A where ... order by ... with ur; open test_cur; while( 1 ){ fecth test_cur into ......; 判断SQLCODE pid = fork(); if( pid == 0 ) { /* 子进E干z?*/ sqledtin( &sqlca ); setsid(); signal( SIGHUP, SIG_IGN ); db_disconn( G_mdb_name ); begin_work(); /* 其实是讄了一个标?*/ SQL 操作Q修改其他表或者游标所在表的数据?br> Ҏl果判断 commit or rollback?nbsp; db_disconn(); exit(); } /* 主进E等待子q程l束 */ } close test_cur; |
专用排序和共享排序用两个不同内存资源中的内存?strong>׃n排序内存区的大小是根?sheapthres 的?/strong>Q?strong>在第一ơ与数据库连接时静态地预先定的?/strong>专用排序内存区的大小不受限制?
sheapthres 参数对于专用和共享的排序用法是不同的Q?
使用排序堆的操作的示例包括:排序、散列连接、动态位图(用于索引 AND q算和星型连接)和表位于内存中的操作?
昑ּ定义阈值可防止数据库管理器对大量排序用过量内存?
当从非分区数据库U至分区数据库环境时Q不应增大此参数的倹{一旦在单个数据库分区环境中调整了数据库和数据库理器配|参敎ͼ在大多数情况下,相同的值在分区数据库环境将同样合适?
作ؓ数据库管理器配置参数?#8220;排序堆阈?#8221;参数应用于整?DB2 实例。将该参数设|ؓ不同节点或分Z的不同值的唯一Ҏ是创建多?DB2 实例。这需要通过不同数据库分区组理不同?DB2 数据库。这样安排将无法发挥分区数据库环境的许多优点?
Q?理想情况下,应将此参数设|ؓ您在数据库管理器实例中拥有的最?sortheap 参数的一个合理倍数。此参数 臛_ 应是该实例中ZQ何数据库定义的最?sortheap 的两倍?/strong>
如果您正执行专用排序q且您的pȝ不受内存U束Q则可用下列步骤来计算此参数的理想|
Q对该数据库q行的ƈ发代理程序的典型数目Q? * QsortheapQؓ该数据库定义的)
应用基准程序技术来调整此参C扑ֈ在排序性能和内存用之间的相应q?
可以使用数据库系l监视器q借助后阈值排序( post_threshold_sorts Q监视元素来跟踪排序zd?br>
此参数定义要用于专用排序的专用内存页的最大数目或要用于共享排序的׃n内存늚最大数目。如果排序ؓ专用排序Q则此参数将影响代理E序专用内存。如果排序ؓ׃n排序Q则此参数将影响数据库共享内存。每个排序都有一个独立的排序堆,该排序堆是由数据库管理器按照需要分配的。此排序堆是数据排序的区域。如果由优化器定向,则将使用优化器提供的信息分配一个比此参数指定的排序堆小的排序堆?
Q?当用排序堆Ӟ应该考虑下列事项Q?
Which of the following settings would allow 20 sorts with a maximum of 10MB each to run currently on a 64-bit instance?
A. Set the DB SHEAPTHERS to 50000 and DB SORTHEAP to 2500
B. Set the DBM SHEAPTHERES to 50000 and DB SORTHEAP to 2500
C. Set the DBM SHEAPTHERS to 50000 and DBM SORTHEAP to 2500
D. Set the DBM SHEAPTHERS_SHR to 50000 and DBM SHEAPTHRES to 2500
如果你用图形界面的配置向导Q你需要回{一pd问题Q这些问题相当于AUTOCONFIGURE命o中的参数(如表1所C?。首先让我们看一AUTOCONFIGURE的命令格?
>>-AUTOCONFIGURE--+---------------------------------------+----->
| .----------------------------. |
| V | |
'-USING----input-keyword--param-value-+-'
>--APPLY--+-DB ONLY----+---------------------------------------><
+-DB AND DBM-+
'-NONE-------'
?1昄了选项关键字和取D围?/p>
?1 关键字和取D?/p>
关键?/p>
取D?nbsp; 默认?解释
mem_percent 1-100 80 讑֮DB2使用内存的多。如果还有其他应用程序用,请选择于100的数?/p>
workload_type simple, mixed,
complex mixed 指定工作负荷cdQsimpleQ简单)cd主要指IO讉K比较集中Q对于大多数OLTPpȝQ选择simplecd。Complexcd主要是对CPU占用较多的复杂查询系l,如OLAPpȝ。如果你的系l介于两者之_选择mixedcd?
num_stmts
1-1 000 000 10 pȝ中每一个事务包含的SQL语句?
tpm 1-200 000 60 每分钟进行的交易数?/p>
admin_priority
performance, recovery, both both 选择你的理{略Q可以是更好的性能Q或者是更快的数据库恢复旉?
is_populated
yes, no yes 数据库已l存在数?
num_local_apps
0-5 000 0 本地q接?
num_remote_apps 0-5 000 10
q程q接?
isolation RR, RS, CS, UR RR
应用E序的隔ȝ?
bp_resizeable
yes, no yes ~冲池是否可调整大小
APPLY DB ONLY
在当前数据库理器的配置参数下,昄推荐的数据库和缓冲池的参敎ͼq应用与数据库和~冲池?/p>
APPLY DB AND DBM
昄q应用推荐的数据库管理器参数、数据库参数和缓冲池参数?/p>
APPLY NONE
仅仅昄推荐|但不更改配置参数?/p>
使用该命令配|数据库Q关键要选择合适的参数(参见?选择你的参数选项)。下面我们通过一个例子来说明如何使用AUTOCONFIGURE命o配置数据库。假设我们在一个分区的数据库环境中Q只有一个数据库实例db2inst1和数据仓库TESTDWQƈ且已l装载了数据?我们使用下面的命令对该数据库调整参数:
db2_all “db2 connect to testdw; db2 autoconfigure using mem_percent 80 workload_type complex num_stmts 10 tpm 20 admin_priority both num_local_apps 5 num_remote_apps 50 isolation cs apply db and dbm; db2 connect reset;”
你也可以创徏一个脚本autoconfigure.db2Q存攑֜DB2 实例的共享目录下Q假设ؓ/home/db2inst1, 内容如下:
connect to testdw;
autoconfigure using mem_percent 80 workload_type complex num_stmts 10 tpm 20 admin_priority both num_local_apps 5 num_remote_apps 50 isolation cs apply db and dbm;
connect reset;
然后使用db2_all命o在所有的数据库分Z执行q条命oQ我们假设改脚本的存攄录ؓ/home/db2inst1/autoconfigure.db2:
db2_all “”db2 -tvf /home/db2inst1/autoconfigure.db2 >>autoconfigure##.log”
执行完毕后,你可以通过autoconfigure*.log来察看该命o在每一个数据库分区上的执行情况。然后重新启动DB2实例Q让q些参数生效。运行一些基准测试的查询语句Q测试DB2 配置向导的配|结果?/p>
你也可以使用配置向导囑Ş界面来配|你的数据库。你可以通过在控制中心中选中你的数据库,然后点右键,选择“配置向导”来启动配|向对{如果你需要用图形界面配|分区数据库Q记得要结果保存ؓdQƈ配|结果导出到一个脚本文件中Q如/home/db2inst1/autoconfigure.db2。这样你可以用db2_all命o来执行该脚本配置所有的数据库分Z:
db2_all “”db2 -tvf /home/db2inst1/autoconfigure.db2 >>autoconfigure##.log”
如果你对DB2非常熟悉Q你可以对DB2自动配置产生的配|文件做适当的修攏VMQDB2配置向导是一个非常简单易用的工具Q能够大大减DBA的工作量?/p>
原文来自Q雨枫技术教E网 http://www.fengfly.com
原文|址Q?a >http://www.fengfly.com/plus/view-30426-1.html
db2batch 是一U基准测试工P它以一l?SQL ??XQuery 语句作ؓ输入Q动态地准备语句和描q语句,q返回一个结果集。取决于 db2batch 命o中所使用的选项Q结果集可以q回q些语句的执行时间、关于内存用情?例如~冲?的数据库理器快照和~存信息?/p>
可以在一?flat 文g或标准输入中指定要运行基准测试的语句。在输入文g中可以设|很多控刉项。指定这些选项的语法是Q?-#SET control_option value 。下面是包含控制选项的一个输入文件的例子。要获得控制选项的完整列表,请参?Information Center?/p>
-- db2batch.sql -- ------------ --#SET PERF_DETAIL 3 --#SET ROWS_OUT 5 -- This query lists employees, the name of their department -- and the number of activities to which they are assigned for -- employees who are assigned to more than one activity less than -- full-time. --#COMMENT Query 1 select lastname, firstnme, deptname, count(*) as num_act from employee, department, emp_act where employee.workdept = department.deptno and employee.empno = emp_act.empno and emp_act.emptime < 1 group by lastname, firstnme, deptname having count(*) > 2; --#SET PERF_DETAIL 1 --#SET ROWS_OUT 5 --#COMMENT Query 2 select lastname, firstnme, deptname, count(*) as num_act from employee, department, emp_act where employee.workdept = department.deptno and employee.empno = emp_act.empno and emp_act.emptime < 1 group by lastname, firstnme, deptname having count(*) <= 2; |
下面的命令在 SAMPLE 数据库上调用基准试工具Q输入文件ؓ db2batch.sql?/p>
db2batch -d sample -f db2batch.sql
q个命o返回查询的l果??5 ?和查询所p的时间及 CPU 旉。另外还q回数据库管理器、数据库和应用程序快照。由于输出很大,因此q里只显C?db2batch 命o的概要?/p>
* Summary Table: Type Number Repetitions Total Time (s) Min Time (s) ... --------- ----------- ----------- -------------- -------------- Statement 1 1 0.052655 0.052655 ... Statement 2 1 0.004518 0.004518 ... ...Max Time (s) Arithmetic Mean Geometric Mean Row(s) Fetched Row(s) Output -------------- --------------- -------------- -------------- ------------- ... 0.052655 0.052655 0.052655 5 5 ... 0.004518 0.004518 0.004518 8 5 * Total Entries: 2 * Total Time: 0.057173 seconds * Minimum Time: 0.004518 seconds * Maximum Time: 0.052655 seconds * Arithmetic Mean Time: 0.028587 seconds * Geometric Mean Time: 0.015424 seconds |
db2batch 命o支持很多选项。这里只列出其中一些选项Q让您对q个工具的威力有所了解?/p>
CREATE TABLE EMPDATA
(
EMPNO INT NOT NULL,
SEX CHAR(1) NOT NULL
CONSTRAINT SEXOK
CHECK (SEX IN ('M','F'))
NOT ENFORCED
ENABLE QUERY OPTIMIZATION,
SALARY INT NOT NULL,
CONSTRAINT SALARYOK
CHECK (SALARY BETWEEN 0 AND 100000)
NOT ENFORCED
ENABLE QUERY OPTIMIZATION
)
本例包含两个更改列约束行为的语句。第一个选项?NOT ENFORCEDQ它 DB2 在插入或更新数据时不强制查本列。第二个选项?ENABLE QUERY OPTIMIZATIONQDB2 在对该表q行 SELECT 语句时用它。指定该值时QDB2 在优化 SQL 时用约束中的信息?/p>
NOT ENFORCED 选项
若表包含 NOT ENFORCED 选项QINSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以?SQL 语句Ӟ不会产生M错误Q?/p>
INSERT INTO EMPDATA VALUES
(1, 'M', 54200),
(2, 'F', 28000),
(3, 'M', 21240),
(4, 'F', 89222),
(5, 'Q', 34444),
(6, 'K',132333)
~号?5 的员工的性别昄有问题(QQ,~号 6 的员工不但性别有问题,同时工资也超Z SALARY 列的限制。在q两U情况下QDB2 依然允许插入Q因为约束是 NOT ENFORCED。这指出了信息约束的一个薄׃处。您必须定所插入或蝲入的数据W合?DB2 中放|的定义?/p>
ENABLE QUERY OPTIMIZATION 选项
在上一屏运行的插入之后Q如果再?EMPDATA 表执?SELECT 语句Q其l果很可能会令您更加qhQ?/p>
SELECT * FROM EMPDATA
WHERE SEX = 'Q';
EMPNO SEX SALARY
----------- --- -----------
0 record(s) selected.
DB2 向查询返回了错误的答案。表中发C “Q” |但该列上的约束告?DB2 有效g包括 “M” ?“F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优?SQL 语句时用这一U束信息。若qƈ非您所希望的行为,那么您就需要?ALTER 命o来更改约束:
ALTER TABLE EMPDATA
ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION
现在Q再重新执行之前的查询。结果如下所C:
SELECT * FROM EMPDATA
WHERE SEX = 'Q';
EMPNO SEX SALARY
----------- --- -----------
5 Q 34444
1 record(s) selected.