﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava--随笔分类-数据库</title><link>http://www.blogjava.net/tacy/category/25671.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 26 Dec 2007 02:07:12 GMT</lastBuildDate><pubDate>Wed, 26 Dec 2007 02:07:12 GMT</pubDate><ttl>60</ttl><item><title>关于oracle中的timestamp和date类型</title><link>http://www.blogjava.net/tacy/archive/2007/12/26/170428.html</link><dc:creator>tacy lee</dc:creator><author>tacy lee</author><pubDate>Tue, 25 Dec 2007 16:42:00 GMT</pubDate><guid>http://www.blogjava.net/tacy/archive/2007/12/26/170428.html</guid><wfw:comment>http://www.blogjava.net/tacy/comments/170428.html</wfw:comment><comments>http://www.blogjava.net/tacy/archive/2007/12/26/170428.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tacy/comments/commentRss/170428.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tacy/services/trackbacks/170428.html</trackback:ping><description><![CDATA[之前一直认为类似：where timestamp&gt;date 这种子句是不走索引的<br />
<br />
下面简单做一个验证：<br />
<br />
c:&gt;sqlplus / as sysdba<br />
sys@EOS &gt;create table test as select table_name,to_timestamp(last_analyzed) date_test from dba_tables;<br />
<br />
表已创建。<br />
<br />
sys@EOS&gt; create index idx_test_date on test (date_test);<br />
<br />
索引已创建。<br />
<br />
sys@EOS&gt; desc test<br />
&nbsp;名称&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否为空? 类型<br />
&nbsp;----------------------------------------------------- -------- ----------------<br />
--------------------<br />
&nbsp;TABLE_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOT NULL VARCHAR2(30)<br />
&nbsp;DATE_TEST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TIMESTAMP(0)<br />
<br />
sys@EOS&gt; select date_test from test where date_test &gt; TO_DATE('2007-11-5 00:00:00','yyyy-MM-dd HH24:mi:ss');<br />
<br />
执行计划<br />
----------------------------------------------------------<br />
Plan hash value: 944171586<br />
<br />
-------------------------------------------------------------------------------- --<br />
| Id&nbsp; | Operation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Rows&nbsp; | Bytes | Cost (%CPU)| Time |<br />
-------------------------------------------------------------------------------- --<br />
|&nbsp;&nbsp; 0 | SELECT STATEMENT |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; 1 |&nbsp;&nbsp;&nbsp; 22 |&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp; (0)| 00:00:01 |<br />
|*&nbsp; 1 |&nbsp; INDEX RANGE SCAN| IDX_TEST_DATE |&nbsp;&nbsp;&nbsp;&nbsp; 1 |&nbsp;&nbsp;&nbsp; 22 |&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp; (0)| 00:00:01 |<br />
-------------------------------------------------------------------------------- --<br />
<br />
Predicate Information (identified by operation id):<br />
---------------------------------------------------<br />
<br />
&nbsp;&nbsp; 1 - access("DATE_TEST"&gt;TIMESTAMP'2007-11-05 00:00:00')<br />
<br />
Note<br />
-----<br />
&nbsp;&nbsp; - dynamic sampling used for this statement<br />
<br />
<br />
统计信息<br />
----------------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7&nbsp; recursive calls<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; db block gets<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18&nbsp; consistent gets<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; physical reads<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; redo size<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 280&nbsp; bytes sent via SQL*Net to client<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 374&nbsp; bytes received via SQL*Net from client<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; SQL*Net roundtrips to/from client<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; sorts (memory)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; sorts (disk)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; rows processed<br />
<br />
从上面可以清楚看到，timestamp&gt;date情况下，走索引<br />
<br />
纠正我之前的认识。<br />
<br />
另外再补充一下，date这个数据类型一般情况下很少用，建议产品里面所有的date数据类型全部改为timestamp<br />
<br />
<img src ="http://www.blogjava.net/tacy/aggbug/170428.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tacy/" target="_blank">tacy lee</a> 2007-12-26 00:42 <a href="http://www.blogjava.net/tacy/archive/2007/12/26/170428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>db2诊断系列之---捕获sql执行情况</title><link>http://www.blogjava.net/tacy/archive/2007/11/25/162969.html</link><dc:creator>tacy lee</dc:creator><author>tacy lee</author><pubDate>Sun, 25 Nov 2007 06:51:00 GMT</pubDate><guid>http://www.blogjava.net/tacy/archive/2007/11/25/162969.html</guid><wfw:comment>http://www.blogjava.net/tacy/comments/162969.html</wfw:comment><comments>http://www.blogjava.net/tacy/archive/2007/11/25/162969.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tacy/comments/commentRss/162969.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tacy/services/trackbacks/162969.html</trackback:ping><description><![CDATA[<p>作者：tacy lee</p> <p>在应用使用过程中，我们经常会碰到应用响应时间很慢，甚至没有响应，但是应用服务器可能并不是很繁忙，cpu利用率也非常低，引起这种状况的原因有很多种，比如环境问题，应用资源泄漏，数据库原因等等，本文主要是从一次应用性能诊断过程来谈谈如何通过数据库诊断应用性能问题。</p> <p>问题：</p> <p>测试过程中发现应用中某个跳转页面执行时间比较长，系统压力不大，cpu利用很低，该页面需要从cache中取数据，第一次的时候加载cache（从数据库中查询回数据并cache）。</p> <p>诊断：</p> <p>页面逻辑比较简单，我们先用loadrunner模拟并发测试一下这个页面，然后再数据库端捕获sql执行情况。</p> <p>1、打开db2监控开关</p> <div><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">#db2 connect to eos<br>
#db2 update monitor switches <span style="color: #0000ff">using</span> statement on<br>
#db2 reset monitor all</pre></div>
<p>2、几分钟之后，我们收集sql统计快照</p>
<div><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">#db2 get snapshot <span style="color: #0000ff">for</span> dynamic sql on eos &gt; dysqlstatus.out</pre></div>
<p>现在统计信息已经存放在dysqlstatus.out中，你可以使用任意方便的文本处理工具查看，我一般用windows上的gvim来处理，打开dysqlstatus.out</p>
<div><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><p>Number of executions               = 1<br></p><p>
Number of compilations             = 1<br>
Worst preparation time (ms)        = 2<br>
Best preparation time (ms)         = 2<br>
Internal rows deleted              = 0<br>
Internal rows inserted             = 0<br>
Rows read                          = 2<br>
Internal rows updated              = 0<br>
Rows written                       = 0<br>
Statement sorts                    = 0<br>
Statement sort overflows           = 0<br>
Total sort time                    = 0<br>
Buffer pool data logical reads     = Not Collected<br>
Buffer pool data physical reads    = Not Collected<br>
Buffer pool temporary data logical reads   = Not Collected<br>
Buffer pool temporary data physical reads  = Not Collected<br>
Buffer pool index logical reads    = Not Collected<br>
Buffer pool index physical reads   = Not Collected<br>
Buffer pool temporary index logical reads  = Not Collected<br>
Buffer pool temporary index physical reads = Not Collected<br>
Total execution time (sec.ms)      = 0.000377<br>
Total user cpu time (sec.ms)       = 0.010000<br>
Total system cpu time (sec.ms)     = 0.000000<br>
Statement text                     = select ACTIVITYDEFID,ACTIVITYINSTID from wfworkitem  <span style="color: #0000ff">where</span> </p><p>PROCESSINSTID=104199 and CURRENTSTATE = 4<br><br>
......
</p></pre></div>
<p>简单说一下vi中的处理</p>
<div><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">:g!/Total execution time/d<br>
只保留文本中的sql执行时间，我们要按照执行时间来排序<br>
<br>
通过vim的visual功能选择执行时间块（等号后面的数字），然后排序<br>
Total execution time (sec.ms)      = 0.050590<br>
Total execution time (sec.ms)      = 0.000170<br>
Total execution time (sec.ms)      = 0.000247<br>
Total execution time (sec.ms)      = 0.000292<br>
Total execution time (sec.ms)      = 0.000474<br>
Total execution time (sec.ms)      = 0.000330<br>
Total execution time (sec.ms)      = 0.000348<br>
Total execution time (sec.ms)      = 0.000279<br>
Total execution time (sec.ms)      = 0.000385<br>
Total execution time (sec.ms)      = 0.000296<br>
Total execution time (sec.ms)      = 0.000261<br>
Total execution time (sec.ms)      = 0.000195<br>
Total execution time (sec.ms)      = 0.000226<br>
Total execution time (sec.ms)      = 0.000227<br>
Total execution time (sec.ms)      = 0.000193<br>
......<br>
:<span style="color: #006080">'&lt;,'</span>&gt;!sort<br>
<br>
排序后的结果（部分）<br>
Total execution time (sec.ms)      = 2.027776<br>
Total execution time (sec.ms)      = 2.203624<br>
Total execution time (sec.ms)      = 2.504677<br>
Total execution time (sec.ms)      = 2.951256<br>
Total execution time (sec.ms)      = 3.119875<br>
Total execution time (sec.ms)      = 3.303277<br>
Total execution time (sec.ms)      = 3.303517<br>
Total execution time (sec.ms)      = 4.017133<br>
Total execution time (sec.ms)      = 4.043329<br>
Total execution time (sec.ms)      = 4.252125<br>
Total execution time (sec.ms)      = 4.400952<br>
Total execution time (sec.ms)      = 4.606765<br>
Total execution time (sec.ms)      = 5.208087<br>
Total execution time (sec.ms)      = 5.778598<br>
Total execution time (sec.ms)      = 8.117470<br>
Total execution time (sec.ms)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 9797.905136</pre></div>
<p>可以看到最长时间的sql total执行时间耗费了3797.905123s.</p>
<p>现在我们到dysqlstatus.out中去找这条语句</p>
<div><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">Number of executions               = 4602<br>
Number of compilations             = 4294967295<br>
Worst preparation time (ms)        = 2<br>
Best preparation time (ms)         = 2<br>
Internal rows deleted              = 0<br>
Internal rows inserted             = 0<br>
Rows read                          = 2963688<br>
Internal rows updated              = 0<br>
Rows written                       = 0<br>
Statement sorts                    = 0<br>
Statement sort overflows           = 0<br>
Total sort time                    = 0<br>
Buffer pool data logical reads     = Not Collected<br>
Buffer pool data physical reads    = Not Collected<br>
Buffer pool temporary data logical reads   = Not Collected<br>
Buffer pool temporary data physical reads  = Not Collected<br>
Buffer pool index logical reads    = Not Collected<br>
Buffer pool index physical reads   = Not Collected<br>
Buffer pool temporary index logical reads  = Not Collected<br>
Buffer pool temporary index physical reads = Not Collected<br>
Total execution time (sec.ms)      = 9797.905136<br>
Total user cpu time (sec.ms)       = 9.290000<br>
Total system cpu time (sec.ms)     = 1.230000<br>
Statement text                     = select * from XXXX_T_CNFACTIVITYDEF</pre></div>
<p>这条语句总共执行了4602次，平均每次的执行时间2S，而且这些数据应该是被cache起来的&nbsp;&nbsp; ；）</p>
<p>总结：</p>
<p>上面的方法简单总结了从数据库层面对应用的性能问题诊断，希望对大家有所帮助，对于数据库快照诊断问题的思路对于任意数据库通用</p>
<p>&nbsp;</p>
<p><strong>补充一个unix上脚本处理方式：</strong></p>
<p>sqlsort.sh</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; max-height: 200px"><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">awk <span style="color: #006080">'BEGIN{RS="";FS="\n";ORS="\n"};/Statement text/{print $1, $21, $24}'</span> $1 | awk <span style="color: #006080">'$5 &gt; 0 {print "AvgTime:", $11/$5, "\t", $0}'</span>| sort -n | head -n $2|awk <span style="color: #006080">'{print $0, "\n"}'</span></pre></div>
<div>&nbsp;</div>
<div>使用：#sqlsort.sh dysqlstate.out 10（显示Top ten）</div>
<div>&nbsp;</div>
<div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:fc00a151-bc6e-4fad-bf20-41f9edbf283c" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">del.icio.us Tags: <a href="http://del.icio.us/popular/db2" rel="tag">db2</a>,<a href="http://del.icio.us/popular/java" rel="tag">java</a>,<a href="http://del.icio.us/popular/tuning" rel="tag">tuning</a>,<a href="http://del.icio.us/popular/diagnostic" rel="tag">diagnostic</a></div><img src ="http://www.blogjava.net/tacy/aggbug/162969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tacy/" target="_blank">tacy lee</a> 2007-11-25 14:51 <a href="http://www.blogjava.net/tacy/archive/2007/11/25/162969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>db2诊断系列之---定位锁等待问题</title><link>http://www.blogjava.net/tacy/archive/2007/11/24/162892.html</link><dc:creator>tacy lee</dc:creator><author>tacy lee</author><pubDate>Sat, 24 Nov 2007 13:18:00 GMT</pubDate><guid>http://www.blogjava.net/tacy/archive/2007/11/24/162892.html</guid><wfw:comment>http://www.blogjava.net/tacy/comments/162892.html</wfw:comment><comments>http://www.blogjava.net/tacy/archive/2007/11/24/162892.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tacy/comments/commentRss/162892.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tacy/services/trackbacks/162892.html</trackback:ping><description><![CDATA[<p>作者：tacy lee</p> <p>在应用中，我们经常会碰到sql执行很慢，但是数据库cpu和内存使用率又不高的情况，类似的问题基本上由于锁，排序等原因造成，本文主要描述如何去定位锁等待问题，谁在锁等待？等待谁持有的锁？锁在那个表？</p> <p>一、测试准备</p> <p>1、先在session1执行如下操作，创建测试表</p> <div><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">#db2 connect to eos
#export DB2OPTIONS=+C
#db2 <span style="color: #006080">"create table tacy_test (a int not null primary key,b varchar(10))"</span>
#db2 <span style="color: #006080">"insert into tacy_test values(1,'a')"</span>
#db2 <span style="color: #006080">"insert into tacy_test values(2,'a')"</span>
#db2 <span style="color: #006080">"insert into tacy_test values(3,'a')"</span>
#db2 <span style="color: #006080">"insert into tacy_test values(4,'a')"</span>
#db2 commit</pre></div>
<p>2、在session2执行如下操作</p>
<div><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">#db2 connect to eos
#export DB2OPTIONS=+C</pre></div>
<p>二、产生一个lock wait</p>
<p>在session1做一个表更新：</p>
<div><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">#db2 <span style="color: #006080">"update tacy_test set b='b' where a=4"</span></pre></div>
<div>sql执行成功</div>
<div>在session2做同样更新操作：</div>
<div><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">#db2 <span style="color: #006080">"update tacy_test set b='c' where a=4"</span></pre></div>
<p>进程被挂起等待</p>
<p>三、定位锁等待</p>
<p>1、先来看看应用的情况：</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; max-height: 200px"><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">#db2pd -db eos -applications

