如何调整DB2数据库性能实用技巧分享(2)
Randomlyreadtablesshouldhaverandomlyreadtablespaces,meaninghighsynchronousreadpercentages,usuallyhigherbufferpoolhitratios,andlowerphysicalI/Orates.
对每个tablespace,要注意Prefetchsize是Extentsize的倍数。如果必要,可以修改tablespace的prefetchsize。
显示tablespace信息:db2"listtablespacesshowdetail"
显示containers信息:db2"listtablespacecontainersforNshowdetail"
4.TABLEACCESS
要查出来每次查询读出的row,
1)db2"getsnapshotfordatabaseonDBNAME"
看到多少交易发生,thesumofCommitstatementsattempted+Rollbackstatementsattempted
2)db2"getsnapshotfortablesonDBNAME"
区分出交易读出的row。dividethenumberofrowsreadbythenumberoftransactions(RowsPerTX).OLTP一般每次交易从一个table里面读出20row,如果发现一个交易能读出成百上千行数据,表扫描就可能出现,可能需要看看index是否需要。简单情况下是运行runstats收集信息。
Sampleoutputfrom"getsnapshotfortablesonDBNAME"follows:
Snapshottimestamp=09-25-20004:47:09.970811
Databasename=DGIDB
Databasepath=/fs/inst1/inst1/NODE0000/SQL00001/
Inputdatabasealias=DGIDB
Numberofaccessedtables=8
TableList
TableSchema=INST1
TableName=DGI_SALES_LOGS_TB
TableType=User
RowsWritten=0
RowsRead=98857
Overflows=0
PageReorgs=0
有很高的Overflows,就需要re-orgtable。当一行宽度改变,可能DB2就会把一行放到不同的页中。
5.SORTMEMORY
OLTP应该没有大规模的sort,因为sort会消耗大量的CPU,I/O和时间。
缺省的SORTHEAP=256*4K=1M,一般是足够了。应该知道sortoverflows的数目和每个交易的sortnumber。
Db2"getsnapshotfordatabaseonDBNAME"
察看如下项目:
Totalsortheapallocated=0
Totalsorts=1
Totalsorttime(ms)=8
Sortoverflows=0
Activesorts=0
Commitstatementsattempted=3
Rollbackstatementsattempted=0
Lettransactions=Commitstatementsattempted+Rollbackstatements
attempted
LetSortsPerTX=Totalsorts/transactions
LetPercentSortOverflows=Sortoverflows*100/Totalsorts
如果PercentSortOverflows超过3%,可能说明应用中有比较严重的sortSQL。因为大量的overflows说明有大量的sort出现,为零或者小于1时比较理想的。
如果有大量的overflow出现,权宜之计是增加SORTHEAP,但是这么做只是隐藏了问题。根本解决是:要定位SQL,通过调整SQL,INDEX,clustering来减少sort代价。
如果SortsPerTX大于5,说明每个交易的sort数目过多,某些应用可能执行了大量的小复合查询,不会overflow,但是有很小的时间段。但是会消耗大量的CPU。同样是要调整SQL,INDEX,clustering来解决问题。
6.TemporaryTablespaces
临时表空间一般要有3个containers在不同的disk上,可以实现并行I/O,提高sorts,hashjoins,或者其他在TEMPSPACE上的动作的性能。
db2"listtablespacesshowdetail",可查看临时表空间的container:
TablespaceID=1
Name=TEMPSPACE1
Type=Systemmanagedspace
Contents=Temporarydata
State=0x0000
Detailedexplanation:Normal
Totalpages=1
Useablepages=1
Usedpages=1
Freepages=Notapplicable
Highwatermark(pages)=Notapplicable
Pagesize(bytes)=4096
Extentsize(pages)=32
Prefetchsize(pages)=96
Numberofcontainers=3
这里表示有3个container,Prefetchsize是Extentsize的3倍。为了最好的并行性能,最好Prefetchsize是Extentsize的倍数。一般倍数是container的数目。
db2"listtablespacecontainersfor1showdetail"
可以看到containers的定义。
7.Locks
缺省的LOCKTIMEOUT=-1,就是说不设置lock的timeout,在OLTP中这可能是一个灾难。我们要设置比较小的数值,比如设置LOCKTIMEOUT=10或者15秒。
查看命令:
db2"getdbcfgforDBNAME",
继续查看下面的信息:
Locktimeout(sec)(LOCKTIMEOUT)=-1
要和应用人员将明白,他们是否已经在程序中可以处理timeout的情况。然后设置:
db2"updatedbcfgforDBNAMEusingLOCKTIMEOUT15"
可以在系统中察看lockwait的数目,lockwaittime,locklist使用的内存量。
分享到: