IDS(Informix Dynamic Server)的基本概念總結

lenx2000發表於2012-08-22

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章