Database Partition 0 -- Database EOS -- Active -- Up 0 days 07:37:37

Applications:
Address    AppHandl [nod-index] NumAgents  CoorPid    Status                  C-AnchID C-StmtUID  L-AnchID L-StmtUID  Appid                           
0x10140040 8        [000-00008] 1          8425       Lock-wait               80       2          66       1          *LOCAL.db2inst1.071124043739    
0x100CE540 7        [000-00007] 1          8358       UOW-Waiting             0        0          80       2          *LOCAL.db2inst1.071124043708    </pre></div>
<p>可以看到有一个应用的状态处于Lock-wait</p>
<p>2、现在我们来看看应用在等什么</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; max-height: 200px"><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">#db2pd -db eos -locks showlock wait

Database Partition 0 -- Database EOS -- Active -- Up 0 days 07:42:56

Locks:
Address    TranHdl    Lockname                   Type       Mode Sts Owner      Dur HldCnt     Att Rlse
0x2C8E0760 3          02001806078066020000000052 Row        ..X  W   2          1   0          0   0x0  TbspaceID 2 TableID 1560 RecordID 0x2668007</pre></div>
<p>锁的类型为Row（行锁），X锁（排他锁），下面是我们最关心的锁的位置</p>
<p>TbspaceID 2 TableID 1560 RecordID 0x2668007</p>其中TbspaceID为表空间ID，TableID为表的ID，RecordID代表具体位置，全部应该是0x0266807,其中前面三个字节为page number，为0x02668，后面一个字节代表solt identifier，为0x07
<p>3、找到相应的表</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; max-height: 200px"><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">#db2 <span style="color: #006080">"select tbspace,tabschema,tabname,tableid,tbspaceid from syscat.tables where tbspaceid=2 and tableid=1560"</span>

