IDS(Informix Dynamic Server)的基本概念总结

Informix动态可伸缩体系结构DSA 
(Dynamic Scalability Architecture) 
一、关系型数据库(Relational Database)系统体系结构 
目前比较流行的商用关系型数据库多采用一下三种体系结构: 
1、一请求一服务体系结构 
采用对于每一数据库服务请求,数据库系统将为之分配一个数据库服务进程服务的方式。 
优点:可以充分隔离不同用户的数据库服务,并且可以比较容易发挥采用SMP体系结构的机器的资源。 
缺点:系统内存资源、CPU资源消耗大;由于使用操作系统的进程调度,系统运行效率不高。 
2、多线索体系结构 
优点:不需要频繁的操作系统的进程切换,节约内存、CPU资源;系统并行运行程度高,运行效率高。 
缺点:系统比较脆弱,一个线索的误操作,可能导致系统瘫痪;数据库自己的线索切换较操作系统的切换简单;大数据量的操作可能引起系统资源的不均衡分布。 
3、混合体系结构 
该系统由(1)多线索的网络监听器(2)任务分发器,包括请求/响应队列(3)可重用数据库服务器组成。 
优点:任务处理采用并行和排队的方式,系统运行效率高。 
缺点:负载均衡较简单。 
二、IDS系统组成 
IDS(Informix Dynamic Server)数据库系统由一下部分组成: 
1、共享内存部分 
共享内存部分包括:长驻内存部分、虚拟内存部分、消息区。 
(1)长驻内存部分主要是用于磁盘数据在内存的缓冲、系统数据等等(bufffers,physical/logical buffers,LRUs,chunks,dbsapces,users,locks…)。 
(2)虚拟内存部分主要用于VP的管理信息和缓冲区。(global pool,dictionary pools,procedure pools,sort pools,session pools,big buffer pools,MT pools)。虚拟内存部分在使用过程中可以动态增长,增长大小在配置文件中定义。 
(3)消息区主要用于应用(client)和数据库引擎(server)之间的信息交换。 
2、磁盘数据空间部分 
3、数据库引擎-虚拟处理器VP(Virtual Processors) 
三、IDS多线索体系结构 
Online7.0改变了Online5.0中一对一的客户/服务器模式:由原来的一个数据库请求启动一sqplexec数据库引擎服务的 Client/Server方式转变为对于所有数据库请求由多个数量固定(除非动态调整)的数据库引擎(即VP虚拟处理器)服务的方式。 OnLine7.0把数据库引擎按功能划分为多个VP,这些VP是长驻内存的oninit进程。对于每一个数据库服务请求都将被分割成多个可并行的线索,由不同VP并行服务。线索(thread)可以定义为一段顺序执行的程序。虚拟处理器VP可以定义为完成一定义数据库服务功能的数据库进程。VP包括一下类型:CPU,PIO(负责写物理日志),LIO(负责写逻辑日志),AIO(负责磁盘I/O)等等。线索运行在VP上,线索的调度由CPU VP完成。从这一点来看,VP类似于硬件上的CPU,线索类似与运行其上的进程。多线索体系结构的优点: 
(1)fan-in:对于多个应用请求,数据库只用一定数量的VP服务,并可以根据需要动态调整; 
(2)fan-out:多个数据库VP服务一个应用请求; 
(3)数据库内部的线索切换避操作系统的进程切换速度快、效率高; 
(4)多线索体系结构更适合于多CPU的体系结构,如:affinity特性。 
四、IDS客户/服务器连接方式 
1、 IDS的客户/服务器连接方式可采用一下方式: 
(1)共享内存连接方式(onipcshm) 
(2)管道连接方式(onipcstr) 
(3)网络连接方式(基于TCP/IP协议,包括ontlitcp,onsoctcp或者IPX/SPX协议,ontlispx) 
基于TCP/IP网络协议的应用接口可以使用SOC(Socket)或者TLI(Transport Layer Interface)。采用网络连接方式的客户端与服务器端必须使用相同的网络通讯协议(TCP/IP协议或者IPX/SPX协议),但是客户端使用 socker接口,而服务器端使用tli接口。 
2、基于共享内存方式的客户服务器连接 
3、基于TCP/IP协议的客户服务器连接 
(1)在客户端和服务器端的/etc/hosts文件中指定连接方式。 
(2)在客户端和服务器端的/etc/services文件中指定通讯端口和网络协议。 
(3)在客户端和服务器端的$INFORMIXSQLHOSTS文件中指定如何访问服务器,包括服务器名称、服务器网络地址、服务器网络访问方式(协议和端口号)。 
(4)检查网络系统安全文件,包括/etc/hosts.equive、$HOME/.rhosts文件。 
(5)在客户端和服务器端设置环境变量,包括INFORMIXSERVER,INFORMIXSQLHOSTS。 
五、IDS磁盘数据结构 
1、数据存储概念 
(1)page 
page是OnLine的最基本数据存储单位。OnLine的数据页面包含一下内容: 
(1)24个字节的页头(包含4个字节的时间戳(timestamp))。 
(2)数据区 
(3)槽表(slot table) 
每4个字节。前2个字节存放记录在页面的偏移量,后2个字节存放该记录的大小。一个页面中的槽表个数最多不超过255,所以一个数据页面最多存放255个记录。 
(4)时间戳。 
(2)extent 
extent是多个物理连续page(最多4个)的组合。数据库表的存储空间分配是以extent为单位的。 
(3)tbspace 
tbspace是extent的逻辑组合。Tbspace由分配给一个表的所有extent组成。一个tbspace只可能在一个dbspace中,但可能跨越多个chunk。 
(4)chunk 
chunk是分配给OnLine的一块物理存储空间,可以是unix文件,也可以是原始设备。 
(5)dbspace、blobspace 
dbspace是chunk的逻辑组合。数据库管理员可以为dbspace创建、增加chunk、从而增加数据库的存储空间。创建dbspace时必须首选指定它的primary chunk。 
2、日志(log) 
数据库日志是用于维护数据库数据一致性的手段。IDS的日志分为物理日志(physical log)和逻辑日志(logical log)。物理日志用于维护数据库的物理一致性,在每次修改数据之前,该数据所在的数据页面都将存储在物理日志中,所以物理日志也称为“前镜像” (before images)。逻辑日志用于维护数据库的逻辑一致性,在每次变动数据库时,所有变动情况都将记录在逻辑日志中。物理日志在每次checkpoint之后将被自动清空;逻辑日志必需是已经备份,而且日志中包含的事务都已提交,并且不是最后一个日志文件才能被释放。长事务是指那些尚未结束,但数据库逻辑日志文件已经被事务日志记录充满的事务。这样一来逻辑日志文件既不能被释放重用,同时事务日志记录也写不进逻辑日志文件。这种情况下,IDS会阻塞数据库请求,同时“回滚”长事务。 
六、IDS的容错处理 
1、checkpoint 
checkpint是IDS的一个重要系统功能。IDS利用checkpoint来保证共享内存数据缓冲区中的数据与物理磁盘上的数据保持一致。它包括一下步骤: 
(1)挂起临界区; 
(2)刷新共享内存中的物理日志缓冲到物理磁盘上的物理日志文件; 
(3)刷新共享内存缓冲区中发生修改的页面到物理磁盘页面上; 
(4)写checkpoint记录到逻辑日志文件和系统保留页中; 
(5)逻辑清空物理日志文件; 
(6)刷新逻辑日志缓冲区到物理磁盘的逻辑日志文件中。 
注意:IDS在刷新内存中的页面到物理磁盘之前,必须先将物理日志缓冲区的数据刷新到硬盘上的物理日志文件中。 
2、fast recovery 
IDS利用fast recovery功能来保证数据库每次重起时快速恢复到数据库shutdown时的一致性状态。 
它包含一下步骤: 
(1)恢复物理日志文件中的数据到共享内存的缓冲区和磁盘的物理页面上; 
(2)在逻辑日志文件中定位系统最后一个一致点-checkpoint点; 
(3)根据系统最后的一致点以后的逻辑日志记录“回滚”(rollback)尚未提交的事务和“取消”(undo)已经提交的事务。 
3、IDS数据缓冲技术 
IDS对数据库中的操作都是通过对共享内存数据缓冲区中数据的操作来完成的。例如一个修改数据库记录的操作 
 
