- 論壇徽章:
- 0
|
IDS的培訓(xùn)文檔!對(duì)IDS系統(tǒng)體系結(jié)果講的簡(jiǎn)潔明了,挺好!
--------------------------------------------------------------
第一章
Informix動(dòng)態(tài)可伸縮體系結(jié)構(gòu)DSA
(Dynamic Scalability Architecture)
一、關(guān)系型數(shù)據(jù)庫(kù)(Relational Database)系統(tǒng)體系結(jié)構(gòu)
目前比較流行的商用關(guān)系型數(shù)據(jù)庫(kù)多采用一下三種體系結(jié)構(gòu):
1、一請(qǐng)求一服務(wù)體系結(jié)構(gòu)
采用對(duì)于每一數(shù)據(jù)庫(kù)服務(wù)請(qǐng)求,數(shù)據(jù)庫(kù)系統(tǒng)將為之分配一個(gè)數(shù)據(jù)庫(kù)服務(wù)進(jìn)程服務(wù)的方式。
優(yōu)點(diǎn):可以充分隔離不同用戶的數(shù)據(jù)庫(kù)服務(wù),并且可以比較容易發(fā)揮采用SMP體系結(jié)構(gòu)的機(jī)器的資源。
缺點(diǎn):系統(tǒng)內(nèi)存資源、CPU資源消耗大;由于使用操作系統(tǒng)的進(jìn)程調(diào)度,系統(tǒng)運(yùn)行效率不高。
2、多線索體系結(jié)構(gòu)
優(yōu)點(diǎn):不需要頻繁的操作系統(tǒng)的進(jìn)程切換,節(jié)約內(nèi)存、CPU資源;系統(tǒng)并行運(yùn)行程度高,運(yùn)行效率高。
缺點(diǎn):系統(tǒng)比較脆弱,一個(gè)線索的誤操作,可能導(dǎo)致系統(tǒng)癱瘓;數(shù)據(jù)庫(kù)自己的線索切換較操作系統(tǒng)的切換簡(jiǎn)單;大數(shù)據(jù)量的操作可能引起系統(tǒng)資源的不均衡分布。
3、混合體系結(jié)構(gòu)
該系統(tǒng)由(1)多線索的網(wǎng)絡(luò)監(jiān)聽(tīng)器(2)任務(wù)分發(fā)器,包括請(qǐng)求/響應(yīng)隊(duì)列(3)可重用數(shù)據(jù)庫(kù)服務(wù)器組成。
優(yōu)點(diǎn):任務(wù)處理采用并行和排隊(duì)的方式,系統(tǒng)運(yùn)行效率高。
缺點(diǎn):負(fù)載均衡較簡(jiǎn)單。
二、IDS系統(tǒng)組成
IDS(Informix Dynamic Server)數(shù)據(jù)庫(kù)系統(tǒng)由一下部分組成:
1、共享內(nèi)存部分
共享內(nèi)存部分包括:長(zhǎng)駐內(nèi)存部分、虛擬內(nèi)存部分、消息區(qū)。
(1)長(zhǎng)駐內(nèi)存部分主要是用于磁盤(pán)數(shù)據(jù)在內(nèi)存的緩沖、系統(tǒng)數(shù)據(jù)等等(bufffers,physical/logical buffers,LRUs,chunks,dbsapces,users,locks…)。
(2)虛擬內(nèi)存部分主要用于VP的管理信息和緩沖區(qū)。(global pool,dictionary pools,procedure pools,sort pools,session pools,big buffer pools,MT pools)。虛擬內(nèi)存部分在使用過(guò)程中可以動(dòng)態(tài)增長(zhǎng),增長(zhǎng)大小在配置文件中定義。
(3)消息區(qū)主要用于應(yīng)用(client)和數(shù)據(jù)庫(kù)引擎(server)之間的信息交換。
2、磁盤(pán)數(shù)據(jù)空間部分
3、數(shù)據(jù)庫(kù)引擎-虛擬處理器VP(Virtual Processors)
三、IDS多線索體系結(jié)構(gòu)
Online7.0改變了Online5.0中一對(duì)一的客戶/服務(wù)器模式:由原來(lái)的一個(gè)數(shù)據(jù)庫(kù)請(qǐng)求啟動(dòng)一sqplexec數(shù)據(jù)庫(kù)引擎服務(wù)的Client/Server方式轉(zhuǎn)變?yōu)閷?duì)于所有數(shù)據(jù)庫(kù)請(qǐng)求由多個(gè)數(shù)量固定(除非動(dòng)態(tài)調(diào)整)的數(shù)據(jù)庫(kù)引擎(即VP虛擬處理器)服務(wù)的方式。OnLine7.0把數(shù)據(jù)庫(kù)引擎按功能劃分為多個(gè)VP,這些VP是長(zhǎng)駐內(nèi)存的oninit進(jìn)程。對(duì)于每一個(gè)數(shù)據(jù)庫(kù)服務(wù)請(qǐng)求都將被分割成多個(gè)可并行的線索,由不同VP并行服務(wù)。線索(thread)可以定義為一段順序執(zhí)行的程序。虛擬處理器VP可以定義為完成一定義數(shù)據(jù)庫(kù)服務(wù)功能的數(shù)據(jù)庫(kù)進(jìn)程。VP包括一下類(lèi)型:CPU,PIO(負(fù)責(zé)寫(xiě)物理日志),LIO(負(fù)責(zé)寫(xiě)邏輯日志),AIO(負(fù)責(zé)磁盤(pán)I/O)等等。線索運(yùn)行在VP上,線索的調(diào)度由CPU VP完成。從這一點(diǎn)來(lái)看,VP類(lèi)似于硬件上的CPU,線索類(lèi)似與運(yùn)行其上的進(jìn)程。多線索體系結(jié)構(gòu)的優(yōu)點(diǎn):
(1)fan-in:對(duì)于多個(gè)應(yīng)用請(qǐng)求,數(shù)據(jù)庫(kù)只用一定數(shù)量的VP服務(wù),并可以根據(jù)需要?jiǎng)討B(tài)調(diào)整;
(2)fan-out:多個(gè)數(shù)據(jù)庫(kù)VP服務(wù)一個(gè)應(yīng)用請(qǐng)求;
(3)數(shù)據(jù)庫(kù)內(nèi)部的線索切換避操作系統(tǒng)的進(jìn)程切換速度快、效率高;
(4)多線索體系結(jié)構(gòu)更適合于多CPU的體系結(jié)構(gòu),如:affinity特性。
四、IDS客戶/服務(wù)器連接方式
1、 IDS的客戶/服務(wù)器連接方式可采用一下方式:
(1)共享內(nèi)存連接方式(onipcshm)
(2)管道連接方式(onipcstr)
(3)網(wǎng)絡(luò)連接方式(基于TCP/IP協(xié)議,包括ontlitcp,onsoctcp或者IPX/SPX協(xié)議,ontlispx)
基于TCP/IP網(wǎng)絡(luò)協(xié)議的應(yīng)用接口可以使用SOC(Socket)或者TLI(Transport Layer Interface)。采用網(wǎng)絡(luò)連接方式的客戶端與服務(wù)器端必須使用相同的網(wǎng)絡(luò)通訊協(xié)議(TCP/IP協(xié)議或者IPX/SPX協(xié)議),但是客戶端使用socker接口,而服務(wù)器端使用tli接口。
2、基于共享內(nèi)存方式的客戶服務(wù)器連接
3、基于TCP/IP協(xié)議的客戶服務(wù)器連接
(1)在客戶端和服務(wù)器端的/etc/hosts文件中指定連接方式。
(2)在客戶端和服務(wù)器端的/etc/services文件中指定通訊端口和網(wǎng)絡(luò)協(xié)議。
(3)在客戶端和服務(wù)器端的$INFORMIXSQLHOSTS文件中指定如何訪問(wèn)服務(wù)器,包括服務(wù)器名稱(chēng)、服務(wù)器網(wǎng)絡(luò)地址、服務(wù)器網(wǎng)絡(luò)訪問(wèn)方式(協(xié)議和端口號(hào))。
(4)檢查網(wǎng)絡(luò)系統(tǒng)安全文件,包括/etc/hosts.equive、$HOME/.rhosts文件。
(5)在客戶端和服務(wù)器端設(shè)置環(huán)境變量,包括INFORMIXSERVER,INFORMIXSQLHOSTS。
五、IDS磁盤(pán)數(shù)據(jù)結(jié)構(gòu)
1、數(shù)據(jù)存儲(chǔ)概念
(1)page
page是OnLine的最基本數(shù)據(jù)存儲(chǔ)單位。OnLine的數(shù)據(jù)頁(yè)面包含一下內(nèi)容:
(1)24個(gè)字節(jié)的頁(yè)頭(包含4個(gè)字節(jié)的時(shí)間戳(timestamp))。
(2)數(shù)據(jù)區(qū)
(3)槽表(slot table)
每4個(gè)字節(jié)。前2個(gè)字節(jié)存放記錄在頁(yè)面的偏移量,后2個(gè)字節(jié)存放該記錄的大小。一個(gè)頁(yè)面中的槽表個(gè)數(shù)最多不超過(guò)255,所以一個(gè)數(shù)據(jù)頁(yè)面最多存放255個(gè)記錄。
(4)時(shí)間戳。
(2)extent
extent是多個(gè)物理連續(xù)page(最多4個(gè))的組合。數(shù)據(jù)庫(kù)表的存儲(chǔ)空間分配是以extent為單位的。
(3)tbspace
tbspace是extent的邏輯組合。Tbspace由分配給一個(gè)表的所有extent組成。一個(gè)tbspace只可能在一個(gè)dbspace中,但可能跨越多個(gè)chunk。
(4)chunk
chunk是分配給OnLine的一塊物理存儲(chǔ)空間,可以是unix文件,也可以是原始設(shè)備。
(5)dbspace、blobspace
dbspace是chunk的邏輯組合。數(shù)據(jù)庫(kù)管理員可以為dbspace創(chuàng)建、增加chunk、從而增加數(shù)據(jù)庫(kù)的存儲(chǔ)空間。創(chuàng)建dbspace時(shí)必須首選指定它的primary chunk。
2、日志(log)
數(shù)據(jù)庫(kù)日志是用于維護(hù)數(shù)據(jù)庫(kù)數(shù)據(jù)一致性的手段。IDS的日志分為物理日志(physical log)和邏輯日志(logical log)。物理日志用于維護(hù)數(shù)據(jù)庫(kù)的物理一致性,在每次修改數(shù)據(jù)之前,該數(shù)據(jù)所在的數(shù)據(jù)頁(yè)面都將存儲(chǔ)在物理日志中,所以物理日志也稱(chēng)為“前鏡像”(before images)。邏輯日志用于維護(hù)數(shù)據(jù)庫(kù)的邏輯一致性,在每次變動(dòng)數(shù)據(jù)庫(kù)時(shí),所有變動(dòng)情況都將記錄在邏輯日志中。物理日志在每次checkpoint之后將被自動(dòng)清空;邏輯日志必需是已經(jīng)備份,而且日志中包含的事務(wù)都已提交,并且不是最后一個(gè)日志文件才能被釋放。長(zhǎng)事務(wù)是指那些尚未結(jié)束,但數(shù)據(jù)庫(kù)邏輯日志文件已經(jīng)被事務(wù)日志記錄充滿的事務(wù)。這樣一來(lái)邏輯日志文件既不能被釋放重用,同時(shí)事務(wù)日志記錄也寫(xiě)不進(jìn)邏輯日志文件。這種情況下,IDS會(huì)阻塞數(shù)據(jù)庫(kù)請(qǐng)求,同時(shí)“回滾”長(zhǎng)事務(wù)。
六、IDS的容錯(cuò)處理
1、checkpoint
checkpint是IDS的一個(gè)重要系統(tǒng)功能。IDS利用checkpoint來(lái)保證共享內(nèi)存數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)與物理磁盤(pán)上的數(shù)據(jù)保持一致。它包括一下步驟:
(1)掛起臨界區(qū);
(2)刷新共享內(nèi)存中的物理日志緩沖到物理磁盤(pán)上的物理日志文件;
(3)刷新共享內(nèi)存緩沖區(qū)中發(fā)生修改的頁(yè)面到物理磁盤(pán)頁(yè)面上;
(4)寫(xiě)checkpoint記錄到邏輯日志文件和系統(tǒng)保留頁(yè)中;
(5)邏輯清空物理日志文件;
(6)刷新邏輯日志緩沖區(qū)到物理磁盤(pán)的邏輯日志文件中。
注意:IDS在刷新內(nèi)存中的頁(yè)面到物理磁盤(pán)之前,必須先將物理日志緩沖區(qū)的數(shù)據(jù)刷新到硬盤(pán)上的物理日志文件中。
2、fast recovery
IDS利用fast recovery功能來(lái)保證數(shù)據(jù)庫(kù)每次重起時(shí)快速恢復(fù)到數(shù)據(jù)庫(kù)shutdown時(shí)的一致性狀態(tài)。
它包含一下步驟:
(1)恢復(fù)物理日志文件中的數(shù)據(jù)到共享內(nèi)存的緩沖區(qū)和磁盤(pán)的物理頁(yè)面上;
(2)在邏輯日志文件中定位系統(tǒng)最后一個(gè)一致點(diǎn)-checkpoint點(diǎn);
(3)根據(jù)系統(tǒng)最后的一致點(diǎn)以后的邏輯日志記錄“回滾”(rollback)尚未提交的事務(wù)和“取消”(undo)已經(jīng)提交的事務(wù)。
3、IDS數(shù)據(jù)緩沖技術(shù)
IDS對(duì)數(shù)據(jù)庫(kù)中的操作都是通過(guò)對(duì)共享內(nèi)存數(shù)據(jù)緩沖區(qū)中數(shù)據(jù)的操作來(lái)完成的。例如一個(gè)修改數(shù)據(jù)庫(kù)記錄的操作
…
Begin work;
Update tab1 set fld1=”” where fld2=?;
Commit work;
…
IDS處理如下:
(1)客戶端連接到IDS后(connect…,database…),IDS為這個(gè)請(qǐng)求啟動(dòng)一個(gè)sqlexec任務(wù)進(jìn)行服務(wù)。
(2)sqlexec在對(duì)SQL語(yǔ)句進(jìn)行語(yǔ)法分析后,產(chǎn)生執(zhí)行計(jì)劃。
(3)sqlexec在logical log buffer中寫(xiě)入事務(wù)開(kāi)始記錄。
(4)sqlexec將請(qǐng)求讀取某個(gè)chunk中的某個(gè)數(shù)據(jù)頁(yè)面,并申請(qǐng)相應(yīng)鎖資源。
(5)IDS首選在內(nèi)存緩沖區(qū)的LRU隊(duì)列中查找該數(shù)據(jù)頁(yè)面是否在緩沖區(qū)中。
(6)如果不在緩沖區(qū)中,IDS將在FLRU隊(duì)列中查找空閑頁(yè)面,如果沒(méi)有,IDS將啟動(dòng)一個(gè)Forground Write來(lái)申請(qǐng)一個(gè)空閑緩沖區(qū)頁(yè)面。IDS申請(qǐng)將該數(shù)據(jù)頁(yè)面從磁盤(pán)上讀入到緩沖區(qū)中。在修改數(shù)據(jù)前,IDS將該頁(yè)面寫(xiě)入物理日志緩沖區(qū)中。然后,進(jìn)行數(shù)據(jù)修改。接下來(lái)執(zhí)行步驟(8)。
(7)如果在緩沖區(qū)中,并且在FLRU隊(duì)列中,IDS將該頁(yè)面寫(xiě)入物理日志緩沖區(qū)中,并進(jìn)行數(shù)據(jù)修改。如果在MLRU隊(duì)列中,IDS將直接進(jìn)行數(shù)據(jù)修改。
(8)IDS向邏輯日志緩沖區(qū)中寫(xiě)入修改操作的邏輯日志記錄。
(9)IDS釋放該事務(wù)申請(qǐng)的所有鎖資源,并向邏輯日志緩沖區(qū)中寫(xiě)入日志結(jié)束記錄。
七、IDS監(jiān)控
1、IDS狀態(tài)
(1)off-line狀態(tài)
(2)quiescent狀態(tài)
(3)online狀態(tài)
(4)shutdown狀態(tài)
(5)recovery狀態(tài)
2、系統(tǒng)阻塞原因
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、監(jiān)控工具。
用戶可以使用SMI(System Monitoring Interface)、onstat工具、oncheck工具完成對(duì)IDS的監(jiān)控。
1)使用系統(tǒng)監(jiān)控界面SMI
系統(tǒng)監(jiān)控界面采用只讀方式直接訪問(wèn)DSA的管理信息。
2)使用onstat監(jiān)控工具
(1)監(jiān)控?cái)?shù)據(jù)庫(kù)日志文件online.log:onstat -m
(2)監(jiān)控?cái)?shù)據(jù)庫(kù)系統(tǒng)共享內(nèi)存使用情況:onstat –g seg
(3)監(jiān)控?cái)?shù)據(jù)庫(kù)系統(tǒng)邏輯日志使用情況:onstat –l
(4)監(jiān)控?cái)?shù)據(jù)庫(kù)系統(tǒng)chunk使用情況:onstat –d
(5)監(jiān)控?cái)?shù)據(jù)庫(kù)系統(tǒng)在線session情況:onstat –g ses
(6)監(jiān)控?cái)?shù)據(jù)庫(kù)系統(tǒng)某個(gè)在線session情況:onstat –g ses sessid
(7)監(jiān)控?cái)?shù)據(jù)庫(kù)系統(tǒng)在線userthread情況:onstat –u
(8)監(jiān)控?cái)?shù)據(jù)庫(kù)系統(tǒng)鎖資源使用情況:onstat –k
(9)監(jiān)控?cái)?shù)據(jù)庫(kù)系統(tǒng)緩沖區(qū)刷新操作情況:onstat –F
(10)監(jiān)控?cái)?shù)據(jù)庫(kù)系統(tǒng)LRU隊(duì)列使用情況:onstat –R
(11)監(jiān)控?cái)?shù)據(jù)庫(kù)系統(tǒng)對(duì)所有chunk對(duì)協(xié)操作情況:onstat –g iof
(12)監(jiān)控?cái)?shù)據(jù)庫(kù)系統(tǒng)在線thread情況:onstat –g ath
(13)監(jiān)控?cái)?shù)據(jù)庫(kù)系統(tǒng)在線VPs情況:onstat –g glo
(14)監(jiān)控?cái)?shù)據(jù)庫(kù)系統(tǒng)使用效率情況:onstat –p
(15)監(jiān)控?cái)?shù)據(jù)庫(kù)系統(tǒng)PDQ使用情況:onsat –g mgm
(16)監(jiān)控?cái)?shù)據(jù)庫(kù)系統(tǒng)就緒隊(duì)列(ready queue)情況:onstat –g rea
(17)監(jiān)控?cái)?shù)據(jù)庫(kù)系統(tǒng)等待隊(duì)列(wait queue)情況:onstat –g wai
(18)監(jiān)控?cái)?shù)據(jù)庫(kù)系統(tǒng)休息隊(duì)列(sleep queue)情況:onstat –g sle
(19)監(jiān)控?cái)?shù)據(jù)庫(kù)系統(tǒng)活動(dòng)事務(wù)情況:onstat –X
第二章
并發(fā)控制
并發(fā)是指多個(gè)用戶在同一個(gè)時(shí)間操作相同數(shù)據(jù)。由于并發(fā)操作就帶來(lái)了數(shù)據(jù)一致性得問(wèn)題。IDS是通過(guò)鎖(lock)技術(shù)來(lái)保證并發(fā)數(shù)據(jù)得一致性的。
1、鎖的類(lèi)型
1)共享鎖(shared lock)
共享鎖可以防止其他用戶修改被鎖住的目標(biāo),但多個(gè)用戶對(duì)同一目標(biāo)可以實(shí)施加共享鎖。
2)排它鎖(exclusive lock)
排它鎖鎖住的對(duì)象將謝絕所有其他用戶的訪問(wèn)。
3)提升鎖((promotable lock/update lock)
提升鎖是用戶在使用update游標(biāo)時(shí)使用的鎖。提升鎖在數(shù)據(jù)修改之前是一個(gè)共享鎖,當(dāng)數(shù)據(jù)修改時(shí),共享鎖提升為一個(gè)排它鎖。下面是一張鎖沖突表:
A
---------------------------------------------------------------
S X U none
B S y n y y
X n n n y
U y n n y
-------------------
說(shuō)明:S:共享鎖 X:排它鎖 U:提升鎖
A:持有鎖的用戶 B:申請(qǐng)鎖的用戶
y:鎖申請(qǐng)成功 n:鎖申請(qǐng)失敗
2、鎖的粒度(granularity)
鎖的粒度是指被加鎖的對(duì)象的大小或范圍。鎖的粒度越大,并發(fā)程度越低,鎖資源開(kāi)銷(xiāo)越小;鎖的粒度越小,并發(fā)程度越高,鎖資源開(kāi)銷(xiāo)越大。
1)數(shù)據(jù)庫(kù)級(jí)鎖(database lock)
database dbname [exclusive/share];
默認(rèn)情況下,IDS對(duì)數(shù)據(jù)庫(kù)使用共享鎖,如用戶打開(kāi)數(shù)據(jù)庫(kù):database dbname。
2)表級(jí)鎖(table lock)
lock table tablename in exclusive/share mode;
當(dāng)做如下操作時(shí),IDS將自動(dòng)對(duì)操作的表施加排它鎖:
(1)alter index (2)alter table
(2)create index (3)drop index
(4)rename column (5)rename table
表級(jí)共享鎖鎖住的表將謝絕其他用戶對(duì)該表數(shù)據(jù)的任何修改,但其他用戶可以讀該表的數(shù)據(jù)。表級(jí)排它鎖鎖住的表將謝絕其他用戶的任何訪問(wèn)(除非使用“臟讀”方式)。對(duì)于一個(gè)表的大量數(shù)據(jù)修改操作可以考慮使用表級(jí)排它鎖。
3)頁(yè)面鎖(page lock)、記錄鎖(row lock)、鍵值鎖(key lock)
頁(yè)面鎖鎖住的對(duì)象是一個(gè)IDS數(shù)據(jù)頁(yè)面,記錄鎖鎖住的對(duì)象是一個(gè)記錄。用戶在創(chuàng)建表時(shí)可以選擇對(duì)該表操作時(shí)使用頁(yè)面鎖或者記錄鎖。IDS建表時(shí)默認(rèn)的鎖方式是頁(yè)面鎖:
create table tablename
(
…
)lock mode page/row;
當(dāng)IDS試圖對(duì)該表的記錄加鎖時(shí),它將根據(jù)長(zhǎng)劍該表時(shí)定義的鎖類(lèi)型加鎖。
鍵值鎖是IDS用來(lái)鎖住不存在的記錄的方法,實(shí)際上是鎖住該記錄在表中的位置不被他用。例如:IDS在事務(wù)中刪除一個(gè)表中的某一記錄時(shí),它將鎖住該記錄對(duì)應(yīng)的鍵值,以免其他用戶同時(shí)插入同一記錄。
3、鎖的生命周期
數(shù)據(jù)庫(kù)級(jí)鎖只有在關(guān)閉數(shù)據(jù)庫(kù)時(shí)才能被釋放。對(duì)于表級(jí)鎖、記錄鎖、鍵值鎖的生命周期依賴(lài)于所進(jìn)行的數(shù)據(jù)庫(kù)操作:selcet,update,delete等和數(shù)據(jù)庫(kù)事務(wù)是否使用。如果數(shù)據(jù)庫(kù)沒(méi)有使用日志,那么只有當(dāng)用戶顯示釋放該鎖時(shí)(unlock table tablename),IDS才釋放表級(jí)鎖。總之:當(dāng)數(shù)據(jù)庫(kù)事務(wù)結(jié)束時(shí),它將釋放所有在本事務(wù)中使用的鎖;事務(wù)中對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)修改時(shí)所加的所將保持到事務(wù)結(jié)束。
4、鎖的隔離等級(jí)(isolation level)
隔離等級(jí)是指在并發(fā)環(huán)境下,一個(gè)應(yīng)用隔離其他并發(fā)應(yīng)用的等級(jí)。通過(guò)使用隔離等級(jí),應(yīng)用可以在讀數(shù)據(jù)時(shí)指定使用鎖資源的方式。使用隔離登機(jī)必須打開(kāi)數(shù)據(jù)庫(kù)日志。
1)set isolation to dirty read;
指定應(yīng)用讀數(shù)據(jù)時(shí),對(duì)所讀對(duì)象不施加任何鎖。應(yīng)用讀數(shù)據(jù)時(shí)將不檢查是否其他應(yīng)用正在操作該數(shù)據(jù)。僅僅考慮系統(tǒng)開(kāi)銷(xiāo),這種方式讀數(shù)據(jù)是效率最高的。
2)set isolation to commited read;
指定應(yīng)用讀數(shù)據(jù)之前,首選對(duì)所讀數(shù)據(jù)檢查是否有其他應(yīng)用正在修改該數(shù)據(jù),以確保本應(yīng)用讀數(shù)據(jù)是已提交的數(shù)據(jù)。但這種方式在讀數(shù)據(jù)時(shí),并不對(duì)數(shù)據(jù)施加任何類(lèi)型的鎖,所以用戶正在讀的數(shù)據(jù)有可能其他用戶正在修改。這種方式時(shí)IDS默認(rèn)的讀數(shù)據(jù)方式。
3)set isolation to cursor stability;
指定應(yīng)用讀數(shù)據(jù)時(shí),如果使用“游標(biāo)”,則對(duì)所讀數(shù)據(jù)施加共享鎖,該共享鎖在讀取下一記錄時(shí)將被釋放掉,也就是只對(duì)所讀當(dāng)前一條記錄保持共享鎖:如果不使用“游標(biāo)”,該種讀數(shù)據(jù)的方式與上一種相同。
4)set isolation to repeatable read;
指定應(yīng)用讀數(shù)據(jù)時(shí),對(duì)所讀數(shù)據(jù)全部施加共享鎖,所有的鎖資源在事務(wù)結(jié)束才被釋放。使用這種方式,所有掃描過(guò)的數(shù)據(jù)全部施加共享鎖,即使部分?jǐn)?shù)據(jù)不滿足讀數(shù)據(jù)條件,但在掃描過(guò)程種掃描過(guò)。(如果全表掃描,則這種方式與使用表級(jí)鎖效果是一樣的)。
5、鎖沖突模式
當(dāng)應(yīng)用由于鎖資源引起沖突時(shí),可以通過(guò)設(shè)置鎖沖突來(lái)解決。
1)set lock mode to wait;
這種方式下,應(yīng)用遭遇鎖沖突時(shí),將無(wú)限制等待下去直到申請(qǐng)到所需鎖資源為止。
2)set lock mode to no wait;
這種方式下,應(yīng)用遭遇鎖沖突時(shí),將立即返回應(yīng)用:數(shù)據(jù)庫(kù)操作錯(cuò),如:107:Record is locaked.這種方式是IDS默認(rèn)的沖突等待方式。
3)set lock mode to wait n;(n是應(yīng)用設(shè)置的等待時(shí)間)
這種方式下,應(yīng)用遭遇鎖沖突時(shí),將在時(shí)間n內(nèi)反復(fù)申請(qǐng)所需鎖資源直到申請(qǐng)成功或者設(shè)置時(shí)間n用完。在IDS處理OLTP(Online Transaction Processing)聯(lián)機(jī)交易(如MCS中儲(chǔ)蓄、會(huì)計(jì)、信用卡日間實(shí)時(shí)交易)時(shí),應(yīng)該在E/C程序首部,首先設(shè)置鎖沖突等待時(shí)間,這樣以來(lái)可以避免很多不必要的由于鎖沖突引起的數(shù)據(jù)庫(kù)操作失敗。
6、死鎖(deadlock)
假設(shè)用戶A持有x鎖,用戶B持有y鎖。此時(shí),用戶A申請(qǐng)y鎖,同時(shí)用戶B申請(qǐng)x鎖。這樣一來(lái)就會(huì)出現(xiàn)用戶A、B同時(shí)等待對(duì)方釋放自己的鎖,于是出現(xiàn)“死鎖”。對(duì)于“死鎖”,IDS本身提供了一套檢測(cè)、恢復(fù)機(jī)制來(lái)避免“死鎖”的發(fā)生。
7、舉例:
假設(shè)有兩個(gè)用戶同時(shí)在操作同一數(shù)據(jù)庫(kù)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);
先進(jìn)行如下練習(xí):
(1)用戶A進(jìn)行如下操作:
begin work;
update test set time=”2” where code=”sam”;
(2)用戶B同時(shí)進(jìn)行如下操作:
select * from test where code=”abc”;
問(wèn)題:上述操作結(jié)果如何?
用戶B的select操作失敗了。因?yàn)橛脩鬉操作時(shí)對(duì)表test施加了頁(yè)面級(jí)的排他鎖(這些鎖將保留到事務(wù)結(jié)束),而用戶B試圖掃描被頁(yè)級(jí)排它鎖鎖住的頁(yè)面,所以操作失敗。
(3)用戶A進(jìn)行如下操作:
rollback work;
alter table test lock mode(row);
begin work;
update manufact set time=”2” where code=”sam”;
說(shuō)明:
本次操作成功。因?yàn)樵摬僮魍ㄟ^(guò)索引讀取記錄,而記錄未被步驟3的記錄鎖鎖住。
(4)用戶B進(jìn)行如下操作:
select * from test where code=”hro”;
說(shuō)明:
本次操作成功。因?yàn)樵摬僮魍ㄟ^(guò)索引讀取記錄,而該記錄未被步驟3的記錄鎖住。
(5)用戶B進(jìn)行如下操作:
select * from test;
說(shuō)明:
本次操作失敗。因?yàn)樵摬僮髟噲D順序掃描表test,而步驟3對(duì)test施加了記錄排它鎖,而且本操作使用了”commited read”的讀數(shù)據(jù)方式(系統(tǒng)默認(rèn))。
(6)用戶B進(jìn)行如下操作:
set isolation to dirty read;
select * from test;
說(shuō)明:
本次操作成功。因?yàn)樵摬僮髟O(shè)置了“臟讀“方式,將忽略說(shuō)有鎖沖突。
(7)用戶B進(jìn)行如下操作:
set isolation to commited read;
set lock mode to wait;
select * from test;
說(shuō)明:
本次操作處于等待方式。因?yàn)樵摬僮髟O(shè)置了“commited read“和“鎖沖突等待”方式,所以本操作被步驟3申請(qǐng)的鎖阻塞,等待其釋放鎖資源。
(8)用戶A進(jìn)行如下操作:
commit work;
說(shuō)明:
本次操作將釋放步驟3申請(qǐng)的鎖資源,步驟7操作成功。
(9)用戶A進(jìn)行如下操作:
set isolation to repeatable read;
begin work;
update test set time=”2” where name=”Julio”;
說(shuō)明:
本次name字段沒(méi)有索引,所以本次操作將采取順序掃描方式;另外,由于設(shè)置了”repeatable read”讀模式,所以test表的所有記錄都將被鎖住。
(10)用戶B進(jìn)行如下操作:
set lock mode to no wait;
update test set time+”2” and code=”sam”;
說(shuō)明:
本次操作失敗。雖然本次操作通過(guò)索引定位記錄,但是步驟9中用戶A已經(jīng)鎖。ü蚕礞i)test中表所有記錄,而且用戶B設(shè)置了”no wait”鎖沖突方式,所以操作失敗。
(11)用戶B進(jìn)行如下操作:
select * from test where code=”sam”;
說(shuō)明:
本次操作成功。因?yàn)楸敬尾僮魇褂盟饕ㄎ挥涗,而且使用”commited read”讀方式對(duì)記錄施加共享鎖,與步驟9中申請(qǐng)的共享鎖不沖突,所以操作成功。
第三章
索引策略
IDS采用B+樹(shù)索引結(jié)構(gòu)。
1、索引的優(yōu)點(diǎn)
1)通過(guò)使用索引定位取代順序掃描提高查詢速度;
2)提高數(shù)據(jù)排序速度;
3)保證被索引字段的唯一性;
4)當(dāng)僅僅查詢索引字段時(shí),避免讀取記錄全部字段內(nèi)容。
2、索引建立原則
(1)對(duì)連接(jion)字段建立索引
對(duì)于連接操作,至少對(duì)連接表達(dá)式的一個(gè)字段建立索引,否則IDS要么在連接之前自動(dòng)建立臨時(shí)索引進(jìn)行”sort merge join”或者”nested loop join”,要么順序掃描數(shù)據(jù)表進(jìn)行”hash join”。
(2)對(duì)選擇性過(guò)慮(selective filter)字段建立索引
(3)對(duì)排序(order)字段建立索引
(4)避免對(duì)高重復(fù)率(highly duplicate)的字段建立索引
(5)利用組合索引(composite indexs)降低索引重復(fù)率
(6)建立組合索引時(shí),應(yīng)該將重復(fù)率低的字段放在前面,重復(fù)率高的字段放在后面。
(7)控制索引字段對(duì)比數(shù)據(jù)表字段不能過(guò)長(zhǎng)
(8)運(yùn)用聚集索引(clustered index)提高查詢速度
聚集索引的建立將使被索引的表記錄在物理存儲(chǔ)上嚴(yán)格按聚集索引的順序存放。也就是聚集索引記錄與數(shù)據(jù)記錄的存儲(chǔ)順序一致,查詢時(shí)掃描的數(shù)據(jù)量較普通索引減少了。所以對(duì)于經(jīng)常查詢,很少增刪的表可以充分利用聚集索引的優(yōu)點(diǎn)提高查詢速度。
(9)數(shù)字字段的索引查找速度較其他類(lèi)型字段(如字符串字段等)的索引快。
(10)一個(gè)數(shù)據(jù)表的索引不應(yīng)該過(guò)多。索引過(guò)多,數(shù)據(jù)插入、數(shù)據(jù)刪除、數(shù)據(jù)修改速度一定程度上會(huì)影響。
(11)利用“部分鍵查找”(partial key search)提高索引利用率。例如:建立在表tab上的一個(gè)索引idx(f1,f2,f3,f4),當(dāng)對(duì)tab按照(f1,f2,f3,f4)或者按照(f1,f2,f3)或者按照(f1,f2)或者按照(f1)條件查詢時(shí),索引idx(f1,f2,f3,f4)都可以被利用上。
3、 并行建索引
第四章
并行數(shù)據(jù)查詢PDQ(parallel Data Qurey)
1、PDQ技術(shù)
Informix的PDQ技術(shù)將大量數(shù)據(jù)庫(kù)操作分割成為多個(gè)并行操作任務(wù),充分利用多處理器的并行處理能力,以比普通查詢快若干倍的速度完成數(shù)據(jù)查詢。
Informix的PDQ技術(shù)主要包括一下并行操作:
1)并行掃描(Parallel scans)
2)并行連接(Parallel joins)
3)并行排序(Parallel sorts)
4)并行組合(Parallel groups)
5)并行聚合(Parallel aggregates)
2、并行插入(Parallel insert)
1)在Informix 7.0版本后,對(duì)特殊的數(shù)據(jù)插入操作可以并行執(zhí)行,并行插入包括一下方式:
(1)insert into tabname select … from … where …;
使用這種方式,insert、select操作是冰心執(zhí)行的。如果目的表、源表都進(jìn)行了數(shù)據(jù)分片,而且Informix使用了多個(gè)CPU VP(virtual process),則insert 操作可以并行執(zhí)行。
(2)select … from …where … into temp tabname;
使用這種方式,insert、select操作是并行執(zhí)行的。而且臨時(shí)表tabname將以round robin方式分片在DBSPACETEMP指定的多個(gè)臨時(shí)數(shù)據(jù)空間(dbspaces)上。
2)并行插入在一下情況將不被啟動(dòng)
(1)數(shù)據(jù)插入的目的表使用了引用完整性控制(定義了主鍵或者外鍵)或者使用了”tigger”;
(2)數(shù)據(jù)插入的目的表是網(wǎng)絡(luò)上遠(yuǎn)程數(shù)據(jù)庫(kù)的表;
(3)數(shù)據(jù)插入的目的表中寶號(hào)BLOB字段;
(4)數(shù)據(jù)插入的目的表中包含處于”filtering”狀態(tài)的限制。(”filtering”狀態(tài)指表上的限制”constrains”打開(kāi),違反”constrains”時(shí)記錯(cuò)誤日志,但并不“回滾”)
3、使用PDQ
使用PDQ時(shí),首先要申明所做的操作是PDQ操作,通過(guò)執(zhí)行:set pdqpriority high可以打開(kāi)PDQ開(kāi)關(guān)。執(zhí)行完以后,應(yīng)關(guān)閉PDQ開(kāi)關(guān):set pdqpriority low;其次,為了更好的發(fā)揮PDQ技術(shù),應(yīng)該對(duì)操作的數(shù)據(jù)表進(jìn)行數(shù)據(jù)分割;最后運(yùn)用PDQ技術(shù)應(yīng)該選擇多CPU的機(jī)器。當(dāng)使用如下操作時(shí),將不能啟動(dòng)PDQ:
(1)查詢使用了”cursor stablility”的隔離等級(jí);
(2)查詢使用了update游標(biāo)或者游標(biāo)定義為”with hold”;
(3)查詢使用了嵌套子查詢;
(4)查詢中使用了存儲(chǔ)過(guò)程;
(5)查詢中不包含scan,join,sort,group,aggregate。
4、PDQ監(jiān)控
使用onstat –g mgm可以監(jiān)控PDQ使用情況。
第五章
數(shù)據(jù)分片(fragmentation)
Informix數(shù)據(jù)分片指把一個(gè)數(shù)據(jù)庫(kù)表的數(shù)據(jù)分布在不同的數(shù)據(jù)空間上。數(shù)據(jù)分片技術(shù)主要適用于數(shù)據(jù)量比較大(50,000條記錄以上)、訪問(wèn)頻繁的數(shù)據(jù)表。
1、數(shù)據(jù)分片技術(shù)
1)輪循(round robin)方式
輪循方式數(shù)據(jù)分片將數(shù)據(jù)庫(kù)表的數(shù)據(jù)均勻分布在指定的數(shù)據(jù)空間上。對(duì)于經(jīng)常需要順序掃描的數(shù)據(jù)表或經(jīng)常裝載的數(shù)據(jù)的數(shù)據(jù)表,可以考慮使用round robin分片策略,將數(shù)據(jù)均勻分布在多個(gè)位于不同硬盤(pán)上的數(shù)據(jù)空間(dbspaces)上。例如:
create table satmxhz
(
…
)fragment by round robin in workdbs1,workdbs2,workdbs3;
2)表達(dá)式(expression)方式
表達(dá)式方式數(shù)據(jù)分片將數(shù)據(jù)按照一定的條件分布在指定的數(shù)據(jù)空間上。對(duì)于經(jīng)常按照一定的條件掃描,而且很少裝載數(shù)據(jù)的數(shù)據(jù)表,可以考慮使用expression分片方式,將數(shù)據(jù)按照一定條件分布在多個(gè)位于不同的數(shù)據(jù)空間(dbspace)上。例如:
create table acdb1
(
…
)fragment by expression
fb1z1 in (“1”,”2”,”3”) in workdbs1,
fb1z1 in (“4”,”5”,”6”) in workdbs2,
remainder in workdbs3;
使用表達(dá)式方式數(shù)據(jù)分片在進(jìn)行條件查詢時(shí),Online可以忽略那些不滿足條件的分片,從而降低了掃描數(shù)據(jù)量,提高了查詢效率。
2、 數(shù)據(jù)分片的優(yōu)點(diǎn)
(1)并行掃描(parallel scans);
如果使用了數(shù)據(jù)分片,并且打開(kāi)了PDQ,那么對(duì)數(shù)據(jù)表的掃描將并行從各個(gè)fragmentation中讀數(shù)據(jù),查詢速度將得到很大提高。
(2)均衡I/O;
如果數(shù)據(jù)分片使用的數(shù)據(jù)空間正好分布在多個(gè)獨(dú)立物理硬盤(pán)上,則數(shù)據(jù)掃描將在多個(gè)硬盤(pán)上同時(shí)進(jìn)行,減少了磁盤(pán)競(jìng)爭(zhēng),均衡了磁盤(pán)I/O。這對(duì)于OLTP交易非常有利。
(3)高可靠性;
通過(guò)設(shè)置忽略出錯(cuò)的單個(gè)數(shù)據(jù)分片,可以避免由于單個(gè)數(shù)據(jù)分片出錯(cuò)導(dǎo)致整個(gè)不能使用的情況。這對(duì)于大量的動(dòng)態(tài)數(shù)據(jù)統(tǒng)計(jì)非常有利,如決策支持系統(tǒng)DSS(Decision Support System)中的數(shù)據(jù)統(tǒng)計(jì)。
(4)降低備份、恢復(fù)數(shù)據(jù)粒度。
由于數(shù)據(jù)備份、恢復(fù)可以在dbspace一級(jí)上進(jìn)行,而數(shù)據(jù)分片駐留在dbspace上,所以數(shù)據(jù)備份、恢復(fù)可以在fragment上進(jìn)行。
3、rowid問(wèn)題
IDS的rowid由4個(gè)字節(jié)構(gòu)成:
0 -- 07bit :記錄在頁(yè)面中的槽表號(hào)。
08 -- 32bit :tbsapce中的邏輯頁(yè)號(hào)。
由于使用了數(shù)據(jù)分片,一個(gè)數(shù)據(jù)庫(kù)表將跨越多個(gè)dbspace中的tbspace,所以rowid在一個(gè)表中不再是唯一的,而且作為應(yīng)用程序也不應(yīng)該直接操作rowid。鑒于以上情況,在使用Informix 7.0后,應(yīng)該不再直接操作rowid。為了操作方便可以在數(shù)據(jù)庫(kù)表中定義主關(guān)鍵字(primary key)。
第六章
ESQL/C的使用
1、prepare語(yǔ)句的使用
在SQL中使用prepar語(yǔ)句后可以根據(jù)應(yīng)用程序提供的不同的values來(lái)執(zhí)行多遍,而語(yǔ)法分析卻僅執(zhí)行一遍。當(dāng)一個(gè)SQL語(yǔ)句在同一應(yīng)用程序中被重復(fù)執(zhí)行多遍時(shí),用prepare的方法可以大大提高性能和效率。Prepare語(yǔ)法:
$prepare p_id from “insert into tabname (..) values (?…?)
2、插入游標(biāo)(insert cursor)的使用
插入游標(biāo)中的put語(yǔ)句使用了insert buffer,從而可以將多條insert語(yǔ)句一次性地寫(xiě)入共享內(nèi)存緩沖區(qū)中,因?yàn)闇p少了寫(xiě)緩沖區(qū)的I/O次數(shù),故可提高性能。插入游標(biāo)語(yǔ)法:
$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、滾動(dòng)游標(biāo)(scroll cursor)的使用
使用滾動(dòng)游標(biāo)的好處在于可以前后檢索結(jié)構(gòu)集中的記錄,這對(duì)于需反復(fù)訪問(wèn)結(jié)果的應(yīng)用很有用。但是當(dāng)表很大,且經(jīng)常進(jìn)行幅度很大的記錄檢索時(shí),會(huì)導(dǎo)致創(chuàng)建很大的臨時(shí)表,效率低。建議使用時(shí):
1)定義滾動(dòng)游標(biāo)時(shí)可以選擇盡可能少的游標(biāo)或者可能少的字段,比如只選擇表中的主關(guān)鍵字,然后再由此選出表中相應(yīng)的記錄;
2)如果可以不用滾動(dòng)游標(biāo),則應(yīng)該避免使用;
3)如果返回結(jié)果確信只有一條記錄,則應(yīng)該避免使用游標(biāo);
4)應(yīng)該避免游標(biāo)的嵌套使用。
滾動(dòng)游標(biāo)語(yǔ)法:
$declare cursor_name scroll cursor for …;
…
$open cursor_name;
4、 改游標(biāo)(update cursor)的使用
$declare cursor_name cursor for … for update
…
$update … where current of cursor_name;
5、 SQL交換區(qū)sqlca(sql communication area)的使用
每當(dāng)執(zhí)行完一個(gè)SQL語(yǔ)句,Online都會(huì)將執(zhí)行情況返回到sqlca這個(gè)結(jié)構(gòu)中,其中包括一下信息:
1)最近運(yùn)行的SQL語(yǔ)句完成情況;
2)有關(guān)性能的一些信息;
3)對(duì)一些可能發(fā)生或者已經(jīng)發(fā)生情況的警告;
sqlca機(jī)構(gòu)為:
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;
當(dāng)調(diào)用SQL出錯(cuò)時(shí),往往憑sqlcode的返回碼不能確定出錯(cuò)原因,還應(yīng)該返回ISAM錯(cuò)誤碼sqlerrd[1]。
6、 存儲(chǔ)過(guò)程(stored procedure)的使用
存儲(chǔ)過(guò)程是用戶用Informix提供的SPL(stored procedure lauguage)語(yǔ)言,編制的一些數(shù)據(jù)庫(kù)操作?梢杂靡韵抡Z(yǔ)法創(chuàng)建、使用存儲(chǔ)過(guò)程:
$create procedure p_name(…)
…
end procedure
…
$execute p_name;
存儲(chǔ)過(guò)程創(chuàng)建時(shí),數(shù)據(jù)庫(kù)會(huì)編譯存儲(chǔ)過(guò)程,產(chǎn)生數(shù)據(jù)庫(kù)查詢計(jì)劃,并將其翻譯成數(shù)據(jù)庫(kù)文件存儲(chǔ)在IDS數(shù)據(jù)庫(kù)的系統(tǒng)表sysprocedures。存儲(chǔ)過(guò)程的所有授權(quán)用戶都可以調(diào)用該過(guò)程。具體調(diào)用時(shí),IDS會(huì)從系統(tǒng)表sysprocedures中讀出存儲(chǔ)過(guò)程,轉(zhuǎn)換成執(zhí)行代碼,運(yùn)行它。對(duì)于經(jīng)常被反復(fù)執(zhí)行的一段SQL語(yǔ)句,若采用存儲(chǔ)過(guò)程的方法,既可以減少程序的復(fù)雜度,而且應(yīng)用和數(shù)據(jù)庫(kù)之間的交互由一條SQL語(yǔ)句變?yōu)橐粋(gè)存儲(chǔ)過(guò)程名,大大減少了交互數(shù)據(jù)量。其次因?yàn)榭梢蕴岣咭恍┫到y(tǒng)性能。另外不同的應(yīng)用程序可以共享一個(gè)存儲(chǔ)過(guò)程,從而消除冗余代碼。此外,在client/server環(huán)境中亦有利于代碼維護(hù);通過(guò)使用存儲(chǔ)過(guò)程的安全等級(jí),可以限制用戶的一些非法操作,如禁止用戶對(duì)數(shù)據(jù)庫(kù)表的訪問(wèn)等。 |
|