TBSPACE       TABSCHEMA   TABNAME    TABLEID TBSPACEID
------------  ----------- ---------- ------- ---------
USERSPACE1    DB2INST1    TACY_TEST     1560         2

  1 record(s) selected.
</pre></div>
<p>4、根据RecordID找到锁在哪行</p>
<p>db2提供了一个强大的数据分析工具db2dart，可以dump出相应的page数据</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; max-height: 200px"><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">#db2dart eos /dd /tsi 2 /oi 1560 /ps 157312p /np 1 /v y

Warning: The database state <span style="color: #0000ff">is</span> not consistent.

Warning: Reorg rows MAY be due to the inconsistent state of the database.
                  DB2DART Processing completed with warning(s)!
                        Complete DB2DART report found <span style="color: #0000ff">in</span>:
/home/db2inst1/sqllib/db2dump/DART0000/EOS.RPT</pre></div>
<p>其中tsi为表空间id(2)，oi为表id(1560)，ps为page number(0x0266807)，需要转换为十进制，在结尾必须加p，np代表你要获取的页数，v为是否详细输出</p>
<p>现在我们来看看EOS.RPT</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; max-height: 200px"><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">______________________________________________________________________________

        _______                    DART                   _______ 

   D a t a b a s e   A n a l y s i s   a n d   R e p o r t i n g   T o o l

                           IBM    DB2    6000
