Informix数据库日常维护脚本
1、检查各个dbspaces的空间使用状况: (sysmaster库)
select name dbspace,sum(chksize) allocated,sum(nfree) free,round(((sum(chksize)-sum(nfree))/sum(chksize))*100)||"%" pcused
from sysdbspaces d,syschunks c
where d.dbsnum=c.dbsnum group by name order by 4 desc;
剩余空间肯定是越大越好了
结果例子:
dbspace llogdbs
allocated 256000
free 3447
pcused 99%
dbspace rootdbs
allocated 250000
free 244351
pcused 2%
dbspace phylogdbs
allocated 256000
free 255947
pcused 0%
dbspace workdbs
allocated 1024000
free 1023322
pcused 0%
2、显示各个dbspaces的I/O状况: (sysmaster库)
select d.name,fname path_name,sum(pagesread) diskreads,sum(pageswritten) diskwrites
from syschkio c,syschunks k,sysdbspaces d
where d.dbsnum=k.dbsnum and k.chknum=c.chunknum
group by 1,2 order by 3 desc;
根据各个dbspaces的I/O来调整表的布局,使整个系统I/O均衡
结果例子:
name llogdbs
path_name /informix/dbs/llogdbs
diskreads 612
diskwrites 11
name rootdbs
path_name /informix/dbs/rootdbs
diskreads 145
diskwrites 9
name workdbs
path_name /informix/dbs/workdbs
diskreads 3
diskwrites 0
name phylogdbs
path_name /informix/dbs/phylogdbs
diskreads 2
diskwrites 0
name workdbs
path_name /informix/dbs/workdbs_1
diskreads 1
diskwrites 0
3、检查哪个表具有最多的磁盘I/0: (sysmaster库)
select dbsname, tabname, (isreads + pagreads) diskreads, (iswrites + pagwrites) diskwrites
from sysptprof
order by 3 desc,4 desc ;
结果例子:
dbsname sysmaster
tabname systables
diskreads 425
diskwrites 0
dbsname sysmaster
tabname syscolumns
diskreads 189
diskwrites 0
dbsname sysmaster
tabname sysviews
diskreads 117
diskwrites 0
dbsname sysuser
tabname systables
diskreads 57
diskwrites 0
dbsname sysmaster
tabname sysdatabases
diskreads 41
diskwrites 0
dbsname sysmaster
tabname syscolauth
diskreads 35
diskwrites 0
dbsname sysmaster
tabname systabauth
diskreads 30
diskwrites 0
dbsname sysmaster
tabname sysprocedures
diskreads 19
diskwrites 0
dbsname sysmaster
tabname sysobjstate
diskreads 16
diskwrites 0
dbsname sysmaster
tabname sysprocbody
diskreads 15
diskwrites 0
dbsname sysmaster
tabname sysblobs
diskreads 11
diskwrites 0
4、检查表的extent的分布状况: (sysmaster库)
select t.tabname, count(*) num_ext
from sysextents e, systables t
where e.tabname=t.tabname
and t.tabname not like "sys%"
group by 1
having count(*) > 1
order by 2 desc ;
表的extent建议最大不超过30个,如果太大,就需要重建表修改extent size的大小从而修改extent的数量
结果例子:
tabname flags_text
num_ext 2
5、检查表中索引的层数(越少越好): (sysmaster库)
select idxname, levels from sysindexes order by 2 desc ;
结果例子:
idxname sct_fromtotype
levels 2
idxname column
levels 2
idxname col_xtd_id
levels 2
idxname objdesc
levels 2
idxname idxname
levels 2
idxname tabgtor
levels 2
idxname tabname
levels 2
idxname tabgtee
levels 2
6、检查命中率不高的索引(nrows和unique越接近越好): (sysmaster库)
select tabname, idxname, nrows, nunique
from systables t, sysindexes I
where t.tabid =i.tabid and t.tabid > 99
and nrows > 0 and nunique > 0 ;
当索引的效率不高的时候,需要根据实际情况修改
结果例子:
tabname sysdbspartn
idxname sysdbs_nameix
nrows 1
nunique 1
tabname systabnames
idxname systabs_pnix
nrows 100
nunique 100
tabname sysrawdsk
idxname sysrawdskidx
nrows 100
nunique 100
tabname syspaghdr
idxname syspaghdridx
nrows 100
nunique 100
tabname sysslttab
idxname sysslttabidx
nrows 100
nunique 100
tabname syssltdat
idxname syssltdatidx
nrows 100
nunique 100
tabname syschfree
idxname syschfreeidx
nrows 100
nunique 100
tabname sysptnhdr
idxname sysptnhdridx
nrows 100
nunique 100
7、看数据库里面那些表的碎片比较多(碎片小比较好) (sysmaster库)
select dbsname , tabname ,count(*), sum(size)
from sysextents
group by 1,2
order by 3 desc;
结果例子:
dbsname sysutils
tabname sysprocbody
(count(*)) 7
(sum) 88
dbsname sysmaster
tabname sysprocbody
(count(*)) 7
(sum) 96
dbsname sysuser
tabname sysprocbody
(count(*)) 6
(sum) 88
dbsname workdb
tabname sysprocbody
(count(*)) 6
(sum) 88
dbsname workdb
tabname sysprocedures
(count(*)) 4
(sum) 32
dbsname sysmaster
tabname syscolumns
(count(*)) 4
(sum) 40
8、表和索引的读写情况,(考查那个数据库实体读写比较多) (sysmaster库)
select dbsname, tabname, (isreads + pagreads) diskreads, (iswrites + pagwrites)
diskwrites
from sysptprof
order by 3 desc, 4 desc ;
结果例子:
dbsname sysmaster
tabname systables
diskreads 652
diskwrites 0
dbsname sysmaster
tabname syscolumns
diskreads 262
diskwrites 0
dbsname sysmaster
tabname sysindices
diskreads 219
diskwrites 0
dbsname sysmaster
tabname sysviews
diskreads 184
diskwrites 0
dbsname sysuser
tabname systables
diskreads 109
diskwrites 0
9、那些表的锁竞争比较厉害(越小越好) (sysmaster库)
select a.tabname,nrows,lockwts,deadlks
from sysmaster:sysptprof a,systables b
where a.tabname=b.tabname and lockwts>0
and a.dbsname = &'dbsname'
and b.tabid >= 100
order by tabname;
结果例子:
10、表的顺序扫描数(OLTP系统的话,大表的顺序扫描数越小越好) (sysmaster库)
select a.tabname,nrows,seqscans
from sysmaster:sysptprof a,systables b
where a.tabname=b.tabname and seqscans>0
and a.dbsname = '库名'
and b.tabid>=100
order by tabname;
结果例子:
tabname sysdatabases
nrows 0
seqscans 7
11、查看informix数据库表占用空间大小情况:
在sysmaster数据库中查询表systabnames,sysptnext。其中systabnames.partnum=sysptnext.pe_partnum.执行以下sql:
select tabname,sum(pe_size) from systabnames,sysptnext
where partnum=pe_partnum
and tabname='table_name'--(table_name为要查询的表名)
group by tabname
(注:查询结果中pe_size的值,单位IBM是4k,HP-UX是2k)
结果例子:
用onstat查是那个线程在干的,然后再分析。
我是用onstat -u查看到锁数的。
用onstat -g ses 找出session id (及操作系统的PID)
再用onstat -g sql session id查看它在做什么。
update statistics for table temp_user;
1、检查各个dbspaces的空间使用状况: (sysmaster库)
select name dbspace,sum(chksize) allocated,sum(nfree) free,round(((sum(chksize)-sum(nfree))/sum(chksize))*100)||"%" pcused
from sysdbspaces d,syschunks c
where d.dbsnum=c.dbsnum group by name order by 4 desc;
剩余空间肯定是越大越好了
结果例子:
dbspace llogdbs
allocated 256000
free 3447
pcused 99%
dbspace rootdbs
allocated 250000
free 244351
pcused 2%
dbspace phylogdbs
allocated 256000
free 255947
pcused 0%
dbspace workdbs
allocated 1024000
free 1023322
pcused 0%
2、显示各个dbspaces的I/O状况: (sysmaster库)
select d.name,fname path_name,sum(pagesread) diskreads,sum(pageswritten) diskwrites
from syschkio c,syschunks k,sysdbspaces d
where d.dbsnum=k.dbsnum and k.chknum=c.chunknum
group by 1,2 order by 3 desc;
根据各个dbspaces的I/O来调整表的布局,使整个系统I/O均衡
结果例子:
name llogdbs
path_name /informix/dbs/llogdbs
diskreads 612
diskwrites 11
name rootdbs
path_name /informix/dbs/rootdbs
diskreads 145
diskwrites 9
name workdbs
path_name /informix/dbs/workdbs
diskreads 3
diskwrites 0
name phylogdbs
path_name /informix/dbs/phylogdbs
diskreads 2
diskwrites 0
name workdbs
path_name /informix/dbs/workdbs_1
diskreads 1
diskwrites 0
3、检查哪个表具有最多的磁盘I/0: (sysmaster库)
select dbsname, tabname, (isreads + pagreads) diskreads, (iswrites + pagwrites) diskwrites
from sysptprof
order by 3 desc,4 desc ;
结果例子:
dbsname sysmaster
tabname systables
diskreads 425
diskwrites 0
dbsname sysmaster
tabname syscolumns
diskreads 189
diskwrites 0
dbsname sysmaster
tabname sysviews
diskreads 117
diskwrites 0
dbsname sysuser
tabname systables
diskreads 57
diskwrites 0
dbsname sysmaster
tabname sysdatabases
diskreads 41
diskwrites 0
dbsname sysmaster
tabname syscolauth
diskreads 35
diskwrites 0
dbsname sysmaster
tabname systabauth
diskreads 30
diskwrites 0
dbsname sysmaster
tabname sysprocedures
diskreads 19
diskwrites 0
dbsname sysmaster
tabname sysobjstate
diskreads 16
diskwrites 0
dbsname sysmaster
tabname sysprocbody
diskreads 15
diskwrites 0
dbsname sysmaster
tabname sysblobs
diskreads 11
diskwrites 0
4、检查表的extent的分布状况: (sysmaster库)
select t.tabname, count(*) num_ext
from sysextents e, systables t
where e.tabname=t.tabname
and t.tabname not like "sys%"
group by 1
having count(*) > 1
order by 2 desc ;
表的extent建议最大不超过30个,如果太大,就需要重建表修改extent size的大小从而修改extent的数量
结果例子:
tabname flags_text
num_ext 2
5、检查表中索引的层数(越少越好): (sysmaster库)
select idxname, levels from sysindexes order by 2 desc ;
结果例子:
idxname sct_fromtotype
levels 2
idxname column
levels 2
idxname col_xtd_id
levels 2
idxname objdesc
levels 2
idxname idxname
levels 2
idxname tabgtor
levels 2
idxname tabname
levels 2
idxname tabgtee
levels 2
6、检查命中率不高的索引(nrows和unique越接近越好): (sysmaster库)
select tabname, idxname, nrows, nunique
from systables t, sysindexes I
where t.tabid =i.tabid and t.tabid > 99
and nrows > 0 and nunique > 0 ;
当索引的效率不高的时候,需要根据实际情况修改
结果例子:
tabname sysdbspartn
idxname sysdbs_nameix
nrows 1
nunique 1
tabname systabnames
idxname systabs_pnix
nrows 100
nunique 100
tabname sysrawdsk
idxname sysrawdskidx
nrows 100
nunique 100
tabname syspaghdr
idxname syspaghdridx
nrows 100
nunique 100
tabname sysslttab
idxname sysslttabidx
nrows 100
nunique 100
tabname syssltdat
idxname syssltdatidx
nrows 100
nunique 100
tabname syschfree
idxname syschfreeidx
nrows 100
nunique 100
tabname sysptnhdr
idxname sysptnhdridx
nrows 100
nunique 100
7、看数据库里面那些表的碎片比较多(碎片小比较好) (sysmaster库)
select dbsname , tabname ,count(*), sum(size)
from sysextents
group by 1,2
order by 3 desc;
结果例子:
dbsname sysutils
tabname sysprocbody
(count(*)) 7
(sum) 88
dbsname sysmaster
tabname sysprocbody
(count(*)) 7
(sum) 96
dbsname sysuser
tabname sysprocbody
(count(*)) 6
(sum) 88
dbsname workdb
tabname sysprocbody
(count(*)) 6
(sum) 88
dbsname workdb
tabname sysprocedures
(count(*)) 4
(sum) 32
dbsname sysmaster
tabname syscolumns
(count(*)) 4
(sum) 40
8、表和索引的读写情况,(考查那个数据库实体读写比较多) (sysmaster库)
select dbsname, tabname, (isreads + pagreads) diskreads, (iswrites + pagwrites)
diskwrites
from sysptprof
order by 3 desc, 4 desc ;
结果例子:
dbsname sysmaster
tabname systables
diskreads 652
diskwrites 0
dbsname sysmaster
tabname syscolumns
diskreads 262
diskwrites 0
dbsname sysmaster
tabname sysindices
diskreads 219
diskwrites 0
dbsname sysmaster
tabname sysviews
diskreads 184
diskwrites 0
dbsname sysuser
tabname systables
diskreads 109
diskwrites 0
9、那些表的锁竞争比较厉害(越小越好) (sysmaster库)
select a.tabname,nrows,lockwts,deadlks
from sysmaster:sysptprof a,systables b
where a.tabname=b.tabname and lockwts>0
and a.dbsname = &'dbsname'
and b.tabid >= 100
order by tabname;
结果例子:
10、表的顺序扫描数(OLTP系统的话,大表的顺序扫描数越小越好) (sysmaster库)
select a.tabname,nrows,seqscans
from sysmaster:sysptprof a,systables b
where a.tabname=b.tabname and seqscans>0
and a.dbsname = '库名'
and b.tabid>=100
order by tabname;
结果例子:
tabname sysdatabases
nrows 0
seqscans 7
11、查看informix数据库表占用空间大小情况:
在sysmaster数据库中查询表systabnames,sysptnext。其中systabnames.partnum=sysptnext.pe_partnum.执行以下sql:
select tabname,sum(pe_size) from systabnames,sysptnext
where partnum=pe_partnum
and tabname='table_name'--(table_name为要查询的表名)
group by tabname
(注:查询结果中pe_size的值,单位IBM是4k,HP-UX是2k)
结果例子:
用onstat查是那个线程在干的,然后再分析。
我是用onstat -u查看到锁数的。
用onstat -g ses 找出session id (及操作系统的PID)
再用onstat -g sql session id查看它在做什么。
update statistics for table temp_user;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26366371/viewspace-1972577/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26366371/viewspace-1972577/