Begin work; 
Update tab1 set fld1=”” where fld2=?; 
Commit work; 
 
IDS处理如下: 
(1)客户端连接到IDS后(connect…,database…),IDS为这个请求启动一个sqlexec任务进行服务。 
(2)sqlexec在对SQL语句进行语法分析后,产生执行计划。 
(3)sqlexec在logical log buffer中写入事务开始记录。 
(4)sqlexec将请求读取某个chunk中的某个数据页面,并申请相应锁资源。 
(5)IDS首选在内存缓冲区的LRU队列中查找该数据页面是否在缓冲区中。 
(6)如果不在缓冲区中,IDS将在FLRU队列中查找空闲页面,如果没有,IDS将启动一个Forground Write来申请一个空闲缓冲区页面。IDS申请将该数据页面从磁盘上读入到缓冲区中。在修改数据前,IDS将该页面写入物理日志缓冲区中。然后,进行数据修改。接下来执行步骤(8)。 
(7)如果在缓冲区中,并且在FLRU队列中,IDS将该页面写入物理日志缓冲区中,并进行数据修改。如果在MLRU队列中,IDS将直接进行数据修改。 
(8)IDS向逻辑日志缓冲区中写入修改操作的逻辑日志记录。 
(9)IDS释放该事务申请的所有锁资源,并向逻辑日志缓冲区中写入日志结束记录。 
七、IDS监控 
1、IDS状态 
(1)off-line状态 
(2)quiescent状态 
(3)online状态 
(4)shutdown状态 
(5)recovery状态 
2、系统阻塞原因 
CKPT Checkpint 
LONGTX Long Transaction 
ARCHIVE Ongoing archive 
MEDIA_FAILURE Media failure 
HANG_SYSTEM Database server failure 
DBS_DROP Dropping a dbspace 
DDR Discrete high availability data replication 
LBU Logs full high-water mark 
3、监控工具。 
用户可以使用SMI(System Monitoring Interface)、onstat工具、oncheck工具完成对IDS的监控。 
1)使用系统监控界面SMI 
系统监控界面采用只读方式直接访问DSA的管理信息。 
2)使用onstat监控工具 
(1)监控数据库日志文件online.log:onstat -m 
(2)监控数据库系统共享内存使用情况:onstat –g seg 
(3)监控数据库系统逻辑日志使用情况:onstat –l 
(4)监控数据库系统chunk使用情况:onstat –d 
(5)监控数据库系统在线session情况:onstat –g ses 
(6)监控数据库系统某个在线session情况:onstat –g ses sessid 
(7)监控数据库系统在线userthread情况:onstat –u 
(8)监控数据库系统锁资源使用情况:onstat –k 
(9)监控数据库系统缓冲区刷新操作情况:onstat –F 
(10)监控数据库系统LRU队列使用情况:onstat –R 
(11)监控数据库系统对所有chunk对协操作情况:onstat –g iof 
(12)监控数据库系统在线thread情况:onstat –g ath 
(13)监控数据库系统在线VPs情况:onstat –g glo 
(14)监控数据库系统使用效率情况:onstat –p 
(15)监控数据库系统PDQ使用情况:onsat –g mgm 
(16)监控数据库系统就绪队列(ready queue)情况:onstat –g rea 
(17)监控数据库系统等待队列(wait queue)情况:onstat –g wai 
(18)监控数据库系统休息队列(sleep queue)情况:onstat –g sle 
(19)监控数据库系统活动事务情况:onstat –X