______________________________________________________________________________

DART (V8.1.0)  Report:
2007-11-24-20.59.51.355893

            Database Name: EOS
            Report name: EOS.RPT
            Old report back-up: EOS.BAK
            Database Subdirectory: /opt/db2/db2inst1/NODE0000/SQL00001
            Operational Mode: Database Inspection Only (INSPECT)

______________________________________________________________________________
------------------------------------------------------------------------------


Action option: DD 
Table-<span style="color: #0000ff">object</span>-ID: 1560; Tablespace-ID: 2; First-page: 157312p; Number-pages: 1; Verbose: y

Warning: The database state <span style="color: #0000ff">is</span> not consistent.

Warning: Reorg rows MAY be due to the inconsistent state of the database.
Connecting to Buffer Pool Services...

   Table <span style="color: #0000ff">object</span> report phase start.
   Dump format <span style="color: #0000ff">is</span> verbose.

                           ______________________________________

         Page 0 of <span style="color: #0000ff">object</span> 1560 from table space 2.

         BPS Page Header:

                     Page Data Offset = 48
                     Page Data Length = 4048
                             Page LSN = 0000 AE97 AE41
                   Object Page Number = 0
                     Pool Page Number = 157312
                            Object ID = 1560
                          Object Type = Data Object

               Data Page Header:

                           Slot Count = 8
                     Total Free Space = 2784
                  Total Reserve Space = 0
               Youngest Reserve Space = n/a
                         Youngest TID = n/a
                    Free Space Offset = 2799
                  Maximum Record Size = 23

               Data Records:


            Slot 0:

               Offset Location = 3996  (xF9C)
               Record Length = 32  (x20)

               Record Type = Data Object Header Control Record

                  Page count = 1
         Object Creation LSN = 0000 AE97 800C
                Object State = x0000
          UDI Since Runstats = 0
                  DART Field = x00000000

            Slot 1:

               Offset Location = 2992  (xBB0)
               Record Length = 1004  (x3EC)

               Record Type = Free Space Control Record

               Free space entries:
                 0:  2884 (x0B44),  4028 (x0FBC),  4028 (x0FBC),  4028 (x0FBC)
                 4:  4028 (x0FBC),  4028 (x0FBC),  4028 (x0FBC),  4028 (x0FBC)
                 8:  4028 (x0FBC),  4028 (x0FBC),  4028 (x0FBC),  4028 (x0FBC)
               省略。。。
                  492:  4028 (x0FBC),  4028 (x0FBC),  4028 (x0FBC),  4028 (x0FBC)
                  496:  4028 (x0FBC),  4028 (x0FBC),  4028 (x0FBC),  4028 (x0FBC)

            Slot 2:

               Offset Location = 2916  (xB64)
               Record Length = 76  (x4C)

               Record Type = Table Directory Record

                  MetaIndex Root Page = 157377
                  Index Type = 2
                  Table Descriptor Pointer  --  Page 157312  Slot 3
                  Max Insert Search = 0
                  Flags = x02000200
                     bit representation = 00000010 00000000 00000010 00000000
                  Check pending info:
                     Constraint status    = x00
                     Constraint RID       = Page 0 Slot 0
                     last BID          = x00000000

            Slot 3:

               Offset Location = 2892  (xB4C)
               Record Length = 24  (x18)

               Record Type = Table Description Record

                  Number of Columns = 2


                  Column 1:
                  Type <span style="color: #0000ff">is</span> Long Integer
                  Length = 4
                  Prohibits NULLs
                  Prohibits Default
            Fixed offset: 0

                  Column 2:
                  Type <span style="color: #0000ff">is</span> Fixed Length Character String
                  Length = 10
                  Allows NULLs
                  Prohibits Default
            Fixed offset: 4

            Slot 4:

               Offset Location = 2869  (xB35)
               Record Length = 23  (x17)

               Record Type = Table Data Record (FIXEDVAR)

               Fixed part length <span style="color: #0000ff">value</span> = 15

                  Column 1:
            Fixed offset: 0
                  Type <span style="color: #0000ff">is</span> Long Integer
                  Value = 1

                  Column 2:
            Fixed offset: 4
                  Type <span style="color: #0000ff">is</span> Fixed Length Character String
                      61202020 20202020 2020                 a               


            Slot 5:

               Offset Location = 2846  (xB1E)
               Record Length = 23  (x17)

               Record Type = Table Data Record (FIXEDVAR)

               Fixed part length <span style="color: #0000ff">value</span> = 15

                  Column 1:
            Fixed offset: 0
                  Type <span style="color: #0000ff">is</span> Long Integer
                  Value = 2

                  Column 2:
            Fixed offset: 4
                  Type <span style="color: #0000ff">is</span> Fixed Length Character String
                      61202020 20202020 2020                 a               


            Slot 6:

               Offset Location = 2823  (xB07)
               Record Length = 23  (x17)

               Record Type = Table Data Record (FIXEDVAR)

               Fixed part length <span style="color: #0000ff">value</span> = 15

                  Column 1:
            Fixed offset: 0
                  Type <span style="color: #0000ff">is</span> Long Integer
                  Value = 3

                  Column 2:
            Fixed offset: 4
                  Type <span style="color: #0000ff">is</span> Fixed Length Character String
                      61202020 20202020 2020                 a               


            Slot 7:

               Offset Location = 2800  (xAF0)
               Record Length = 23  (x17)

               Record Type = Table Data Record (FIXEDVAR)

               Fixed part length <span style="color: #0000ff">value</span> = 15

                  Column 1:
            Fixed offset: 0
                  Type <span style="color: #0000ff">is</span> Long Integer
                  Value = 4

                  Column 2:
            Fixed offset: 4
                  Type <span style="color: #0000ff">is</span> Fixed Length Character String
                      61202020 20202020 2020                 a               


         Slots Summary:  Total=8,  In-use=8,  Deleted=0.

      
   Table <span style="color: #0000ff">object</span> report phase end.
                     ______________________________________

                  DB2DART Processing completed with warning(s)!
                     Warning(s) detected during processing.
                     ______________________________________

                        Complete DB2DART report found <span style="color: #0000ff">in</span>:
