Informix TRAIN 文档详解数据库
【简介】感谢网友“咕咕啾啾”参与投稿,小编在这里给大家带来Informix TRAIN 文档详解数据库(共8篇),希望大家喜欢!
篇1:SYBASE数据库日志详解
SYBASE公司是世界著名的数据库厂家,其关系数据库产品SYBASE SQL Server在中国大中型企事业单位中拥有大量的用户,笔者在多年的使用过程中,总结出SYBASE数据库管理和维护的一些经验,现拿出来与大家分享。 我们知道,SYBASE SQL Server用事务(Transaction)来跟踪所有数据库的变化。事务是SQL Server的工作单元。一个事务包含一条或多条作为整体执行的T-SQL语句。每个数据库都有自己的事务日志(Transaction Log),即系统表(Syslogs)。事务日志自动记录每个用户发出的每个事务。日志对于数据库的数据安全性、完整性至关重要,我们进行数据库开发和维护必须熟知日志的相关知识。
一、SYBASE SQL Server如何记录和读取日志信息
SYBASE SQL Server是先记Log的机制。每当用户执行将修改数据库的语句时,SQL Server就会自动地把变化写入日志。一条语句所产生的所有变化都被记录到日志后,它们就被写到数据页在缓冲区的拷贝里。该数据页保存在缓冲区中,直到别的数据页需要该内存时,该数据页才被写到磁盘上。若事务中的某条语句没能完成,SQL Server将回滚事务产生的所有变化。这样就保证了整个数据库系统的一致性和完整性。
二、日志设备
Log和数据库的Data一样,需要存放在数据库设备上,可以将Log和Data存放在同一设备上,也可以分开存放。一般来说,应该将一个数据库的Data和Log存放在不同的数据库设备上。这样做有如下好处:一是可以单独地备份Backup事务日志;二是防止数据库溢满;三是可以看到Log的空间使用情况。
所建Log设备的大小,没有十分精确的方法来确定。一般来说,对于新建的数据库,Log的大小应为数据库大小的30%左右。Log的大小还取决于数据库修改的频繁程度。如果数据库修改频繁,则Log的增长十分迅速。所以说Log空间大小依赖于用户是如何使用数据库的。此外,还有其它因素影响Log大小,我们应该根据实际操作情况估计Log大小,并间隔一段时间就对Log进行备份和清除。
三、日志的清除
随着数据库的使用,数据库的Log是不断增长的,必须在它占满空间之前将它们清除掉。清除Log有两种方法:
1.自动清除法
开放数据库选项 Trunc Log on Chkpt,使数据库系统每隔一段时间自动清除Log。此方法的优点是无须人工干预,由SQL Server自动执行,并且一般不会出现Log溢满的情况;缺点是只清除Log而不做备份,
2.手动清除法
执行命令“dump transaction”来清除Log。以下两条命令都可以清除日志:
dump transaction with truncate_only
dump transaction with no_log
通常删除事务日志中不活跃的部分可使用“dump transaction with trancate_only”命令,这条命令写进事务日志时,还要做必要的并发性检查。SYBASE提供“dump transaction with no_log”来处理某些非常紧迫的情况,使用这条命令有很大的危险性,SQL Server会弹出一条警告信息。为了尽量确保数据库的一致性,你应将它作为“最后一招”。
以上两种方法只是清除日志,而不做日志备份,若想备份日志,应执行“dump transaction database_name to dumpdevice”命令。
四、管理庞大的事务
有些操作会大批量地修改数据,如大量数据的修改(Update)、删除一个表的所有数据(Delete)、大量数据的插入(Insert),这样会使Log增长速度很快,有溢满的危险。下面笔者给大家介绍一下如何拆分大事务,以避免日志的溢满。
例如执行“update tab_a set col_a=0”命令时,若表tab_a很大,则此Update动作在未完成之前就可能使Log溢满,引起1105错误(Log Full),而且执行这种大的事务所产生的独占锁(Exclusive Table Lock),会阻止其他用户在执行Update操作期间修改这个表,这就有可能引起死锁。为避免这些情况发生,我们可以把这个大的事务分成几个小的事务,并执行“dump transaction”动作。
上例中的情况就可以分成两个或多个小的事务:
update tab_a set col_a=0 where col_b>x
go
dump transaction database_name with truncate_only
go
update tab_a set col_a=0 where col_b <=x
go
dump transaction database_name with truncate_only
go
这样,一个大的事务就被分成两个较小的事务。
按照上述方法可以根据需要任意拆分大的事务。若这个事务需要备份到介质上,则不用“with truncate_only”选项。若执行“dump transaction with truncate_only”命令,应该先执行“dump database”。以此类推,我们可以对表删除、表插入等大事务做相应的拆分。
篇2:Informix数据库配置详解数据库
1.配置概述 本次数据库配置将采用数据库系统、数据库日志和数据库应用系统数据分开进行配置,以达到数据库系统优化的目的, 2.营销系统数据库配置示例 2.1 规划数据库空间 根据配置的思想,将数据库系统分三个区。分别是: rootdbs:informix系统区,我们将
1.配置概述
本次数据库配置将采用数据库系统、数据库日志和数据库应用系统数据分开进行配置,以达到数据库系统优化的目的。
2.营销系统数据库配置示例
2.1 规划数据库空间
根据配置的思想,将数据库系统分三个区。分别是:
rootdbs: informix系统区,我们将一号机的e1_1dbs4分配给它,为了便于记忆我们将该区取个名为yxroot。
具体操作为:
# ln /dev/re1_1dbs4 /dev/yx_root
#chown informix:informix /dev/yx_root
#chmod 664 /dev/yx_root
logdbs: informix日志区,我们将一号机的e1_1dbs5分配给它,为了便于记忆我们将该区取个别名为yx_log。
具体操作为:
# ln /dev/re1_1dbs5 /dev/yx_log
#chown informix:informix /dev/yx_log
#chmod 664 /dev/yx_log
workdbs: informix数据区,我们将一号机的e1_1dbs0到e1_1dbs3分配给它,为了便于记忆我们将该区取个别名为yx_work。
具体操作为:
# ln /dev/re1_1dbs0 /dev/yx_dbs0
# ln /dev/re1_1dbs1 /dev/yx_dbs1
#chown informix:informix /dev/yx_dbs?
#chmod 664 /dev/yx_dbs?
2.2 Informix系统参数配置
informix系统参数配置文件由如下文件决定:
2.2.1 Informix 启动环境文件:start_yx 文件内容如下:
echo “start dbserver on yx”
INFORMIXDIR=/usr/informix
export INFORMIXDIR
TBCONFIG=tbconfig.yx
DBDATE=Y4MD/
PATH=$PATH:$INFORMIXDIR/bin:.
export PATH MAIL TBCONFIG
2.2.2 Informix 配置文件:$INFORMIXDIR/etc/tbconfig.yx
$ cd $INFORMIXDIR/etc
$ cp tbconfig.std tbconfig.yx
$ vi tbconfig.yx
修改相应参数:
ROOTPATH /dev/yx_root
ROOTSIZE 1000000
TAPEDEV /dev/null
PHYSFILE 100000
LOGSIZE 100000
LOGFILES 3
LOGSIZE 100000
MSGPATH /usr/informix/online_yx.log
CONSOLE /dev/console
SERVERNUM 0
DBSERVERNAME XXclic_yx
#注:XX:按各地市名称来取
#福州:fz 莆田:pt 泉州:qz 漳州:zz 龙岩:ly
#三明:sm 南平:np 宁德:nd
USERS 300
TRANSACTIONS 300
LOCKS 00
BUFFERS 20000
TBLSPACES 6000
LOGSMAX 60
2.2.3 Informix网络连接配置文件:$INFORMIXDIR/etc/sqlhosts.yx
该文件只有在C/S模式下和数据库联网才用到(略)
2.3 Informix初始化操作:
1. 启动系统环境:
以informix 用户登录
启动环境操作: # . ./start_yx
2. 初始化数据库系统区
操作:tbinit -i
3. 创建数据库日志和工作区
tbspaces Cc Cd yx_log Cp /dev/yx_log Co 0 Cs 870000
tbspaces Cc Cd yx_work Cp /dev/yx_dbs0 -o 0 Cs 2000000
tbspaces Ca yx_work Cp /dev/yx_dbs1 -o 0 Cs 2000000
4. 移动数据库系统区的日志到新的数据库日志区
a.在logdbs上生成逻辑日志,逻辑日志共取600M,每个日志100M,分6个,
操作如下:
$ tbmode Csy
以下命令重复执行共6次
$ tbparams Ca Cd yx_log
b.让新加的逻辑日志生效
tbtape Cs #作0级备份
c.迁移日志到新日志上
tbmode Cl
上述命令重复执行共3次
d.删除rootdbs上的逻辑日志
tbtape Cs #作0级备份
tbparams Cd Cl 1 -y
tbparams Cd Cl 2 -y
tbparams Cd Cl 3 Cy
e.迁移物理日志到logdbs上
tbparams Cp Cs 182000 Cd yx_log Cy
f.指定备份设备
修改tbconfig.yx文件,将以下参数该为:
TAPEDEV /dev/rct0
LTAPEDEV /dev/rct0
5. 上载数据到数据库的数据(工作)区
dbimport Cd yx_work rhdb
6. 构造营销系统数据库的自动起停操作
自动启动:编辑/etc/rc2.d/S99startdbs文件,加入以下行:
echo “start dbserver on yx”
DBDATE=Y4MD
TBCONFIG=tbconfig.yx
PATH=$PATH:$INFORMIXDIR/bin:.
export INFORMIXSERVER
export PATH MAIL TBCONFIG DBDATE
su informix -c “$INFORMIXDIR/bin/tbinit”
echo “start dbsever on yx is over”
自动停止:编辑/etc/shutdown.d/shut_dbs文件,写入以下行:
echo “shut dbserver on yx”
DBDATE=Y4MD
TBCONFIG=tbconfig.yx
PATH=$PATH:$INFORMIXDIR/bin:.
export INFORMIXSERVER
export PATH MAIL TBCONFIG DBDATE
su informix -c “$INFORMIXDIR/bin/tbmode -ky”
echo “shut dbsever on yx is over”
共2页: 1 [2] 下一页
原文转自:www.ltesting.net
篇3:SYBASE数据库日志详解数据库
我们知道,SYBASE SQL Server用事务(Transaction)来跟踪所有数据库的变化,事务是SQL Server的工作单元。一个事务包含一条或多条作为整体执行的T-SQL语句。每个数据库都有自己的事务日志(Transaction Log),即系统表(Syslogs)。事务日志自动记录每个用
我们知道,SYBASESQLServer用事务(Transaction)来跟踪所有数据库的变化。事务是SQL Server的工作单元。一个事务包含一条或多条作为整体执行的T-SQL语句。每个数据库都有自己的事务日志(Transaction Log),即系统表(Syslogs)。事务日志自动记录每个用户发出的每个事务。日志对于数据库的数据安全性、完整性至关重要,我们进行数据库开发和维护必须熟知日志的相关知识。
一、SYBASESQL Server如何记录和读取日志信息
SYBASE SQL Server是先记Log的机制。每当用户执行将修改数据库的语句时,SQL Server就会自动地把变化写入日志。一条语句所产生的所有变化都被记录到日志后,它们就被写到数据页在缓冲区的拷贝里。该数据页保存在缓冲区中,直到别的数据页需要该内存时,该数据页才被写到磁盘上。若事务中的某条语句没能完成,SQL Server将回滚事务产生的所有变化。这样就保证了整个数据库系统的一致性和完整性。
二、日志设备
Log和数据库的Data一样,需要存放在数据库设备上,可以将Log和Data存放在同一设备上,也可以分开存放。一般来说,应该将一个数据库的Data和Log存放在不同的数据库设备上。这样做有如下好处:一是可以单独地备份?Backup?事务日志;二是防止数据库溢满;三是可以看到Log的空间使用情况。
所建Log设备的大小,没有十分精确的方法来确定。一般来说,对于新建的数据库,Log的大小应为数据库大小的30%左右。Log的大小还取决于数据库修改的频繁程度。如果数据库修改频繁,则Log的增长十分迅速。所以说Log空间大小依赖于用户是如何使用数据库的。此外,还有其它因素影响Log大小,我们应该根据实际操作情况估计Log大小,并间隔一段时间就对Log进行备份和清除。
三、日志的清除
随着数据库的使用,数据库的Log是不断增长的,必须在它占满空间之前将它们清除掉。清除Log有两种方法:
1.自动清除法
开放数据库选项 Trunc Log on Chkpt,使数据库系统每隔一段时间自动清除Log。此方法的优点是无须人工干预,由SQL Server自动执行,并且一般不会出现Log溢满的情况;缺点是只清除Log而不做备份。
2.手动清除法
执行命令“dump transaction”来清除Log。以下两条命令都可以清除日志:
dump transaction with truncate_onlydump transaction with no_log
通常删除事务日志中不活跃的部分可使用“dump transaction with trancate_only”命令,这条命令写进事务日志时,还要做必要的并发性检查,
SYBASE提供“dump transaction with no_log”来处理某些非常紧迫的情况,使用这条命令有很大的危险性,SQL Server会弹出一条警告信息。为了尽量确保数据库的一致性,你应将它作为“最后一招”。
以上两种方法只是清除日志,而不做日志备份,若想备份日志,应执行“dump transaction database_name to dumpdevice”命令。
四、管理庞大的事务
有些操作会大批量地修改数据,如大量数据的修改(Update)、删除一个表的所有数据(Delete)、大量数据的插入(Insert),这样会使Log增长速度很快,有溢满的危险。下面笔者给大家介绍一下如何拆分大事务,以避免日志的溢满。
例如执行“update tab_a set col_a=0”命令时,若表tab_a很大,则此Update动作在未完成之前就可能使Log溢满,引起1105错误(Log Full),而且执行这种大的事务所产生的独占锁(Exclusive Table Lock),会阻止其他用户在执行Update操作期间修改这个表,这就有可能引起死锁。为避免这些情况发生,我们可以把这个大的事务分成几个小的事务,并执行“dump transaction”动作。
上例中的情况就可以分成两个或多个小的事务:
update tab_a set col_a=0 where col_b>xgo
dump transaction database_name with truncate_only
go
update tab_a set col_a=0 where col_b <=x
go
dump transaction database_name with truncate_only
go
这样,一个大的事务就被分成两个较小的事务。
按照上述方法可以根据需要任意拆分大的事务。若这个事务需要备份到介质上,则不用“with truncate_only”选项。若执行“dump transaction with truncate_only”命令,应该先执行“dump database”。以此类推,我们可以对表删除、表插入等大事务做相应的拆分。
(责任编辑:铭铭)原文转自:www.ltesting.net
篇4:Informix TRAIN 文档详解数据库
一、磁盘数据组织结构 在INFOR MI X-OnLine的磁盘数据组织结构中的最上层为逻辑概念上的 数据库 空间dbspace,每一个数据库空间都有一个或若干个物理单位数据存储块chunk组成,镜像数据存储块mirror保证当根数据存储块故障时,OnLine能够继续工作,每一个数据
一、磁盘数据组织结构
在INFORMIX-OnLine的磁盘数据组织结构中的最上层为逻辑概念上的数据库空间dbspace,每一个数据库空间都有一个或若干个物理单位数据存储块chunk组成,镜像数据存储块mirror保证当根数据存储块故障时,OnLine能够继续工作。每一个数据存储块都有若干个数据页page组成,为了提高输入和输出效率,若干个连续的数据页组成数据连续页extent。用户的数据库database和数据表table存储在缺省的或者指定的数据库空间中,数据表的逻辑概念上的存储空间数据表空间tblspace有一个或若个安数据连续页extent组成,数据记录row存放在数据页page中。
为更好的的支持多媒体应用,多媒体数据可以存放在二进制大对象数据页Blobpage中,若干个二进制大对象数据页在此二进制大对象空间Blobspace。 OnLine使用逻辑日志Logicallog、物理日志Physicallog来管理数据库日志操作。
1.数据存储块chunk
INFORMIX-OnLine的数据存放在物理上连续的数据存储块chunk中,数据存储块是OnLine数据存储的最大的物理单位。数据存储块可以有两种构造方法,其一是直接构造在系统的物理磁盘上,其二是构造在操作系统的文件或者卷上。
在第一种情况下,在操作系统上仅仅定义了这个(块)磁盘但没有格式化这个(块)磁盘,因此在这上面的所有数据操作都有OnLine来完成,操作系统对它不存在任何管理,数据空间在物理磁盘上连续,这种数据的存储空间称为原始空间rawspace。
而在第二种情况下,操作系统不仅定义了这个数据存储空间(文件),还管理这个数据存储空间(文件),数据文件操作时的内存缓冲、输入与输出。数据空间的建立受操作系统的制约,在物理存储上不连续。我们称这种数据存储空间为非原始空间cookedspace。
比较这两种数据的存储空间,原始空间在磁盘上连续,没有操作系统的缓存和制约,非原始空间在磁盘上不连续,存在着操作系统的缓存和操作系统的输入/输出的制约,因此在实际应用中,采用原始空间效率高于非原始空间,由于原始空间与系统设备有关,同时不同操作系统对设备的定义的不一致性,定义非原始空间比定义原始空间来得简单。我们将原始空间所对应的磁盘称原始设备rawdevice,而将非原始空间所对应的操作系统文件称操作系统文件cookedfile。
为了进一步提高数据库运行的效率,我们通常选用字符设备作为存放实际的原始设备,这样在我们输入/输出数据时,可以充分发挥系统的DMA能力。当我们使用原始设备时,可以在同一个原始设备上建立多个数据存储块。通过对数据存储块的参数OFFSET和SIZE的定义,其单位为KB,我们可以定义多个数据存储块在同一个磁盘或磁盘块上,参数OFFSET定义数据存储块的起始位置,参数SIZE定义数据存储块的大小,用户在设置参数OFFSET和SIZE时必须保证在物理磁盘上没有相互覆盖。
在原始设备/dev/rdsk/c0t1d1s0上建立三个数据存储块chunk1、chunk2和chunk3,它们的大小分别为50MB、30MB和50MB,由于chunk的SIZE单位为KB,因此chunk1、chunk2和chunk3的SIZE分别为50000、30000和50000。在通常情况下,第一个数据存储块chunk1的OFFSET为0,这样第二个数据存储块chunk2的OFFSET应为第一个数据存储块chunk1的SIZE,而第三个数据存储块chunk3的OFFSET则为第二个数据存储块chunk2的OFFSET加上第二个数据存储块chunk2的SIZE。为保证在两个数据存储块的相邻边界处不发生重叠,可以将后一个数据存储块的起始位置稍微挪后一点。如果采用操作系统文件作为数据存储空间时,一般不在一个文件中建立多个数据存储块。一个文件中建立多个数据存储块,操作系统对文件中数据的定位时间将更长。
不管是原始设备还是非原始设备,OnLine的概念是一致的。在实际应用中,可以一部分数据存储块用原始设备而另一部分用非原始设备,只是原始设备采用OnLine的管理的I/O机制,而非原始设备采用操作系统unix的I/O机制。
2.数据页page
INFORMIX-OnLine在数据存储块中以数据页page为单位来组织存放数据,并以数据页为单位来输入输出数据,它的大小与数据在共享内存中数据缓冲区相一致,所以OnLine的数据页的大小是不可以改变的。数据页是OnLine组织存放数据的最小的物理单位。
根据不同从操作系统,OnLine的数据页的大小是不同的。例如在SCO、AT&T、UNISYS和HP等操作系统平台上,每一个数据页的大小为2KB,而在IBM和SEQUENT等操作系统平台上,每一个数据页的大小则为4KB。同时数据在共享内存中的缓冲区的大小也是根据操作系统的不同而不同,其值与数据页的大小一致。
3.数据连续页extent
为提高数据操作的效率,OnLine将若干个在物理磁盘上连续的数据页组成一个数据连续页extent。当用户创建一个数据表时,OnLine以数据连续页为单位在数据存储块中分配一块连续的空间,当用户的数据写满了这个数据连续页后,OnLine将以数据连续页为单位在数据存储块中申请一块连续空间,以存放更多的用户数据。在缺省情况下,初始化时第一个数据连续页为8个数据页。
数据连续页不能跨越数据存储块,当OnLine需要申请较多的数据页构成数据连续页时,如果OnLine找不到如数的在物理设备上连续的数据页时,OnLine将放弃这些不够构成一个数据连续页的数据页,OnLine将去下一个数据存储块去申请如数的在物理设备上连续的数据页。因此在实际系统中,过小的数据存储块将不利于数据操作性能和数据存取效率。
4.数据库空间dbspace
在INFORMIX-OnLine的磁盘数据组织中,数据库空间dbspace处于一个比较上层的位置。数据库空间是数据库在逻辑概念上的存储空间,一个或若干个数据库空间组成OnLine数据实体。在物理磁盘上,每一个数据库空间总对应于一个或几个数据存储块,在这些与数据库空间对应的数据存储块中,一定有一个数据存储块是根数据存储块,而其它的则是后继数据存储块。从功能上来看,根数据存储块除了具有后继数据存储块能够存储用户数据外,它还具有管理本数据库空间的功能;从数据存储块的保留页来看,根数据存储块具有56个保留页,而后继数据存储块仅有3个保留页。当然不同版本的OnLine在主、后继数据存储块的保留页的数量可能不同,但是根数据存储块需要更多的保留页来保存本数据库空间的定义。
在OnLine初始化后有一个称为根数据库空间rootdbs的数据库空间,它是OnLine系统的第一个数据库空间。当建立根数据库空间时,它的根数据存储块将被建立,所有数据库的日志和所有的定义信息都必须存放在该数据存储块中,它比所有其它根数据存储块的保留页更多。由于数据库日志定义的需要,因此对根数据库空间的根数据存储块的定义尤其重要,关于如何正确地定义根数据库空间的根数据存储块将在后面详细介绍,
为了提高数据库系统运行的效率,INFORMIX新的动态服务器OnLineDynamicServer7.1中引入了临时数据库空间的概念。在没有临时数据库空间的系统中,临时数据将建立的缺省的根数据库空间中,由于临时数据操作需要频繁的增加、删除,会给根数据库空间的数据存储块中造成很多碎片,将导致数据库操作效率的降低;另外当数据库备份时,那些临时数据也一起作备份,从而增加了数据备份量,降低了数据备份的效率。引入临时数据库空间后,用户的临时数据或者数据操作的中间结果将被存放在临时数据库空间中,同时当数据备份时临时数据库空间将不再被备份。
5.数据存储块镜像mirror
为提高OnLine运行时的数据高可靠性,OnLine在数据存储上引入了数据存储块镜像的机制。OnLine数据存储的镜像是对数据存储块而言的,但是其定义是对数据库空间的。当一个数据库空间被定义为镜像时,它下面的所有数据存储块全部镜像;当一个数据库空间被定义成没有镜像的时候,它下面的所有数据存储块全部没有镜像。
当OnLine在运行时,一旦数据存储块所在的物理磁盘发生读写故障,对于没有数据库空间没有镜像的系统,OnLine将自动关闭,并等待恢复。而对于具有镜像的数据库空间,OnLine将把存在读写故障的数据存储块标识为Down,同时OnLine将继续运行,用户完全可以根据需要,在适当的时候,恢复存在读写故障的数据存储块所在的磁盘,然后重构继续。因此一个具有镜像的数据库空间,其运行时的可靠性将大大高于不具有镜像的数据库空间。
6.数据表空间tblspace
在逻辑上,数据库存放在数据库空间dbspace中,数据表存放在数据表空间tblspace中。数据库空间是由数据存储块组成,数据表存在于这些数据存储块中,数据表空间是由连续存放该数据表记录的数据连续页组成。
二、共享内存数据组织结构
OnLine能高效地执行联机事务处理的第二个机制是数据库服务器系统的共享内存。在一些不使用共享内存的数据管理系统中,管理进程只能在需要数据的时候,将该记录和索引的最新值读入该进程所占有的私用数据缓存中进行操作,由于频繁的磁盘I/O,使系统的运行效率降低,同时由于那些管理进程都各占一份数据缓存,使得系统内存的有效使用率降低。因此使用共享内存会有以下三方面的好处:
(1)数据缓存不再属于某个进程,所有的数据库进程均共享这块内存,降低了磁盘的I/O;
(2)所有数据库进程访问相同的访问,它们的值和索引在内存中只有一份拷贝,提高了内存的有效使用率;
(3)操作的相关记录被预读进共享内存中,由于内存的I/O效率极高,因而系统并发除了数据的能力得到提高。
随着OnLine功能和性能的不断提高,OnLine的共享内存也有所不同。尤其是INFORMIX的动态服务器OnLineDynamicServer(ODS)在其共享内存的结构上增加了两个功能模块。在OnLine5中,其共享内存仅有一个区域,驻留区Residentportion;动态服务器ODS7.1除了驻留区Residentportion外还增加了虚拟区Virtualportion和通讯区Communicationportion。
1、操作系统参数对数据库服务器共享内存的影响
操作系统的共享内存参数对数据库服务器的共享内存的定义和建立会产生极大的影响。对INFORMIX来说,数据库服务器的共享内存绝对不能超过操作系统共享内存定义的允许范围。一个OnLine动态服务器7.1的共享内存不能超过操作系统所定义的一个UNIX进程所允许访问共享内存的极大值,由于操作系统对共享内存的定义往往不能满足OnLine动态服务器7.1的需要,因此,数据库管理员通常需要在建立其数据库应用系统以前,首先调谐操作系统的共享内存参数。
对于OnLine动态服务器7.1来说,操作系统的参数对它们的影响,在共享内存锁资源管理方面和虚拟处理器对共享内存访问操作方面是不全部相同的。它们对操作系统参数的要求也是不一样的,因此需要数据库管理员根据产品来决定操作系统的参数,在决定这些操作系统的参数前,请先阅读产品说明文件。例如OnLine动态服务器7.1的$INFORMIXDIR/release/ONLINE_7.1,在这个文件中它向数据库管理员阐述该INFORMIX产品在该机器平台上对操作系统参数的要求。同一种产品在不同的平台上,对该平台操作系统参数的要求非常有可能是不一样的;在同一平台上,同一产品的不同版本对操作系统参数也很有可能是不同的。
2、处理器资源组织结构
OnLine动态服务器7.1采用多进程Multi-processes多线索Multi-treads的数据库服务器机制,将每一个服务器进程根据用户定义分解成若干个线索,每一个线索响应一个用户的设计访问的请求。INFORMIX将每一个进程称作一个虚拟处理器Virtualprocess。
在以前的多处理器系统中,往往将用户的应用程序和系统的处理器CPU对应起来,每一个处理器都分别处理一个用户的应用程序;当应用程序数量多于处理器数目时,应用程序为争夺处理器资源CPU,而引起应用程序在运行时间上的不平衡;同时当应用程序的数量少于处理器数目时,由于一些处理器资源得不到运用而空闲,导致处理器资源运用上的不平衡。一种比较好的方法是将处理器与应用所需要的处理器分离开来,然后由数据库系统来平衡这种需求。在INFORMIX动态服务器中,用户应用程序发出的数据操作请求被称作虚拟处理器的服务器进程所接收,然后OnLine均匀地将这些服务器进程分配到系统实际的处理器CPU上。这样就较好地解决了上面所提到的两种不平衡状态。
在ODS7.1中每一个数据库服务器进程都称作一个虚拟处理器Virtualprocess,简称VP。若干个相同功能的虚拟处理器组成一个虚拟处理器类VirtualprocessClass,简称VPClass,每一个VPClass都表示一种功能的虚拟处理器。OnLine一共有七种虚拟处理器,它们是:
处理器虚拟处理器CPUVP,响应所有用户和OnLine系统对CPU资源的操作和协调。
磁盘输入输出虚拟处理器DiskI/OVP,响应用户和OnLine系统的磁盘输入输出请求,磁盘输入输出处理器分三种,异步输入输出AsynchronousI/O、物理日志输入输出Physical-logI/O和逻辑日志输入输出Logical-logI/O。
网络通讯虚拟处理器NetworkVP,响应用户的网络联接的请求。ODS的网络虚拟处理器有三种,它们分别用于管理tli、soc和ipc三种网络通讯接口。
系统管理虚拟处理器AdminstrationVP,运行OnLine系统管理程序和一些专职程序。
光盘虚拟处理器OpticalVP,当用户运行OnLine/Optical时管理光盘系统的运转。
审计虚拟处理器AuditVP,当用户系统需要一定的运行时数据安全性的时候,审计虚拟处理器在后台帮助检查每一个用户操作的合法性。
杂项管理虚拟处理器MiscellaneousVP,用于管理所有以上虚拟处理器不作的工作。
共5页: 1 [2] [3] [4] [5] 下一页
原文转自:www.ltesting.net
篇5:Informix SQL 语句详解数据库
1. CREATE DATABASE database_name [WITH LOG IN “pathname”] 创建数据库, database_name:数据库名称。 “pathname”:事务处理日志文件。 创建一database_name.dbs目录,存取权限由GR ANT 设定,无日志文件就不能使用 BEGIN WORK等事务语句(可用START
1. CREATE DATABASE database_name [WITH LOG IN “pathname”] 创建数据库。
database_name:数据库名称。
“pathname”:事务处理日志文件。
创建一database_name.dbs目录,存取权限由GRANT设定,无日志文件就不能使用
BEGIN WORK等事务语句(可用START DATABASE语句来改变)。
可选定当前数据库的日志文件。
如:select dirpath form. systables where tabtype = “L”;
例:create databse customerdb with log in “/usr/john/log/customer.log”;
2. DATABASE databse-name [EXCLUSIVE] 选择数据库。
database_name:数据库名称。
EXCLUSIVE:独占状态。
存取当前目录和DBPATH中指定的目录下的数据库,事务中处理过程中不要使用此语句。
例:dtabase customerdb;
3. CLOSE DATABASE
关闭当前数据库。
database_name:数据库名称。
此语句之后,只有下列语句合法:
CREATE DATABASE; DATABASE; DROP DATABSE; ROLLFORWARD DATABASE;
删除数据库前必须使用此语句。
例:close database;
4. DROP DATABASE database_name 删除指定数据库。
database_name:数据库名称。
用户是DBA或所有表的拥有者;删除所有文件,但不包括数据库目录;不允许删除当前数据库(须先关闭当前数据库);事务中处理过程中不能使用此语句,通过ROLLBACK WORK 也不可将数据库恢复。
例:drop databse customerdb;
5. CREATE [TEMP] TABLE table-name (column_name datatype [NOT NULL], …) [IN “pathname”] 创建表或临时表。
table-name :表名称。
column_name:字段名称。
data-type:字段数据类型。
path-name:指定表的存放位置
TEMP用于指定建立临时表;表名要唯一,字段要唯一;有CONNECT权限的用户可建立临时表;创建的表缺省允许CONNECT用户存取,但不可以ALTER。
例:create table user
( c0 serial not null, c1 char (10),
c2 char(2),
c3 smallint,
c4 decimal(6,3),
c5 date
) in “usr/john/customer.dbs/user;
6. ALTER TABLE ALTER TABLE table-name
{ADD (newcol_name newcol_type [BEFORE oldcol_name], …) | DROP (oldcol_name, …) | MODIFY (oldcol_name newcol_type [NOT NULL], … )}, … 修改表结构。
table-name:表名称。
newcol_name:新字段名称
newcol_type:新字段类型
oldcol_name:老字段名称
可以使用单个或多个ADD子句、DROP子句、MODIFY子句,但某个字句失败,操作即中止;原字段是NULL,不允许MODIFY为NOT NULL,除非所有NULL字段中均非空,反之可以;ALTER使用者是表的拥有者或拥有DBA权限,或被授权;事务中处理过程中不要使用此语句,
例:alter table user
add ( c6 char(20) before c5);
7. RENAME TABLE oldname TO newname 修改表名。
oldname:原名称。
newname:新名称。
RENAME使用者是表的拥有者或拥有DBA权限,或被授权;事务中处理过程中不要使用此语句。
例:rename user to bbb;
8. DROP TABLE table-name 删除表。
table-name:表名称。
删除表意味着删除其中所有数据、各字段上的索引及对表的赋权、视图等;用户不能删除任何系统目录表;语句使用者是表拥有者或拥有DBA权限,事务中处理过程中不要使用此语句。
9. RENAME COLUMN table.oldcolumn, TO newcolumn 修改字段名。
table.oldcolumn:表名及原字段名称
newcolumn:新字段名称。
语句使用者是表的拥有者或拥有DBA权限或有ALTER权限的用户,事务中处理过程中不要使用此语句。
例:rename column user.c6 to c7;
10. CREATE VIEW view-name column-list CREATE VIEW view-name column-list AS select_statement [WITH CHECK OPTION] 创建视图。
view-name:视图名称。
column-list:字段列表。
select_statement:SELECT语句。
以下语句不使用视图:ALTER TABLE,DROP INDEX,ALTER INDEX,LOCK TABLE,CREATE INDEX, RENAME TABLE;视图将延用基表的字段名,对表达式等虚字段和多表间字段重名必须指明标识其字段名;若对视图中某些字段命名,则所有字段都必须命名;视图中数据类型延用基表中的数据类型,虚字段起诀于表达式;不能使用ORDER BY和UNION子句;对视图中所有的字段要有SELECT权限;事务中处理过程中使用此语句,即使事务回滚,视图也将建立,不能恢复。
例:create view v_user as select * from user where c1 = “B1”;
11. DROP VIEW view-name 删除视图。
view-name:视图名称。
用户可删除自己建立的视图;视图的后代视图也被删除;事务中处理中不要使用此语句。
例:drop view v_user;
12. CREATE INDEX CREATE [UNIQUE/DISTINCT] [CLUSTER] INDEX index_name ON table_name
([column_name ASC/DESC],…) 创建索引。
index_name:索引名称。
table_name:表名称。
column_name:字段名称。
UNIQUE/DISTINCT:唯一索引。
CLUSTER:使表的物理存放顺序按索引排列。
ASC/DESC:升序或降序,缺省升序。
语句执行时,将表的状态置为EXCLUSIVE;复合索引最多包含8个字段,所有字段长度和不得大于120字节;事务中处理过程中使用此语句,即使事务回滚,索引将建立,不能恢复。
例:create cluster index ix_user on user(c5);
共3页: 1 [2] [3] 下一页
原文转自:www.ltesting.net
篇6:详解SQL Server数据库索引
一、理解索引的结构
索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度,使用索引查找数据,无需对整表进行扫描,可以快速找到所需数据。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。
SQL Server 中数据存储的基本单位是页(Page)。数据库中的数据文件(.mdf 或 .ndf)分配的磁盘空间可以从逻辑上划分成页(从 0 到 n 连续编号)。磁盘 I/O 操作在页级执行。也就是说,SQL Server 每次读取或写入数据的最少数据单位是数据页。
下面我们先简单的了解一下索引的体系结构:
1. 聚集索引结构
在 SQL Server 中,索引是按 B 树结构进行组织的。
聚集索引单个分区中的结构:
--建立UserAddDate聚集索引
CREATE CLUSTERED INDEX [IX_UserAddDate] ON [ASPNet_zSurvey].[ZS_User]
(
[UserAddDate] ASC
)
聚集索引(Clustered Index)特点
聚集索引的叶节点就是实际的数据页
聚集索引中的排序顺序仅仅表示数据页链在逻辑上是有序的。而不是按照顺序物理的存储在磁盘上
行的物理位置和行在索引中的位置是相同的
每个表只能有一个聚集索引
聚集索引的平均大小大约为表大小的5%左右
2.非聚集索引结构
非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点:
1. 基础表的数据行不按非聚集键的顺序排序和存储。
2. 非聚集索引的叶层是由索引页而不是由数据页组成。
下图示意了单个分区中的非聚集索引结构:
包含列的索引
通过将包含列(称为非键列)添加到索引的叶级,可以扩展非聚集索引的功能。键列存储在非聚集索引的所有级别,而非键列仅存储在叶级别。
下面举个简单的例子来说明一下聚集索引和非聚集索引的区别:
我们有一本汉语字典,可以把它的正文本身看做是一个聚集索引,它是按照汉字拼音的开头字母排序的,不再需要查找其他目录。当遇到不认识的字时,需要结合“部首目录”和“检字表”, 先找到目录中的结果,然后再翻到您所需要的页码。通过这种方法查到的目录中字的排序并不是真正的正文的排序方法。把这种看做是一个非聚集索引。
另外,请注意每个表只能有一个聚集索引。
--建立UserAddDate非聚集索引
CREATE NONCLUSTERED INDEX [IX_UserAddDate] ON [ASPNet_zSurvey].[ZS_User]
(
[UserAddDate] ASC
)
非聚集索引 (Unclustered Index) 特点
非聚集索引的页,不是数据,而是指向数据页的页。
若未指定索引类型,则默认为非聚集索引
叶节点页的次序和表的物理存储次序不同
每个表最多可以有249个非聚集索引
在非聚集索引创建之前创建聚集索引(否则会引发索引重建)
二、选择建立哪种索引
1.何时创建聚集索引更能提高性能
Clustered Index会提高大多数table的性能,尤其是当它满足以下条件时:
独特, 狭窄, 持续增长的,最好是只向上增加,
例如:
•Identity
•Date, identity
•GUID (only when using newsequentialid function)
2.非聚集索引提高性能的方法
非聚集索引由于B树的节点不是具体数据页,有时候由于这个原因,会导致非聚集索引甚至不如表遍历来的快。但是,非聚集索引有个特性,如果你要查询的内容,在非聚集索引中以及被覆盖到了,则不需要继续到聚集索引,或者RID(heap结构中的行标识符)中去寻找数据了,这时候就可以很大的提高性能,这就是 覆盖面(Covering) 的问题。
由于聚集索引叶子节点就是具体数据,所以聚集索引的覆盖率是 100%, 通过提高覆盖面来提高性能的问题也就只有非聚集索引(Nonclustered Indexes)才存在。
当查询中所有的columns 都包括在index上时,我们说这个 index covers the query. Columns的顺序在此不重要(Select 时候的顺序不重要,但是Index 建立的顺序可得小心了)。
在 SQL Server 中,为了提高这种 Covering 带来的好处,甚至可以通过将非键列添加到非聚集索引的叶级别来扩展非聚集索引的功能。
补充:只有查询在具有高度选择性的情况下,非聚集索引才有优势。
三、使用聚集索引或非聚集索引的场景 (注:优先级依次为推荐,应,不应)
四、主键和聚集索引的比较
以下是一些大众点评网中测试使用的示例:
CHECKPOINT
DBCC DROPCLEANBUFFERS
SET STATISTICS IO ON
declare @d datetime
set @d=getdate()
SELECT * FROM ASPNet_zSurvey.ZS_User WHERE UserAddDate>'-06-01' AND UserAddDate<'2008-06-10'
select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())
--(45077 行受影响)
--表'ZS_User'。扫描计数1,逻辑读取1103 次,物理读取2 次,预读1090 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
--2543
CHECKPOINT
DBCC DROPCLEANBUFFERS
SET STATISTICS IO ON
declare @d datetime
set @d=getdate()
SELECT * FROM ASPNet_zSurvey.ZS_User WITH (INDEX=IX_UserAddDate) WHERE UserAddDate>'2008-06-01' AND UserAddDate<'2008-06-10'
select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())
--(45077 行受影响)
--表'ZS_User'。扫描计数1,逻辑读取45165 次,物理读取133 次,预读141 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
--3860
五、使用索引的代价
索引需要占用数据表以外的物理存储空间。
创建索引和维护索引要花费一定的时间。
当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速度。
篇7:Dedesql数据库类详解 二次开发
2.连接数据库,查询数据表 表“dede_test”我们已经创建完成了,接下来我们要连接数据库了,其实方法非常简单.我们在网站根目录中创建一个tes...
2.连接数据库,查询数据表
表“dede_test”我们已经创建完成了,接下来我们要连接数据库了,其实方法非常简单.我们在网站根目录中创建一个test.php的文件,这个文件最好也用gbk的编码,可以用专门的编辑器来创建文件.
连接数据库最简单的方法就是引入include文件夹下面的common.inc.php文件,编辑php代码:
写入以下内容:
test.php
-------------------------------
require_once (dirname(__FILE__) . “/include/common.inc.php”);
print_r($dsql);
?>
--------------------------------
上面代码就是将一个$dsql类输出,我们再执行下这个文件(注dedebbs.com只是在本地做了个解析,其实就是localhost),我们查看源代码,看到下面的内容(图4):
(图4)
以下为引用的内容:
DedeSql Object
(
[linkID] => Resource id #6
[dbHost] => localhost
[dbUser] => root
[dbPwd] => 123456
[dbName] => dedebbs
[dbPrefix] => dede_
[result] => Array
(
[me] => 0
)
[queryString] =>
[parameters] => Array
(
)
[isClose] =>
[safeCheck] => 1
)
这个就说明我们已经成功连接数据库了,[dbHost],[dbUser]...这些都是数据库的相关信息,也就是我们保存在配置文件中的datacommon.inc.php内容,引入数据库类的时候,默认就被创建了$dsql或者$db,所以直接引入配置文件就可以了.
接下来我们来做一个简单的查询操作,接着上面的代码我们继续写
test.php
以下为引用的内容:
-------------------------------
require_once (dirname(__FILE__) . “/include/common.inc.php”);
if($dsql->IsTable('dede_test')){
//如果存在dede_test表
//-------------------
//| 查询一条记录 |
//| GetOne() |
//-------------------
// ↓
$row = $dsql->GetOne(“SELECT * FROM dede_test WHERE id = 3”);
print_r($row);
}
?>
--------------------------------
这里我们用了$dsql类的2个方法,IsTable()以及GetOne(),IsTable先来判断这个表是否存在,如果存在我们就继续执行,他返回的是一个bool值,如果存在为true否则就为false.
接下来判断如果有这个表存在,则我们就执行查询单条记录的这个过程,即GetOne,通过帮助文档可以知道:$arr = $db->GetOne($sql);也就是说查询的sql语句会传送回来一个数组.我们运行test.php看下运行结果:
Array
(
[id] => 3
[name] => 第三个喽
)
这个说明我们查询dede_test这个表id为3的数据成功了,返回了一个$row数组,其中就存放了字段的值.
当然我们可以用echo $row['name'];或者$row['id']来输出我们查询出来的结果
Tip:其实我们可以深入的研究下dedesql.class.php这个类,258行就有这个方法:
以下为引用的内容:
//执行一个SQL语句,返回前一条记录或仅返回一条记录
function GetOne($sql='',$acctype=MYSQL_ASSOC)
{
global $dsql;
if($dsql->isClose)
{
$this->Open(false);
$dsql->isClose = false;
}
if(!empty($sql))
{
if(!eregi(“limit”,$sql)) $this->SetQuery(eregi_replace(“[,;]$”,'',trim($sql)).“ limit 0,1;”);//这里用正则看看limit是否存在,如果不存在的话就自动加上limit 0,1这个内容,关于limit的介绍可以去看看SQL关于这个的介绍
else $this->SetQuery($sql);
}
$this->Execute(“one”);
$arr = $this->GetArray(“one”,$acctype);
if(!is_array($arr))
{
return '';
}
else
{
@mysql_free_result($this->result[“one”]); return($arr);//清空资源,返回这个数组
}
}
厚诚集智 成长无限 企业大学网 www.51hlht.com
篇8:Dedesql数据库类详解 二次开发
3.深入查询,继续研究SELECT 刚才讲了查询一条记录,其实这个查询一条记录可以理解为我们内容页查询一篇文章,只是获取单条记录并将内容显...
3.深入查询,继续研究SELECT
刚才讲了查询一条记录,其实这个查询一条记录可以理解为我们内容页查询一篇文章,只是获取单条记录并将内容显示出来,但往往我们经常遇到的是查询列表,及{dede:arclist/}或者{dede:list/},查询列表的话涉及到查询多条记录.
继续修改代码:
test.php
以下为引用的内容:
-------------------------------
require_once (dirname(__FILE__) . “/include/common.inc.php”);
if($dsql->IsTable('dede_test')){
//如果存在dede_test表
//-------------------
//| 查询一条记录 |
//| GetOne() |
//-------------------
// ↓
$row = $dsql->GetOne(“SELECT * FROM dede_test WHERE id = 3”);
echo “查询id=3的记录:
显示结果:”;
print_r($row);
//-------------------
//| 查询多条记录 |
//| Execute() |
//-------------------
// ↓
echo “
查询dede_test表中的所有记录:显示结果:
”;
$sql = “SELECT * FROM dede_test”;
$dsql->Execute('me',$sql);
while($arr = $dsql->GetArray('me'))
{
echo “id = {$arr['id']} ,name = {$arr['name']}
”;
}
}
?>
--------------------------------
我们运行test.php看到显示以下的内容:
查询dede_test表中的所有记录:
显示结果:
id = 1 ,name = 测试名字1
id = 2 ,name = 这是第二个
id = 3 ,name = 第三个喽
id = 4 ,name = 第四个
这个说明我们已经成功将表dede_test中的数据输出,当然主要是执行了那个“SELECT * FROM dede_test”,这是一个最简单的sql查询语句,当然也能够用到order by这些排序或者条件去查询,详细可以参考sql相关内容.
同时这里需要说明的是这里除了用$dsql->GetArray('me')来获取内容到数组,还可以用$dsql->GetObject(“me”)获取内容到对象,不过调用方法有些不同:
主要这里通过$dbobj->fieldname来调用查询出来的数据
while($dbobj = $dsql->GetObject('me'))
{
echo “id = {$dbobj->id} ,name = {$dbobj->name}
”;
}
tips:这里查询完了其实还可以用$dsql->GetTotalRow(“me”)来获取下查询出来的总数.
4.插入删除,也要用到SQL
上面我们介绍了如何用dsql来查询数据,主要有获取单条记录和获取多条记录2种,接下来我们来了解下使用dsql其他特性来为我们的test.php加入添加内容和删除内容的功能.
先来了解下插入数据库的操作,我们先做一个表单,这个表单用于提交数据name的.表单代码如下:
用于提交数据的表单:
名称:
厚诚集智 成长无限 企业大学网 www.51hlht.com