第二章 
并发控制 
并发是指多个用户在同一个时间操作相同数据。由于并发操作就带来了数据一致性得问题。IDS是通过锁(lock)技术来保证并发数据得一致性的。 
1、锁的类型 
1)共享锁(shared lock) 
共享锁可以防止其他用户修改被锁住的目标,但多个用户对同一目标可以实施加共享锁。 
2)排它锁(exclusive lock) 
排它锁锁住的对象将谢绝所有其他用户的访问。 
3)提升锁((promotable lock/update lock) 
提升锁是用户在使用update游标时使用的锁。提升锁在数据修改之前是一个共享锁,当数据修改时,共享锁提升为一个排它锁。下面是一张锁冲突表: 
A 
--------------------------------------------------------------- 
S X U none 
B S y n y y 
X n n n y 
U y n n y 
------------------- 
说明:S:共享锁 X:排它锁 U:提升锁 
A:持有锁的用户 B:申请锁的用户 
y:锁申请成功 n:锁申请失败

2、锁的粒度(granularity) 
锁的粒度是指被加锁的对象的大小或范围。锁的粒度越大,并发程度越低,锁资源开销越小;锁的粒度越小,并发程度越高,锁资源开销越大。 
1)数据库级锁(database lock) 
database dbname [exclusive/share]; 
默认情况下,IDS对数据库使用共享锁,如用户打开数据库:database dbname。 
2)表级锁(table lock) 
lock table tablename in exclusive/share mode; 
当做如下操作时,IDS将自动对操作的表施加排它锁: 
(1)alter index (2)alter table 
(2)create index (3)drop index 
(4)rename column (5)rename table 
表级共享锁锁住的表将谢绝其他用户对该表数据的任何修改,但其他用户可以读该表的数据。表级排它锁锁住的表将谢绝其他用户的任何访问(除非使用“脏读”方式)。对于一个表的大量数据修改操作可以考虑使用表级排它锁。