/home/db2inst1/sqllib/db2dump/DART0000/EOS.RPT
    _______    D A R T    P R O C E S S I N G    C O M P L E T E    _______</pre></div>
<p>找到Solt 7 (0x07)，ok，你现在可以清楚的知道应用等待的Row为(4,a)</p>
<p>&nbsp;</p>
<p>总结</p>
<p>通过上面的方法，我们简单描述了一个db2锁问题的定位方法，希望能给大家在分析和定位应用性能问题的时候起到一定的帮助</p>
<div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d4188abc-b1ba-4bf7-8c81-f16c1fedc0c9" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">del.icio.us Tags: <a href="http://del.icio.us/popular/db2" rel="tag">db2</a>,<a href="http://del.icio.us/popular/lock" rel="tag">lock</a>,<a href="http://del.icio.us/popular/tuning" rel="tag">tuning</a>,<a href="http://del.icio.us/popular/diagnostic" rel="tag">diagnostic</a></div><img src ="http://www.blogjava.net/tacy/aggbug/162892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tacy/" target="_blank">tacy lee</a> 2007-11-24 21:18 <a href="http://www.blogjava.net/tacy/archive/2007/11/24/162892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>捕获DB2 sql的执行快照</title><link>http://www.blogjava.net/tacy/archive/2007/10/30/156907.html</link><dc:creator>tacy lee</dc:creator><author>tacy lee</author><pubDate>Tue, 30 Oct 2007 04:59:00 GMT</pubDate><guid>http://www.blogjava.net/tacy/archive/2007/10/30/156907.html</guid><wfw:comment>http://www.blogjava.net/tacy/comments/156907.html</wfw:comment><comments>http://www.blogjava.net/tacy/archive/2007/10/30/156907.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tacy/comments/commentRss/156907.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tacy/services/trackbacks/156907.html</trackback:ping><description><![CDATA[<p>先建立一个监控器  <p>db2 "create event monitor SQLCOST for statements write to file '/home/db2inst1'"  <p>再设置事务状态为打开  <p>db2 "set event monitor SQLCOST state=1"  <p><font color="#ff0000">注：1为打开，0为关闭，收集数据之后，记得关闭你的监控器，否则。。。</font>  <p>跑你的测试后，在你的/home/db2inst1目录下会生成一些evm文件  <p>用下面指令获取诊断信息：  <p>db2evmon -db eos51 -evm SQLCOST&gt;sqlcost1.txt  <p>完成之后删除你的监控器  <p>db2 "drop event monitor SQLCOST"  <p>生成的采样例子，从下面的例子中，你可以清除的看到SQL执行的时间，CPU消耗情况，排序是否溢出，BufferPool的使用情况，根据这些信息，SQL的执行效率一目了然：  <p>26) Statement Event ...  <p>Appl Handle: 336  <p>Appl Id: C0A80421.O905.0ABDA5065446  <p>Appl Seq number: 0657  <p>Record is the result of a flush: FALSE  <p>-------------------------------------------  <p>Type : Dynamic  <p>Operation: Execute  <p>Section : 7  <p>Creator : NULLID  <p>Package : SYSSN300  <p>Consistency Token : SYSLVL01  <p>Package Version ID :  <p>Cursor : SQL_CURSN300C7  <p>Cursor was blocking: FALSE  <p>Text : update WFProcessInst set relateData=? where processInstID= ?  <p>-------------------------------------------  <p><a><font color="#0080ff">Start Time: 04/25/2007 14:57:19.402248</font></a>  <p><font color="#0080ff">Stop Time: 04/25/2007 14:57:19.409622</font>  <p><font color="#0080ff">Exec Time: 0.007374 seconds</font>  <p><font color="#0080ff">Number of Agents created: 1</font>  <p><font color="#0080ff">User CPU: 0.000000 seconds</font>  <p><font color="#0080ff">System CPU: 0.000000 seconds</font>&nbsp;&nbsp;&nbsp; <a href="#_msocom_1">[licl1]</a>  <p>Fetch Count: 0  <p><a><font color="#0080ff">Sorts: 0</font></a>  <p><font color="#0080ff">Total sort time: 0</font>  <p><font color="#0080ff">Sort overflows: 0</font>&nbsp;&nbsp;&nbsp; <a href="#_msocom_2">[licl2]</a>  <p>Rows read: 1  <p>Rows written: 1  <p>Internal rows deleted: 0  <p>Internal rows updated: 0  <p>Internal rows inserted: 0  <p><a><font color="#0080ff">Bufferpool data logical reads: 9</font></a>  <p><font color="#0080ff">Bufferpool data physical reads: 0</font>  <p><font color="#0080ff">Bufferpool temporary data logical reads: 0</font>  <p><font color="#0080ff">Bufferpool temporary data physical reads: 0</font>  <p><font color="#0080ff">Bufferpool index logical reads: 3</font>  <p><font color="#0080ff">Bufferpool index physical reads: 0</font>  <p><font color="#0080ff">Bufferpool temporary index logical reads: 0</font>  <p><font color="#0080ff">Bufferpool temporary index physical reads: 0</font>&nbsp;&nbsp;&nbsp; <a href="#_msocom_3">[licl3]</a>  <p>SQLCA:  <p>sqlcode: 0  <p>sqlstate: 00000  <hr align="left" width="33%" size="1">  <p><a></a> <p><a href="#_msoanchor_1">[licl1]</a>SQL执行时间和CPU消耗情况  <p><a></a> <p><a href="#_msoanchor_2">[licl2]</a>SQL的排序情况，可以看到这个SQL没有排序，当然也没有排序溢出  <p><a></a> <p><a href="#_msoanchor_3">[licl3]</a>Bufferpool的使用情况，逻辑读和物理读的对比</p> <div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:54520e35-7c6a-476c-8521-71adb04f0c5b" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">del.icio.us Tags:  		<a href="http://del.icio.us/popular/database" rel="tag">database</a> 		,  		<a href="http://del.icio.us/popular/db2" rel="tag">db2</a> 		,  		<a href="http://del.icio.us/popular/tuning" rel="tag">tuning</a> 		</div><img src ="http://www.blogjava.net/tacy/aggbug/156907.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tacy/" target="_blank">tacy lee</a> 2007-10-30 12:59 <a href="http://www.blogjava.net/tacy/archive/2007/10/30/156907.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>认识oracle数据类型</title><link>http://www.blogjava.net/tacy/archive/2007/09/07/143485.html</link><dc:creator>tacy lee</dc:creator><author>tacy lee</author><pubDate>Fri, 07 Sep 2007 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/tacy/archive/2007/09/07/143485.html</guid><wfw:comment>http://www.blogjava.net/tacy/comments/143485.html</wfw:comment><comments>http://www.blogjava.net/tacy/archive/2007/09/07/143485.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tacy/comments/commentRss/143485.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tacy/services/trackbacks/143485.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 作者：tacy lee<br><br>在设计数据库的时候，选择正确的数据类型，往往可以避免很多的问题，正确理解数据库的类型，对于存储空间规划，应用性能调整都会很有帮助，下面是我个人的一点总结&nbsp;&nbsp;<a href='http://www.blogjava.net/tacy/archive/2007/09/07/143485.html'>阅读全文</a><img src ="http://www.blogjava.net/tacy/aggbug/143485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tacy/" target="_blank">tacy lee</a> 2007-09-07 17:10 <a href="http://www.blogjava.net/tacy/archive/2007/09/07/143485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>