由于之前未曾接触informix数据库产品,此次项目算是
学习一下,如果你之前对于其它的
数据库产品oracle、db2体系结构认识和使用有较多经验,你会发现你来学习informix实际上也是很快的,你可以对比的来学习,同时明白一些她们体系结构和
工作原理方面共同的设计理念和不同的实现方式,从而能够了解到怎样更好利用她们的优点来事资源最大化。
作为老牌的数据库品牌,informix占据了一定的市场份额,但是由于其自身一些缺陷和支持资源的减少,导致市场被oracle等数据库大量的占据,但是infomix任然会保持一定的份额量,特别是随着IBM在背后的强大支持,最近推出的最新版本11.7,号称新版IBM Informix数据库软件性能十分出色。查询运行速度比我们之前用过的其他数据库快五倍。还带来了弹性网格这种新的概念,基于infromix的集群取消了同平台(os、硬件),大大降低的客户的成本,总的来说还是非常值得我们期待的。
一、Informix体系结构简单描述
INFORMIX动态服务器采用的是一种多线索体系结构,这就意味着一个进程利用自己的多个线索可以同时完成多个任务,因而整个系统只需要较少的进程就足以完成DBMS的任务。
动态服务器系统由三个主要组件构成:共享内存,进程和磁盘。共享内存包括三个段:驻留段。虚拟段和消息段。驻留段主要用作磁盘数据的缓存。虚拟段主要用作内存池以支持进程及相关的会话(session)和线索。当客户与服务器利用共享内存进行通信时,消息段将用作两者之间的消息缓冲区。
系统中还包括若干构成数据库服务器的UNIX进程,称为oninit.这些进程被称为虚拟处理器(VP)(virtual processors)。每一VP隶属于某一虚拟处理类。而每一虚拟处理器类都负责完成一类特定的任务。
系统的磁盘组件由多个原始磁盘空间组成,称为chunk,chunk以页(page)为基本单位。多个chunk集合逻辑上构成了数据空间(dbspace)。数据空间用于存储数据库、表、系统信息以及物理日志和逻辑日志。一个数据空间至少包括一个chunk.
共享内存段
动态服务器的共享内存由三个段构成:
驻留段主要用作缓冲池,内含逻辑日志和物理日志的缓冲区以及其他系统数据结构。驻留段的大小主要有系统参数BUFFERS决定。
虚拟段主要用作内存池以支持会话和线索。根据用途的不同,内存池可以进一步分为:会话池、多线索池、字典池、存储过程池、排序池、大缓冲池以及全局池。内存池的分配和释放是动态进行的。内存池分配单位大小为8k。如果已有虚拟段耗尽,动态服务器可以根据onconfig参数再次动态申请。虚拟内存段的初始大小由参数SHMVIRTSIZE决定,其增量由参数SHMADD决定,但整个共享内存段的大小不能超过SHMTOTAL。
二、Informix性能调整原则和建议
l Buffers:值(多少个page)
page可以使用onstat –b确定;
出于性能考虑建议共享内存可以使用系统物理内存的20%-50%,具体的多少合适取决于业务量,业务特性(OLTP/DSS)等;
l Dbspace及chunk规划布局原则
主要的dbspaces包含:rootdbs、logdbs、temdbs和datadbs;
一般的原则:
? I/O争用的平衡,避免log、data、root三类在磁盘方面的并发读写的I/O争用,rootdbs、logdbs、datadbs放在不同的pv上存储,logdbs建议采用裸设备,datadbs采用raid和条带化技术;
? 大表(千万条级)使用单独的表空间存放,同时采用分区表机制;
l Phylog buffer、lglog buffer
这个调整原则建议通过监控逻辑日志和物理日志buffer利用率情况来调整,原则是buffer利用率75%左右最为理想,90%符合太重,50%或再小说明太大;
三、Informix监控
l 共享Buffer
命令格式:Onstat –p
Oltp系统读写命中率建议都能在95%左右;
Dss业务型系统80%左右;
l 逻辑之日buffer、物理日志buffer
命令格式:onstat –l
l Vp调节
参照系统物理cpu数量,单cpu设置为1;
多处理器系统设置为cpu格式减1的值;
l 实时的vp
Onstat –g glo
l 实时用户线程
Onstat –u
l 实时会话及实时会话内容
Onstat –g ses
Onstat –g ses sid
l 实时sql及sql内容
Onstat –g sql
Onstat –g sql sql_id
l Vp队列
Onstat –g ioq
四、sql性能分析简单办法
类似于oracle的执行计划和代价分析工具,informix也有类似的东西,具体使用方式如下:
- 进入到dbaccess的交互模式:dbaccess "库实例名" -;
- 得到执行计划和代价结果命令行:set explain on;或者set explain on avoid_execute;区别在于前者执行语句,后者不执行语句;
- 输入要执行实际sql:select ....from tab ....;
- 接着就会在当前的目录下产生一个执行分析文件,你可以看到默认的名称为:sqexplaiin.out这个文件是在末尾追加内容,你可以看到如下的格式显示的文件;
QUERY:
------
UPDATE T_AnntBlnc
SET Balance = 10000000 ,
InvBlnc = 20000000,
ModifyDate = '20080909'
WHERE GrPlcNo = '00000051'
AND CustNo = '000061'
AND AnntAcctCode = '02'
Estimated Cost: 39
Estimated # of Rows Returned: 53
1) eapsapp.t_anntblnc: INDEX PATH
(1) Index Keys: grplcno custno plcno anntacctcode (Key-First) (Serial, fragments: ALL)
Lower Index Filter: (eapsapp.t_anntblnc.custno = '000061' AND eapsapp.t_anntblnc.grplcno = '00000051' )
Index Key Filters: (eapsapp.t_anntblnc.anntacctcode = '02' )
解释:Estimated # of Rows Returned: 53这个代表是这条语句结果返回的记录行数,eapsapp.t_anntblnc: INDEX PATH代表执行采用的方式,比如这个INDEX PATH说明采用的索引方式,而Index Keys代表的是走的具体的索引的名称Serial, fragments: ALL这个代表扫描的范围,全部分区;Estimated Cost: 39这个代表代价单元,你可以认为是这条sql执行所要花费的整体的代价和,每个单元代表的具体成分你可以查询informix的官方手册;