3)页面锁(page lock)、记录锁(row lock)、键值锁(key lock) 
页面锁锁住的对象是一个IDS数据页面,记录锁锁住的对象是一个记录。用户在创建表时可以选择对该表操作时使用页面锁或者记录锁。IDS建表时默认的锁方式是页面锁: 
create table tablename 
( 
 
)lock mode page/row; 
当IDS试图对该表的记录加锁时,它将根据长剑该表时定义的锁类型加锁。 
键值锁是IDS用来锁住不存在的记录的方法,实际上是锁住该记录在表中的位置不被他用。例如:IDS在事务中删除一个表中的某一记录时,它将锁住该记录对应的键值,以免其他用户同时插入同一记录。

3、锁的生命周期 
数据库级锁只有在关闭数据库时才能被释放。对于表级锁、记录锁、键值锁的生命周期依赖于所进行的数据库操作:selcet,update, delete等和数据库事务是否使用。如果数据库没有使用日志,那么只有当用户显示释放该锁时(unlock table tablename),IDS才释放表级锁。总之:当数据库事务结束时,它将释放所有在本事务中使用的锁;事务中对数据库数据修改时所加的所将保持到事务结束。

4、锁的隔离等级(isolation level) 
隔离等级是指在并发环境下,一个应用隔离其他并发应用的等级。通过使用隔离等级,应用可以在读数据时指定使用锁资源的方式。使用隔离登机必须打开数据库日志。 
1)set isolation to dirty read; 
指定应用读数据时,对所读对象不施加任何锁。应用读数据时将不检查是否其他应用正在操作该数据。仅仅考虑系统开销,这种方式读数据是效率最高的。 
2)set isolation to commited read; 
指定应用读数据之前,首选对所读数据检查是否有其他应用正在修改该数据,以确保本应用读数据是已提交的数据。但这种方式在读数据时,并不对数据施加任何类型的锁,所以用户正在读的数据有可能其他用户正在修改。这种方式时IDS默认的读数据方式。 
3)set isolation to cursor stability; 
指定应用读数据时,如果使用“游标”,则对所读数据施加共享锁,该共享锁在读取下一记录时将被释放掉,也就是只对所读当前一条记录保持共享锁:如果不使用“游标”,该种读数据的方式与上一种相同。 
4)set isolation to repeatable read; 
指定应用读数据时,对所读数据全部施加共享锁,所有的锁资源在事务结束才被释放。使用这种方式,所有扫描过的数据全部施加共享锁,即使部分数据不满足读数据条件,但在扫描过程种扫描过。(如果全表扫描,则这种方式与使用表级锁效果是一样的)。 
5、锁冲突模式 
当应用由于锁资源引起冲突时,可以通过设置锁冲突来解决。 
1)set lock mode to wait; 
这种方式下,应用遭遇锁冲突时,将无限制等待下去直到申请到所需锁资源为止。 
2)set lock mode to no wait; 
这种方式下,应用遭遇锁冲突时,将立即返回应用:数据库操作错,如:107:Record is locaked.这种方式是IDS默认的冲突等待方式。 
3)set lock mode to wait n;(n是应用设置的等待时间) 
这种方式下,应用遭遇锁冲突时,将在时间n内反复申请所需锁资源直到申请成功或者设置时间n用完。在IDS处理OLTP(Online Transaction Processing)联机交易(如MCS中储蓄、会计、信用卡日间实时交易)时,应该在E/C程序首部,首先设置锁冲突等待时间,这样以来可以避免很多不必要的由于锁冲突引起的数据库操作失败。 
6、死锁(deadlock) 
假设用户A持有x锁,用户B持有y锁。此时,用户A申请y锁,同时用户B申请x锁。这样一来就会出现用户A、B同时等待对方释放自己的锁,于是出现“死锁”。对于“死锁”,IDS本身提供了一套检测、恢复机制来避免“死锁”的发生。 
7、举例: 
假设有两个用户同时在操作同一数据库workdb中的表test,表test的脚本: 
$create table test 
( 
code char(3), 
time char(20), 
name char(20) 
)lock mode page; 
$create upique index m_idx on test(code); 
先进行如下练习: 
(1)用户A进行如下操作: 
begin work; 
update test set time=”2” where code=”sam”; 
(2)用户B同时进行如下操作: 
select * from test where code=”abc”; 
问题:上述操作结果如何? 
用户B的select操作失败了。因为用户A操作时对表test施加了页面级的排他锁(这些锁将保留到事务结束),而用户B试图扫描被页级排它锁锁住的页面,所以操作失败。 
(3)用户A进行如下操作: 
rollback work; 
alter table test lock mode(row); 
begin work; 
update manufact set time=”2” where code=”sam”; 
说明: 
本次操作成功。因为该操作通过索引读取记录,而记录未被步骤3的记录锁锁住。 
(4)用户B进行如下操作: 
select * from test where code=”hro”; 
说明: 
本次操作成功。因为该操作通过索引读取记录,而该记录未被步骤3的记录锁住。 
(5)用户B进行如下操作: 
select * from test; 
说明: 
本次操作失败。因为该操作试图顺序扫描表test,而步骤3对test施加了记录排它锁,而且本操作使用了”commited read”的读数据方式(系统默认)。 
(6)用户B进行如下操作: 
set isolation to dirty read; 
select * from test; 
说明: 
本次操作成功。因为该操作设置了“脏读“方式,将忽略说有锁冲突。 
(7)用户B进行如下操作: 
set isolation to commited read; 
set lock mode to wait; 
select * from test; 
说明: 
本次操作处于等待方式。因为该操作设置了“commited read“和“锁冲突等待”方式,所以本操作被步骤3申请的锁阻塞,等待其释放锁资源。 
(8)用户A进行如下操作: 
commit work; 
说明: 
本次操作将释放步骤3申请的锁资源,步骤7操作成功。 
(9)用户A进行如下操作: 
set isolation to repeatable read; 
begin work; 
update test set time=”2” where name=”Julio”; 
说明: 
本次name字段没有索引,所以本次操作将采取顺序扫描方式;另外,由于设置了”repeatable read”读模式,所以test表的所有记录都将被锁住。 
(10)用户B进行如下操作: 
set lock mode to no wait; 
update test set time+”2” and code=”sam”; 
说明: 
本次操作失败。虽然本次操作通过索引定位记录,但是步骤9中用户A已经锁住(共享锁)test中表所有记录,而且用户B设置了”no wait”锁冲突方式,所以操作失败。 
(11)用户B进行如下操作: 
select * from test where code=”sam”; 
说明: 
本次操作成功。因为本次操作使用索引定位记录,而且使用”commited read”读方式对记录施加共享锁,与步骤9中申请的共享锁不冲突,所以操作成功。

第三章 
索引策略 
IDS采用B+树索引结构。 
1、索引的优点 
1)通过使用索引定位取代顺序扫描提高查询速度; 
2)提高数据排序速度; 
3)保证被索引字段的唯一性; 
4)当仅仅查询索引字段时,避免读取记录全部字段内容。 
2、索引建立原则 
(1)对连接(jion)字段建立索引 
对于连接操作,至少对连接表达式的一个字段建立索引,否则IDS要么在连接之前自动建立临时索引进行”sort merge join”或者”nested loop join”,要么顺序扫描数据表进行”hash join”。 
(2)对选择性过虑(selective filter)字段建立索引 
(3)对排序(order)字段建立索引 
(4)避免对高重复率(highly duplicate)的字段建立索引 
(5)利用组合索引(composite indexs)降低索引重复率 
(6)建立组合索引时,应该将重复率低的字段放在前面,重复率高的字段放在后面。 
(7)控制索引字段对比数据表字段不能过长 
(8)运用聚集索引(clustered index)提高查询速度 
聚集索引的建立将使被索引的表记录在物理存储上严格按聚集索引的顺序存放。也就是聚集索引记录与数据记录的存储顺序一致,查询时扫描的数据量较普通索引减少了。所以对于经常查询,很少增删的表可以充分利用聚集索引的优点提高查询速度。 
(9)数字字段的索引查找速度较其他类型字段(如字符串字段等)的索引快。 
(10)一个数据表的索引不应该过多。索引过多,数据插入、数据删除、数据修改速度一定程度上会影响。 
(11)利用“部分键查找”(partial key search)提高索引利用率。例如:建立在表tab上的一个索引idx(f1,f2,f3,f4),当对tab按照(f1,f2,f3,f4)或者按照(f1,f2,f3)或者按照(f1,f2)或者按照(f1)条件查询时,索引idx(f1,f2,f3,f4)都可以被利用上。

3、 并行建索引

第四章 
并行数据查询PDQ(parallel Data Qurey) 
1、PDQ技术 
Informix的PDQ技术将大量数据库操作分割成为多个并行操作任务,充分利用多处理器的并行处理能力,以比普通查询快若干倍的速度完成数据查询。 
Informix的PDQ技术主要包括一下并行操作: 
1)并行扫描(Parallel scans) 
2)并行连接(Parallel joins) 
3)并行排序(Parallel sorts) 
4)并行组合(Parallel groups) 
5)并行聚合(Parallel aggregates)

2、并行插入(Parallel insert) 
1)在Informix 7.0版本后,对特殊的数据插入操作可以并行执行,并行插入包括一下方式: 
(1)insert into tabname select … from … where …; 
使用这种方式,insert、select操作是冰心执行的。如果目的表、源表都进行了数据分片,而且Informix使用了多个CPU VP(virtual process),则insert 操作可以并行执行。 
(2)select … from …where … into temp tabname; 
使用这种方式,insert、select操作是并行执行的。而且临时表tabname将以round robin方式分片在DBSPACETEMP指定的多个临时数据空间(dbspaces)上。 
2)并行插入在一下情况将不被启动 
(1)数据插入的目的表使用了引用完整性控制(定义了主键或者外键)或者使用了”tigger”; 
(2)数据插入的目的表是网络上远程数据库的表; 
(3)数据插入的目的表中宝号BLOB字段; 
(4)数据插入的目的表中包含处于”filtering”状态的限制。(”filtering”状态指表上的限制”constrains”打开,违反”constrains”时记错误日志,但并不“回滚”) 
3、使用PDQ 
使用PDQ时,首先要申明所做的操作是PDQ操作,通过执行:set pdqpriority high可以打开PDQ开关。执行完以后,应关闭PDQ开关:set pdqpriority low;其次,为了更好的发挥PDQ技术,应该对操作的数据表进行数据分割;最后运用PDQ技术应该选择多CPU的机器。当使用如下操作时,将不能启动 PDQ: 
(1)查询使用了”cursor stablility”的隔离等级; 
(2)查询使用了update游标或者游标定义为”with hold”; 
(3)查询使用了嵌套子查询; 
(4)查询中使用了存储过程; 
(5)查询中不包含scan,join,sort,group,aggregate。 
4、PDQ监控 
使用onstat –g mgm可以监控PDQ使用情况。

第五章 
数据分片(fragmentation) 
Informix数据分片指把一个数据库表的数据分布在不同的数据空间上。数据分片技术主要适用于数据量比较大(50,000条记录以上)、访问频繁的数据表。

1、数据分片技术 
1)轮循(round robin)方式 
轮循方式数据分片将数据库表的数据均匀分布在指定的数据空间上。对于经常需要顺序扫描的数据表或经常装载的数据的数据表,可以考虑使用round robin分片策略,将数据均匀分布在多个位于不同硬盘上的数据空间(dbspaces)上。例如: 
create table satmxhz 
( 
 
)fragment by round robin in workdbs1,workdbs2,workdbs3;

2)表达式(expression)方式 
表达式方式数据分片将数据按照一定的条件分布在指定的数据空间上。对于经常按照一定的条件扫描,而且很少装载数据的数据表,可以考虑使用expression分片方式,将数据按照一定条件分布在多个位于不同的数据空间(dbspace)上。例如: 
create table acdb1 
( 
 
)fragment by expression 
fb1z1 in (“1”,”2”,”3”) in workdbs1, 
fb1z1 in (“4”,”5”,”6”) in workdbs2, 
remainder in workdbs3; 
使用表达式方式数据分片在进行条件查询时,Online可以忽略那些不满足条件的分片,从而降低了扫描数据量,提高了查询效率。

2、 数据分片的优点 
(1)并行扫描(parallel scans); 
如果使用了数据分片,并且打开了PDQ,那么对数据表的扫描将并行从各个fragmentation中读数据,查询速度将得到很大提高。 
(2)均衡I/O; 
如果数据分片使用的数据空间正好分布在多个独立物理硬盘上,则数据扫描将在多个硬盘上同时进行,减少了磁盘竞争,均衡了磁盘I/O。这对于OLTP交易非常有利。 
(3)高可靠性; 
通过设置忽略出错的单个数据分片,可以避免由于单个数据分片出错导致整个不能使用的情况。这对于大量的动态数据统计非常有利,如决策支持系统DSS(Decision Support System)中的数据统计。 
(4)降低备份、恢复数据粒度。 
由于数据备份、恢复可以在dbspace一级上进行,而数据分片驻留在dbspace上,所以数据备份、恢复可以在fragment上进行。

3、rowid问题 
IDS的rowid由4个字节构成: 
0 -- 07bit :记录在页面中的槽表号。 
08 -- 32bit :tbsapce中的逻辑页号。 
由于使用了数据分片,一个数据库表将跨越多个dbspace中的tbspace,所以rowid在一个表中不再是唯一的,而且作为应用程序也不应该直接操作rowid。鉴于以上情况,在使用Informix 7.0后,应该不再直接操作rowid。为了操作方便可以在数据库表中定义主关键字(primary key)。

第六章 
ESQL/C的使用 
1、prepare语句的使用 
在SQL中使用prepar语句后可以根据应用程序提供的不同的values来执行多遍,而语法分析却仅执行一遍。当一个SQL语句在同一应用程序中被重复执行多遍时,用prepare的方法可以大大提高性能和效率。Prepare语法: 
$prepare p_id from “insert into tabname (..) values (?…?)

2、插入游标(insert cursor)的使用 
插入游标中的put语句使用了insert buffer,从而可以将多条insert语句一次性地写入共享内存缓冲区中,因为减少了写缓冲区的I/O次数,故可提高性能。插入游标语法: 
$declare cursor_name cursor for insert into tabnem(…) values (…); 
 
$open cursor_name; 
 
$put cursor_name; 
 
或者 
$prepare insert_name from “insert into tabname(…) values (?…?); 
 
$declare cursor_name cursor for insert_name; 
 
$open cursor_name; 
 
$put cursor_name;

3、滚动游标(scroll cursor)的使用 
使用滚动游标的好处在于可以前后检索结构集中的记录,这对于需反复访问结果的应用很有用。但是当表很大,且经常进行幅度很大的记录检索时,会导致创建很大的临时表,效率低。建议使用时: 
1)定义滚动游标时可以选择尽可能少的游标或者可能少的字段,比如只选择表中的主关键字,然后再由此选出表中相应的记录; 
2)如果可以不用滚动游标,则应该避免使用; 
3)如果返回结果确信只有一条记录,则应该避免使用游标; 
4)应该避免游标的嵌套使用。 
滚动游标语法: 
$declare cursor_name scroll cursor for …; 
 
$open cursor_name; 
4、 改游标(update cursor)的使用 
$declare cursor_name cursor for … for update 
 
$update … where current of cursor_name;

5、 SQL交换区sqlca(sql communication area)的使用 
每当执行完一个SQL语句,Online都会将执行情况返回到sqlca这个结构中,其中包括一下信息: 
1)最近运行的SQL语句完成情况; 
2)有关性能的一些信息; 
3)对一些可能发生或者已经发生情况的警告; 
sqlca机构为: 
struct sqlca_s 
{ 
long sqlcode; 
char sqlerrm[72]; 
char sqlerrp[8]; 
long sqlerrd[6]; 
struct sqlcaw_s; 
{ 
char sqlwarn0; 
char sqlwarn1; 
char sqlwarn2; 
char sqlwarn3; 
char sqlwarn4; 
char sqlwarn5; 
char sqlwarn6; 
char sqlwarn7; 
}sqlwarn; 
}sqlca; 
当调用SQL出错时,往往凭sqlcode的返回码不能确定出错原因,还应该返回ISAM错误码sqlerrd[1]。

6、 存储过程(stored procedure)的使用 
存储过程是用户用Informix提供的SPL(stored procedure lauguage)语言,编制的一些数据库操作。可以用以下语法创建、使用存储过程: 
$create procedure p_name(…) 
 
end procedure 
 
$execute p_name; 
存储过程创建时,数据库会编译存储过程,产生数据库查询计划,并将其翻译成数据库文件存储在IDS数据库的系统表sysprocedures。存储过程的所有授权用户都可以调用该过程。具体调用时,IDS会从系统表sysprocedures中读出存储过程,转换成执行代码,运行它。对于经常被反复执行的一段SQL语句,若采用存储过程的方法,既可以减少程序的复杂度,而且应用和数据库之间的交互由一条SQL语句变为一个存储过程名,大大减少了交互数据量。其次因为可以提高一些系统性能。另外不同的应用程序可以共享一个存储过程,从而消除冗余代码。此外,在client/server环境中亦有利于代码维护;通过使用存储过程的安全等级,可以限制用户的一些非法操作,如禁止用户对数据库表的访问等。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11134849/viewspace-741610/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/11134849/viewspace-741610/

你可能感兴趣的:(IDS(Informix Dynamic Server)的基本概念总结)