欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Informix 高級培訓教材
Informix 高級培訓教材
 
作者:qaz1wsx  出處:Unix愛(ài)好者家園unix-cd.com  更新時(shí)間: 2004年07月22日 
 
 目錄 
1. ONLINE5 與ONLINE7 的比較.............................................................................. 4 
1.1. 系統體系結構的差別................................................................................... 4 
1.2. 系統性能的差別....................................................................................... 4 
1.3. 系統可靠性的差別..................................................................................... 4 1.4. 命令的差別.......................................................................................... 5
2. ONLINE7 的配置及性能調整............................................................................... 5 
2.1. 確定系統性能的目標................................................................................... 5 
2.2. 系統性能監測和調整的基本方法.......................................................................... 6 
2.3. 影響性能的配置參數................................................................................... 6 
2.3.1. 影響性能的CPU 參數................................................................................. 6
2.3.2. 影響性能的內存參數................................................................................. 8 
2.3.3. 影響性能的I/O 的參數.............................................................................. 10 
2.4. 操作系統上的性能監控................................................................................ 12
2.4.1. Sar ............................................................................................. 12
2.4.2. iostat .......................................................................................... 13 
2.4.3. vmstat ........................................................................................... 14
3. 程序及數據的性能調整................................................................................... 16
3.1. 索引................................................................................................ 16
3.2. 關(guān)于with hold ...................................................................................... 16 
3.3. 關(guān)于事物............................................................................................. 17
3.4. 關(guān)于語(yǔ)句寫(xiě)法......................................................................................... 18
3.5. 關(guān)于使用put , execute 來(lái)代替insert 提高效率.......................................................... 20 
3.6. 使用隔離級別(isolation)............................................................................ 20 
3.7. 使用優(yōu)化器(update statistics)..................................................................... 21
3.8. 使用復合索引........................................................................................ 22 
4. INformIX 數據庫數據復制(CDR)......................................................................... 23 
4.1. 基本概念............................................................................................ 23
4.1.1. 數據復制類(lèi)型:同步、異步........................................................................... 23
4.1.2. 復制機制:基于觸發(fā)器和基于日志...................................................................... 23
4.1.3. CDR 的局限性...................................................................................... 24
4.1.4. CDR 如何實(shí)現...................................................................................... 24
4.2. CDR 配置實(shí)例......................................................................................... 25
4.2.1. 系統環(huán)境準備....................................................................................... 25
4.2.2. 確定復制環(huán)境....................................................................................... 26 
4.2.3. 建立picc21 和ibm500 的數據庫之間的互訪(fǎng).............................................................. 26
4.2.4. 定義replicate server ............................................................................. 26
4.2.5. 確定復制服務(wù)器已建立............................................................................... 27
4.2.6. 增加連接成員: .................................................................................... 27
4.2.7. 確定成員已連接..................................................................................... 27
4.2.8. 定義replicate..................................................................................... 28
4.2.9. 確定replicate 建立................................................................................ 28
4.2.10. 啟動(dòng)replicate.................................................................................... 28
4.2.11. 確定replicate 已啟動(dòng)............................................................................. 29 
4.2.12. 關(guān)閉replicate.................................................................................... 29
4.2.13. 維護CDR.......................................................................................... 29
4.2.14. 監控CDR 工作情況................................................................................. 30 
4.2.15. CDR 出錯處理.................................................................................... 30 
4.3. CDR 的時(shí)間同步....................................................................................... 30 

1. ONLINE5 與ONLINE7 的比較
1.1. 系統體系結構的差別
   ONLINE5 的內部處理結構是一對一的單線(xiàn)索的結構,每個(gè)用戶(hù)對應一個(gè)數據庫服務(wù)器進(jìn)程,數據庫服務(wù)器進(jìn)程負責響應客戶(hù)的數據請求,而數據庫內部的協(xié)調處理由ONLINE 守護進(jìn)程負責,數據庫服務(wù)器進(jìn)程和ONLINE 守護進(jìn)程間相互獨立。
   ONLINE7 采用的是先進(jìn)的多線(xiàn)索的體系結構,多線(xiàn)索結構是核核心層的,客戶(hù)應用進(jìn)程和數據庫服務(wù)器進(jìn)程(VP)之間是多對多的關(guān)系,即一個(gè)客戶(hù)應用進(jìn)程可以有多個(gè)數據庫服務(wù)器進(jìn)程服務(wù),反之,一個(gè)數據庫服務(wù)器進(jìn)程也可以為多個(gè)客戶(hù)應用進(jìn)程服務(wù)。
   ONLINE7 的優(yōu)點(diǎn)是:充分利用CPU 的并發(fā)處理能力,而且數據庫服務(wù)器進(jìn)程的數目不是隨著(zhù)用戶(hù)進(jìn)程的增加而增加,減輕了系統的負荷。
   ONLINE5 中,客戶(hù)應用進(jìn)程和數據庫服務(wù)器進(jìn)程之間的通信是通過(guò)UNIX 管道實(shí)現的,數據庫服務(wù)器進(jìn)程間通訊是通過(guò)共享內存完成的。如果通過(guò)網(wǎng)絡(luò )連接必須使用INformIX-STAR 這個(gè)產(chǎn)品。而ONLINE7 集成了INformIX-STAR,戶(hù)應用和服務(wù)器之間的通訊即可以是共享內存方式也可以通過(guò)TCP/IP 的SOCKET 或TLI 實(shí)現,同時(shí)還支持了IPX/SPX 協(xié)議。 e[Q$J
1.2. 系統性能的差別 S
   ONLINE5 不能在聯(lián)機方式下改變共享內存的大小和數據庫服務(wù)器的個(gè)數,而ONLINE7 可以在聯(lián)機的方式增加共享內存和增加虛擬處理器的個(gè)數,這樣就達到了系統的動(dòng)態(tài)可伸縮的特性。
   ONLINE7 因使用了多線(xiàn)索體系結構,一個(gè)查詢(xún)可以使用多個(gè)線(xiàn)索,因此很好的支持了并行查詢(xún)的功能(PDQ)。ONLINE7 還增加了對數據分割的支持。
1.3. 系統可靠性的差別
ONLINE7 增加了數據復制的功能(CDR)。
ONLINE7 在數據備份和恢復功能都有所增強,備份可以并行創(chuàng )建。只要rootdbs沒(méi)有損壞,任何一個(gè)chunk 的損壞不影響整個(gè)ONLINE 的運行。ONLINE 啟動(dòng)時(shí)的快速恢復功能也使用多線(xiàn)索并行處理。
Informix 高級培訓教材(內部) []A4H
5 ©91Talk論壇 -- 張揚你的個(gè)性,IT技術(shù)、時(shí)尚、娛樂(lè ).. 就要自由,就要TALK!  n3DSlkz
1.4. 命令的差別
ONLINE5 的命令都以tb 開(kāi)頭如:tbinit, tbmode,tbstat, tbtape
ONLINE7 的命令都以on 開(kāi)頭如:oninit, onmode,onstat, ontape 
另外,在ONLINE 配置方面ONLINE7 多了許多參數,這部分在ONLINE 配置部分介紹。
2. ONLINE7 的配置及性能調整 
   這部分討論的是INformIX ONLINE 數據庫服務(wù)器的性能監測和調整。性能監測和調整的研究和實(shí)踐是很廣泛的。這里只討論ONLINE 數據庫管理的日常維護的問(wèn)題和方法。人們一直在討論如何提高數據庫的性能,數據如何存儲、如何讀取、如何配置參數才使你的應用得到更好的性能。例如:當要優(yōu)化一個(gè)系統時(shí),為一個(gè)有1000 用戶(hù)并都執行短小簡(jiǎn)單的事物的系統,和為一個(gè)只有很少用戶(hù)但執行很長(cháng)且復雜的事物的系統的參數配置是完全不一樣的。我們從以下幾個(gè)方面闡述:
² 監控系統資源并評價(jià)系統的性能
² 數據庫活動(dòng)對系統性能評價(jià)的影響
² 用online 提供的工具來(lái)監控和調整系統性能
² 從以下幾方面消除系統性能的瓶頸:
1. 平衡系統資源的負載
2. 調整online 的參數
3. 調整數據的布局
4. 為關(guān)鍵查詢(xún)分配資源
適當平衡系統負載往往可以改善系統性能。有時(shí)性能改善是變化的,且往往使用單一的負載均衡的方法不能完全滿(mǎn)足要求,下面從更廣的范圍對此進(jìn)行討論:
1. 修改應用程序,以便其能更好的利用操作系統和數據庫的資源
2. 系統性能沒(méi)有被充分利用
3. 網(wǎng)絡(luò )的性能影響了C/S 結構的應用性能
2.1. 確定系統性能的目標確定系統性能目標時(shí)考慮的問(wèn)題:
1. 要獲得最大的交易吞吐量,還是最快的響應時(shí)間,或者是兩者的混合。
2. 網(wǎng)絡(luò )對性能的影響
3. 希望的最大用戶(hù)數
4. 你的配置是否受內存、磁盤(pán)和CPU 資源的限制Informix 高級培訓教材(內部) 

2.2. 系統性能監測和調整的基本方法
   系統的性能是否好是個(gè)模糊的概念,不太容易說(shuō)清楚,比如用戶(hù)會(huì )說(shuō)有時(shí)系統很慢,有時(shí)一個(gè)交易不知道為什么不能完成等等,這就需要透過(guò)表面現象分析系統性能問(wèn)題的真正瓶頸。我們建議通過(guò)反復多次的評價(jià)、調整的方法來(lái)接近您所要求的性能目標。如果反復的經(jīng)過(guò)下面提供的步驟的調整都無(wú)法滿(mǎn)足您對性能的要求,則很可能是您的硬件資源受到限制,或應用程序編碼不當引起的問(wèn)題。
ONLINE性能優(yōu)化步驟
1. 確定您的性能目標.
2. 獲得資源利用率和數據庫活動(dòng)的數據
3. 確定性能問(wèn)題的癥狀:不均衡的CPU、內存和磁盤(pán)的利用率。
4. 調整操作系統的參數。
5. 調整ONLINE的參數。
6. 優(yōu)化chunk 和dbspace 的配置, 包括日志、排序空間、臨時(shí)表和排序文件的存放位置。
7. 優(yōu)化表的存放位置、extent大小和分段處理。
8. 改善索引. 
9. 優(yōu)化后臺I/O活動(dòng),包括logging, check-points,和page cleaning. 
10. 規劃備份和批處理業(yè)務(wù)的時(shí)間
11. 優(yōu)化數據庫應用的執行。
12. 重復2-11 部。
2.3. 影響性能的配置參數
   影響性能的參數包括操作系統的參數和ONLINE 的參數。在進(jìn)行參數調整前應該對當前參數的性能進(jìn)行評估。一般改變操作系統參數需要重新啟動(dòng)機器,改變ONLINE 的參數需要重新啟動(dòng)ONLINE。
2.3.1. 影響性能的CPU 參數
1.操作系統的參數:
1.信號量(SEMMNS ) 
SEMMNS = init_vps + added_vps + (2 * shmem_users)+concurrent_utils 
2.同時(shí)打開(kāi)文件數(NFILES)
NFILES = (chunks * NUMAIOVPS) + NUMCPUVPS + net_connections 
2.ONLINE的相關(guān)參數:
NUMCPUVPS:初始分配的CPU VPs的個(gè)數,在單處理器的主機中此值建議用1,再多處理器的主機中此值不應大于物理CPU的個(gè)數,建議使用比物理處理器少1。此值可以通過(guò)onmode -p命令動(dòng)態(tài)增加。
   CPU VPs的個(gè)數將決定在一個(gè)查詢(xún)中掃描線(xiàn)索(Scan Threads)的個(gè)數。當掃描線(xiàn)索數的整數倍時(shí)查詢(xún)會(huì )獲得最好的性能。onstat -g ath命令監控每個(gè)CPU VP的掃描線(xiàn)索數,onstat -g ses命令監控某個(gè)具體會(huì )話(huà)。
SINGLE_CPU_VP:當CPU VPs值等于1時(shí),此值也設置為1,否則為1。當此值為1時(shí),NUMCPUVPS必須設置為1,否則ONLINE會(huì )報錯。
MULTIPROCESSOR:當CPU VPs值大于1時(shí),此值也設置為1,否則為0。 
NOAGE:為ONLINE CPU VP設置關(guān)閉處理器優(yōu)先級老化的開(kāi)關(guān)(需要OS支持),1為關(guān)閉。AFF_NPROCS:CPU綁定功能,就是可以通過(guò)CPU綁定來(lái)為處理器分配不同的任務(wù)。綁定幾個(gè)CPU。
AFF_SPROC:從第幾個(gè)CPU開(kāi)始綁。
NUMAIOVPS:說(shuō)明使用幾個(gè)AIO VPs。如果OS不支持核心異步IO (KAIO)的話(huà),ONLINE使用AIO管理所有數據庫I/O請求。AIO Vps的個(gè)數依賴(lài)于你配置了多少磁盤(pán)。如果系統不支持KAIO的話(huà),建議為每個(gè)chunk分配一個(gè)AIO VPS。還有一個(gè)分配AIO VPs的標準是看I/O請求隊列的長(cháng)度是否足夠短。onstat -g ioq 命令可以監控待AIO VPs 處理的I/O請求隊列的長(cháng)度。
盡量多的分配AIO VPs是不會(huì )對系統有何副作用,可以通過(guò)onmde -p動(dòng)態(tài)增加AIO的個(gè)數,但不能動(dòng)態(tài)的減少。
OPTCOMPIND:該參數幫助優(yōu)化器為應用選擇一個(gè)最適合的存取方式。如果該值為0,優(yōu)化器首先選擇已存在的索引既是順序掃描速度更快。當該值為0,并且隔離級別設置為重復讀模式,優(yōu)化器適用嵌套循環(huán)連接的方式。當該值為2(缺?。?,優(yōu)化器選擇基于消耗評估的連接方法,即使表掃描引起整個(gè)表被臨時(shí)鎖住。用戶(hù)可以通過(guò)設置環(huán)境變量改變該值。
MAX_PDQPRIORITY:該值限制一個(gè)查詢(xún)可以占用的PDQ資源的百分比。
DS_MAX_QUERIES:描述同事的最大決策支持查詢(xún)的個(gè)數。ONLINE通過(guò)該值和DS_TOTAL_MEMORY: 決定為一個(gè)查詢(xún)分配多少內存。
DS_MAX_SCANS:該值限制了PDQ的掃描線(xiàn)索的個(gè)數。該值避免PDQ引起的掃描線(xiàn)索被過(guò)度使用。
分配給一個(gè)查詢(xún)的掃描線(xiàn)索數是通過(guò)下面的公式計算的:
scan_threads = min (nfrags, (DS_MAX_SCANS * pdqpriority / 100*MAX_PDQPRIORITY / 100) )
減少掃描線(xiàn)索數可以提高幾個(gè)大查詢(xún)同時(shí)運行時(shí)的響應。
NETTYPE:為每個(gè)連接類(lèi)型配置輪訓線(xiàn)索。一般情況每個(gè)DBSERVER 對應一個(gè)連接類(lèi)型。輪訓線(xiàn)索可以定義兩種類(lèi)型VP: CPU 和NET。建議只使用一個(gè)CPU 類(lèi)型的輪訓線(xiàn)索,其它的給NET 類(lèi)型的輪訓線(xiàn)索,總的輪訓線(xiàn)索數不能大于努NUMCPUVPS。盡管訓線(xiàn)索理論上可以支持1024 個(gè)連接,但單CPU 主機每個(gè)輪訓線(xiàn)索支持300 個(gè)連接比較好,而多CPU 主機每個(gè)輪訓線(xiàn)索支持350 個(gè)連接比較好。該值為定義缺省是一個(gè)CPU 輪訓線(xiàn)索,每個(gè)輪訓線(xiàn)索支持50 個(gè)連接。適當的增加輪訓線(xiàn)索可以提高性能。注:ipcshm 方式的連接是需要占用信號量資源的。 
onstat -g glo 
當前運行的各個(gè)虛擬處理器(VP)已占用的CPU 資源??梢酝ㄟ^(guò)間隔1 分鐘時(shí)間兩次執行該命令, 將兩次結果9 相減,如果結果接近60 秒說(shuō)明CPU 很忙。
onstat -g rea 
監控等待運行的線(xiàn)索,如果列出線(xiàn)索較多說(shuō)明CPU 處理能力不足??梢钥紤]增加CPU VP 的個(gè)數。
2.3.2. 影響性能的內存參數
這部分討論影響性能的內存參數,包括OS 和ONLINE 的參數配置,你必須考慮如何均衡的使用有限的內存資源。
當OS 分配一塊共享內存是我們把它叫做段(segment), ONLINE 在用這塊共享內存段時(shí)我們又把它叫做區(portion)。ONLINE 根據需要把共享內存分成了3 個(gè)區分別是: 
²  駐留內存區:這部分時(shí)靜態(tài)的,在ONLINE 初始化時(shí)分配。它是由以下幾個(gè)參數組成的:
BUFFERS:通過(guò)下面的公式可以計算出buffer所占內存
buffer_value = (BUFFERS * pagesize) + (BUFFERS * 254)
LOCKS:通過(guò)下面的公式可以計算出LOCK所占內存
locks_value = LOCKS * 44 
LOGBUFF:通過(guò)下面的公式可以計算出邏輯日志buffer所占內存
logbuff_value = LOGBUFF * 1024 * 3 
PHYSBUFF:通過(guò)下面的公式可以計算出物理日志buffer 所占內存
physbuff_value = PHYSBUFF * 1024 * 2 
駐留內存區的大小是按下面的公式計算的:
rsegsize = (buffer_value + locks_value + logbuff_value+ cphysbuff_value + 51,200) / 1024
另外, RESIDENT 設為1 時(shí)這部分被強制駐留物理內存而不會(huì )被換出( OS 要支持)。
²  虛擬內存區:這部分時(shí)動(dòng)態(tài)增長(cháng)的,但在初始化是也應分配個(gè)適當的值。它是由以下幾部分組成的:
用于大的讀寫(xiě)操作的大緩沖區
排序池 
活動(dòng)線(xiàn)程控制塊、棧、堆 
用戶(hù)對話(huà)數據 
數據字典高速緩存和存儲過(guò)程
用于網(wǎng)絡(luò )接口信息的全局池 
初始的區大小由SHMVIRTSIZE 參數決定,增加的區大小由SHMADD 參數決定。
根據一般經(jīng)驗,每個(gè)用戶(hù)要占100K~500K 的虛擬內存區的空間,如果用了數據分割應該再加4M??梢杂胦nstat -g mem 命令共享內存區的大小
²  消息內存區:這部分是靜態(tài)的,在ONLINE 初始化時(shí)分配。它包括共享內存通訊接口的消息緩沖區。它的大小依賴(lài)與你允許的連接用戶(hù)數。它的大小可由下面的公式計算出Informix 
msegsize = (10,531 * ipcshm_conn + 50,000)/1024 
與內存有關(guān)的ONLINE 參數 
SHMVIRTSIZE:決定虛擬內存區的初始區大小。當虛擬內存區不夠用時(shí)ONLINE會(huì )自動(dòng)增加一個(gè)新的區,但這會(huì )消耗ONLINE的處理資源。因此,該值應該盡可能的,一般先下面兩種情況中大的一種:
8,000 或connection* 350 
SHMADD:決定ONLINE動(dòng)態(tài)增加的虛擬內存區的大小。虛擬內存區的增加會(huì )消耗CPU的資源。它也應盡可能的大,但當內存方生很多的換出的情況,就應減少了。建議按下表進(jìn)行設置 
===========================================
Memory Size SHMADD value
256 megabytes or less 8,192 kilobytes (the default)
Between 257 and 512 megabytes 16,384 kilobytes
Larger than 512 megabytes 32,768 kilobytes 
===========================================
可以用onstat -g seg 命令監控ONLINE共享內存區的使用情況。
SHMTOTAL:限制ONLINE最多使用的共享內存的大小。如果是0,根據實(shí)際情況動(dòng)態(tài)增加,除非有特殊情況,如大量?jì)却姹粨Q出,一般都設置為0。
BUFFERS:設置ONLINE使用的數據緩沖區的多少。該部分是駐留內存區,用戶(hù)數據在內存中的高速緩沖。更多的BUFFER可以帶來(lái)更多的曾經(jīng)訪(fǎng)問(wèn)過(guò)的數據駐留在內存中。該值對數據庫I/O和交易吞吐量都是非常重要的。但過(guò)多的分配BUFFER也會(huì )造成內存資源的浪費而影響其他部分對內存的使用。建議BUFFER占用的內存是實(shí)際內存的20%~25%之間。用onstat -p 命令看讀寫(xiě)cache的大小,如果過(guò)低應該增加該值。 配置原則是物理內存的20%~30%。在系統沒(méi)用頁(yè)交換發(fā)生的情況下,盡量多的增加buffer。用onstat -p 命令察看讀Cached 在95%以上,寫(xiě)Cached在85%以上說(shuō)明BUFFERS 值較合理,同時(shí)結合vmstat 命令觀(guān)察交換區的使用情況。
LOCKS: 如果onstat -p 中lockwaits 值較大應適當增加locks 數。有個(gè)有用的命令: onmode -F 方法系統空閑的內存,并可以將該命令加到系統的crontab 中定期執行。
RESIDENT: 確定駐留內存區是否被被強制駐留在物理內存中,而不會(huì )被換出(OS 要支持)。駐留內存區還包括可LRU 對列,LRU 與數據庫的讀寫(xiě)操作有關(guān)。該值建議設為1,如OS 不支持將報錯并被忽略。
STACKSIZE: 確定為每個(gè)線(xiàn)程分配多少??臻g。該部分空間是在虛擬內存區中分配的。用如下公式計算總的棧大小: 
stacktotal = STACKSIZE * avg_no_of_threads
LOCKS:確定同時(shí)可以打開(kāi)的最大的鎖的數目。絕對最大值是8M,每個(gè)LOCK占用44字節(在駐留區)??梢酝ㄟ^(guò)下圖來(lái)評估一條SQL語(yǔ)句可能占用鎖的個(gè)數:
LOGBUFF:確定邏輯日志的緩沖區的空間大小。它的大小決定了邏輯日志被刷新的磁盤(pán)上的頻度。 
PHYSBUFF:確定物理日志的緩沖區的空間大小。它的大小決定了物理日志被刷新的磁盤(pán)上的頻度。
DS_TOTAL_MEMORY: 確定一個(gè)查詢(xún)最多可獲得的共享內存百分比。一般,在一個(gè)OLTP 系統中該值為:20%~50%之間。如果是一個(gè)DDS 系統中該值為:50%~80% 之間,甚至90% 。當該值未賦則ONLINE 按如下公式計算: 
min_ds_total_memory = NUMCPUVPS * 2 * 128Kb
2.3.3. 影響性能的I/O 的參數
CHUNK 和DBSPACES 的配置
在整個(gè)I/O 過(guò)程中磁盤(pán)是最為緩慢的一個(gè)環(huán)節,因此如何安排好磁盤(pán)空間的使用也使I/O 性能的關(guān)鍵。
在創(chuàng )建CHUNK 時(shí)建議將一個(gè)完整的分區分配個(gè)CHUNK,避免offset 計算錯誤引起的數據訪(fǎng)問(wèn)失敗。 
在5.0 以前的版本建議一個(gè)DBSPACES 使用都個(gè)CHUNK 來(lái)提高性能,但從7.0 以后對此不在要求,反而是最好一個(gè)DBSPACES 用一個(gè)CHUNK,這樣便于作數據分割。
ONLINE 在缺省情況將臨時(shí)表建在rootdbs 中,建議使用DBSPACETEMP 參數建立temp dbspace, 用于臨時(shí)表的存放。
設置預讀的參數
RA_PAGES: 確定ONLINE預讀的頁(yè)數,
RA_THRESHOLD:ONLINE 響應I/O 請求的指針
用下面的計算公式:
RA_PAGES = (BUFFERS * bp_fract) / (2 * large_queries) + 2
RA_THRESHOLD = (BUFFERS * bp_fract) / (2 * large_queries) - 2 
配置后臺I/O
后臺I/O 不能直接服務(wù)于SQL 請求。后臺I/O 主要是維護數據一致性。后臺I/O帶來(lái)高速的I/O 同時(shí)消耗CPU 資源,同時(shí)會(huì )與交易競爭系統資源。如果后臺I/O 過(guò)多會(huì )影響應用的性能。下面是一些后臺I/O:
Checkpoints
Logging 
Page cleaning 
Backup and restore 
Rollback and recovery 
Data replication 
Checkpoints、Logging、Page cleaning 是數據庫維護數據一致性所必需的后臺I/O。相對后臺I/O,前臺I/O 的效率比較差,因此盡量避免前臺I/O??梢酝ㄟ^(guò)增加Page Cleaning數或減少觸發(fā)Page Cleaning 來(lái)減少前臺I/O。用onstat -F 命令可以監控前臺I/O 的頻率。 
影響后臺I/O 的參數 
CKPTINTVL:設置checkpoint的時(shí)間間隔,onstat -m可以監控checkpoint的時(shí)間。當物理日志達到75%時(shí)也發(fā)生checkpoint,
LOGSIZE 
LOGSIZE 
LOGFILES 
LOGSMAX 
PHYSFILE 
PHYSFILE
影響日志的參數 
LOGBUFF 
PHYSBUFF
LTXHWM 
LTXEHWM 
影響Page Cleaning 的參數
CLEANERS:清頁(yè)線(xiàn)索的個(gè)數,建議每個(gè)磁盤(pán)使用一個(gè)清頁(yè)線(xiàn)索。
LRUS 有更多的LRU就會(huì )有更多的Page Cleaning,用onstat -R命令監控臟頁(yè)的比例 
LRU_MAX_DIRTY:LRU的最大臟讀比例
LRU_MIN_DIRTY:LRU的最小臟讀比例
RA_PAGES 6
RA_THRESHOLD 

三種寫(xiě)的比較
1. 前臺寫(xiě):由sqlexec 親自刷新,前臺寫(xiě)效率最低盡量避免。
2. LRU 寫(xiě):它是由LRU_MAX_DIRTY 和LRU_MIN_DIRTY 決定刷新的頻率,并且這種刷新操作是不徹底的,但有個(gè)好處是在刷新時(shí)不會(huì )終止用戶(hù)線(xiàn)索的操作。
3. Chunk 寫(xiě):這種寫(xiě)實(shí)最徹底并且效率最高,但在寫(xiě)的時(shí)候所有用戶(hù)線(xiàn)索不能進(jìn)入臨界區,因此檢查點(diǎn)會(huì )延遲用戶(hù)的響應時(shí)間。
通過(guò)onstat -F 可以觀(guān)察以上三種寫(xiě)的使用情況??梢酝ㄟ^(guò)改變LRU_MAX_DIRTY 和LRU_MIN_DIRTY 及CKPTINTVL 的值調整寫(xiě)的方式。
2.4. 操作系統上的性能監控 
IBM RS6000 系列小型機上的AIX 4.3.3 操作系統提供了一些列的系統性能分析工具,這些工具主要以命令行方式執行,平時(shí)我們常用的主要有3 個(gè)命令sar、iostat 和vmstat, 它們是從不同側面反映當前系統的性能,sar 是針對系統整體性能的反映,iostat 是針對系統I/O 性能的反映,vmstat 是針對系統內存和CPU 使用狀況的反映。下面我們一一進(jìn)行分析說(shuō)明。 
2.4.1. Sar
sar 是UNIX 系統提供的一個(gè)標準的系統性能報告工具,它有一些列的參數,一部分參數因UNIX 系統的不同而不同。我們主要用sar 命令來(lái)觀(guān)察系統的整體性能。
使用方法: sar 60 60
說(shuō)明:第一個(gè)數字代表采樣的時(shí)間間隔,這里定為60 秒 
第二個(gè)數字代表采樣的次數,這里定為60 次
這樣我們就能看到系統從現在開(kāi)始一個(gè)小時(shí)內的系統性能報告(1 分鐘采樣1 次)
輸出結果:
AIX s7a 3 4 000946594C00 11/23/01 
13:55:53 %usr %sys %wio %idle 
13:55:54 14 2 84 0 
13:56:54 21 4 63 12 
13:57:54 24 2 68 6
13:58:54 12 1 86 0 
13:59:54 10 2 86 2 
14:00:54 14 2 64 20 
14:01:54 10 1 11 79
14:02:54 18 1 56 26 
14:03:54 14 2 74 10 
14:04:54 9 2 76 13 
14:05:54 10 2 77 10 
14:06:54 11 4 83 2 
14:07:54 12 1 72 16 
14:08:54 6 2 77 16 
t14:09:54 23 3 63 11 
14:10:54 26 2 61 11
14:11:54 10 2 67 21 
14:12:54 32 2 65 0 
14:13:54 36 1 52 10 
14:14:54 31 3 9 57 
14:15:54 36 3 60 0 
14:16:54 35 3 56 6 
14:17:54 27 3 70 0
14:18:54 31 4 61 4 
14:19:54 34 1 54 11 
14:20:54 26 0 6 67 
14:21:54 0 0 0 100 
Average 20 2 60 17 
說(shuō)明:標準sar 命令結果顯示如圖的五列內容
第一列:說(shuō)明采樣的系統時(shí)間 
%usr:用戶(hù)進(jìn)程占用整個(gè)系統CPU 的百分比
%sys:系統進(jìn)程占用整個(gè)系統CPU 的百分比 
%wio:I/O 等待占用整個(gè)系統CPU 的百分比 
%idle:空閑占用整個(gè)系統CPU 的百分比 
其中%usr + %sys + %wio+ %idle=100% 
可以通過(guò)觀(guān)察%idle 的值來(lái)確定當前整個(gè)系統的繁忙程度,該值越小說(shuō)明系統 WH越繁忙。當%wio 值持續大于15%時(shí)說(shuō)明系統的I/O 可能成為瓶頸。當%idle 值持續是零,并且%sys 值很高且大于%usr 的值,說(shuō)明系統過(guò)多的使用交換區,即有可能內存不足。 
從以上觀(guān)察系統性能的結果可以分析出,系統CPU 存在大量I/O 等待,即系統I/O 性能比較低,I/O 成為系統性能的瓶頸。
相對用戶(hù)和系統本身占用的CPU 資源平均20%,因此,現有CPU 資源可以滿(mǎn)足使用需要。
2.4.2. iostat D
iostat 是AIX 系統提供的一個(gè)系統I/O 性能報告工具??梢杂^(guān)察系統I/O 設備的吞吐率。
使用方法: iostat -d hdiskx 60 60 
說(shuō)明:-d hdiskx 可以選擇具體的磁盤(pán) 
第一個(gè)數字代表采樣的時(shí)間間隔,這里定為60 秒 
第二個(gè)數字代表采樣的次數,這里定為60 次
這樣我們就能看到系統從現在開(kāi)始一個(gè)小時(shí)內的系統性能報告(1 分鐘采樣1 次)
輸出結果:
Disks: % tm_act Kbps tps Kb_read Kb_wrtn 

hdisk2 98.0 4808.0 267.0 4804 4 
hdisk2 95.0 5164.0 301.0 5164 0
hdisk2 79.8 4137.7 266.3 4148 0
hdisk2 64.0 3220.0 214.0 3220 0 
hdisk2 25.0 1112.0 78.0 1112 0 
hdisk2 34.0 1692.0 116.0 1692 0 
hdisk2 71.0 3536.0 236.0 3496 40 
hdisk2 67.0 3792.0 251.0 3792 0 
hdisk2 80.0 3416.0 238.0 3416 0 
hdisk2 74.0 3936.0 265.0 3936 0 
hdisk2 72.0 3544.0 238.0 3544 0
hdisk2 79.0 3176.0 223.0 3140 36 
hdisk2 74.0 2912.0 197.0 2908 4 
hdisk2 69.0 3460.0 227.0 3460 0 
hdisk2 70.0 3348.0 230.0 3344 4 
hdisk2 68.0 3944.0 258.0 3944 0 
hdisk2 97.0 1372.0 139.0 552 820 
hdisk2 99.8 638.4 111.7 64 576 
hdisk2 100.0 536.0 115.0 84 452 
hdisk2 100.0 524.0 103.0 84 440 
hdisk2 100.0 536.0 101.0 148 388 
hdisk2 100.0 660.0 127.0 148 512 
hdisk2 100.0 516.0 104.0 132 384 
說(shuō)明:iostat 命令結果顯示如圖的六列內容
Disks: 所觀(guān)察的磁盤(pán)名稱(chēng) 
% tm_act :設備使用率的百分比 
Kbps :設備每秒種讀、寫(xiě)的KB 數 
tps :設備每秒種讀、寫(xiě)請求的次數 
Kb_read :設備每秒種讀的KB 數 
Kb_wrtn :設備每秒種寫(xiě)的KB 數
從以上觀(guān)察系統性能的結果可以分析出,用作數據庫的磁盤(pán)hdisk2 I/O 非常繁忙,最高時(shí)達到了100%,磁盤(pán)讀寫(xiě)率最高5M/S, 平均3M/S, 可以判斷磁盤(pán)讀寫(xiě)能力較差,這主要有兩方面的原因:現有磁盤(pán)陣列的磁盤(pán)本身讀寫(xiě)慢( 7200 轉); RAID卡沒(méi)有讀cache。
2.4.3. vmstat 
vmstat 是AIX 系統提供的一個(gè)綜合性觀(guān)察系統性能的工具,包括觀(guān)察系統核心線(xiàn)
程、內存、交換區、系統調用及CPU 的運行情況。
使用方法:vmstat 60 60 
說(shuō)明:第一個(gè)數字代表采樣的時(shí)間間隔,這里定為60 秒 
第二個(gè)數字代表采樣的次數,這里定為60 次 
這樣我們就能看到系統從現在開(kāi)始一個(gè)小時(shí)內的系統性能報告(1 分鐘采樣1 次)
輸出結果:
kthr memory page faults cpu 
----- ----------- ------------------------ ------------ -----------
r b avm fre re pi po fr sr cy in sy cs us sy id wa
0 1 161419 645 0 0 0 0 0 0 1044 1973 1084 20 2 0 78 
1 1 161419 645 0 0 0 0 0 0 1024 2106 1104 24 2 2 72 
1 1 161615 430 0 0 0 0 0 0 1016 4244 1009 21 2 0 77 
1 1 161099 1000 0 0 0 0 0 0 1051 2517 1241 17 2 0 82 
0 1 160957 1161 0 0 0 0 0 0 988 2367 1225 16 2 0 82
1 1 160424 1762 0 0 0 0 0 0 967 3263 1173 45 4 0 51
2 1 160424 1762 0 0 0 0 0 0 1008 1920 1133 23 2 1 74
0 1 160192 2034 0 0 0 0 0 0 990 2666 1295 18 2 3 78 
0 1 160329 1878 0 0 0 0 0 0 958 4974 1444 14 2 3 82 
0 1 160449 1739 0 0 0 0 0 0 1053 4875 1288 10 2 4 84 
0 1 160454 1733 0 0 0 0 0 0 1025 4315 2830 30 4 0 66 
1 1 160455 1732 0 0 0 0 0 0 1042 2824 1741 13 2 1 84 
0 1 160456 1731 0 0 0 0 0 0 997 2207 1342 10 3 1 87 
0 1 160633 1542 0 0 0 0 0 0 1026 4433 1295 12 2 1 86 
0 1 160543 1626 0 0 0 0 0 0 1039 5321 1412 13 2 1 83 
1 1 159998 2221 0 0 0 0 0 0 964 3357 1499 22 3 3 72 
1 1 159876 2362 0 0 0 0 0 0 1015 2625 1423 13 1 2 84 
1 1 159876 2361 0 0 0 0 0 0 947 2150 1288 12 2 2 84
1 1 159879 2357 0 0 0 0 0 0 991 2058 1184 9 2 2 87
0 1 159879 2357 0 0 0 0 0 0 996 2208 1309 21 1 2 76 
說(shuō)明:
kthr r : 在運行隊列中的核心線(xiàn)程的個(gè)數 
b : 在等待隊列中的核心線(xiàn)程的個(gè)數
memory avm : 正在使用的內存的頁(yè)數
fre : 空閑的內存的頁(yè)數 
page re : 內存交換的總頁(yè)數
pi : 內存交入的總頁(yè)數
po : 內存交出的總頁(yè)數 
fr : 空閑的交換頁(yè) 
sr : 頁(yè)交換算法掃描過(guò)的頁(yè)數 
cy :頁(yè)交換算法鎖的循環(huán)數 
faults in :設備中斷
sy : 系統調用
cs : 核心線(xiàn)程上下文切換 
cpu us : 用戶(hù)進(jìn)程占用的CPU 時(shí)間
sy : 系統進(jìn)程占用的CPU 時(shí)間 
id : 系統空閑的CPU 時(shí)間 
wa: 系統I/O 等待的時(shí)間 
從以上觀(guān)察系統性能的結果可以分析出,系統還沒(méi)有用到交換區的空間,這說(shuō)明現有內存可以滿(mǎn)足現有應用運行的需求,但空閑內存數不多,在用戶(hù)持續增長(cháng)的情況下有可能導致內存不足,應考慮適當增加內存容量。
3. 程序及數據的性能調整 
3.1. 索引
   在數據庫中,索引對效率的影響可以說(shuō)是決定性的。所以,索引使用的好壞直接影響系統的效率。每一索引的建立都要根據系統的使用綜合考慮,哪些語(yǔ)句使用最頻繁,這些語(yǔ)句的where 條件是什么,對當前表的更新頻率如何。在索引的建立過(guò)程中,能夠建成unique 索引的,最好建成unique 索引,舉例說(shuō)明:假設在業(yè)務(wù)系統中,check_info 表是核保信息表,有保單號(bm_cert)字段,在投保單登錄前,此字段無(wú)值。若將此字段置為空,則登錄前的投保單的保單號(bm_cert)均為空,就不能建唯一索引。此時(shí)若改變策略,將投保單時(shí)的保單號置為投保單號,(投保單號與保單號不會(huì )重復),則bm_cert 字段就可建唯一索引,大大提高了連表查詢(xún)速度。對唯一索引可根據需要建成聚類(lèi),語(yǔ)法如下:
create cluster index id_person on person(insure_nu);
alter index id_person to cluster 
alter index id_person to not cluster 
聚類(lèi)使數據的物理存儲順序與索引一致,減少取數的讀盤(pán)次數,從而提高效率。
3.2. 關(guān)于with hold
   在游標中,如果在循環(huán)體內使用了事物,該游標的聲明必須使用with hold 。否則該游標在事物后會(huì )被關(guān)閉。為此,可能習慣在聲明游標時(shí)加上with hold,不管內部是否有事物。這種做法對單處理器機器可能沒(méi)什么影響,但對多處理器機器就有影響了。 因為使用with hold 后,就不能使用并行查詢(xún)。也就是說(shuō),用了with hold 后,pdq 不能起作用。因此,對于游標內未使用事物的,建議最好不要使用with hold。
3.3. 關(guān)于隔離級別
隔離級別設成臟讀,可提高查詢(xún)速度。若對某表查詢(xún),而該表的更新頻率較高,這時(shí)在查詢(xún)前設置set isolation to dirty read 可使查詢(xún)速度大大提高。但要注意臟數據。有兩種情況可以這樣使用:
(1) 不怕讀到臟數據,有臟數據也沒(méi)有關(guān)系。 3#.6S
(2) 確信讀不到臟數據。例如,假設在業(yè)務(wù)系統中,對rtdz2(單證狀態(tài)表)表的更新比較頻繁,而且此表的記錄數也比較多,在很多情況下又要對該表進(jìn)行實(shí)時(shí)查詢(xún)。在更新時(shí)要鎖記錄,那么查詢(xún)只好set lock mode to wait ,這樣查詢(xún)速度將會(huì )受到很大影響。只好將隔離級別設成臟讀。為了保證實(shí)時(shí)數據不是臟數據,那么我們必須確保一點(diǎn):系統中所有對rtdz2 的更新的語(yǔ)句都在事物的最后一句。而業(yè)務(wù)系統中已經(jīng)做到了這一點(diǎn)。事實(shí)證明,此處效率的提高是顯著(zhù)的。
3.4. 關(guān)于事物 
   事物的作用相信大家都明白,這里就不再說(shuō)明了。但在使用事物的時(shí)候,為了盡量減少鎖表時(shí)間,事物中的語(yǔ)句應盡量少。因此在begin work 內最好只有更新語(yǔ)句update, delete , insert 等。而一些預備工作如查詢(xún),計算等都應放在begin work 外。
3.5. 關(guān)于數據分割 
當某一表的數據量較大時(shí),可考慮用數據分割的方式來(lái)提高效率。數據分割就是將某一表的數據根據一定的條件放入不同的dbspace ,若這些不同的dbspace 在不同的物理盤(pán)上效果會(huì )更好。數據分割的用法如下所示:
create table rta14

bm_cert char(15), 
bm_type char(6), 
bm_way char(1), 
je_pay decimal(12,2), 
rq_payto date,
rq_lqstart date, 
flag char(5), 
age_min smallint, 
age_max smallint,
lj_pay decimal(16,2) 

fragment by expression
((bm_cert <= '002999999999999' ) OR (bm_cert >= '990999999999999' ) ) in datadbs1 , 
((bm_cert > '002999999999999' ) AND (bm_cert <= '099999999999999' ) ) in datadbs2 , 
((bm_cert > '099999999999999' ) AND (bm_cert <= '599999999999999' ) ) in datadbs3 ,
((bm_cert > '599999999999999' ) AND (bm_cert < '990999999999999' ) ) in  datadbs4
extent size 38566 next size 3856 lock mode page;
3.6. 關(guān)于語(yǔ)句寫(xiě)法 
語(yǔ)句的效率與SQL 語(yǔ)句的寫(xiě)法有很大關(guān)系。在幾種寫(xiě)法中選擇一個(gè)合適的寫(xiě)法相當重要,有時(shí)效率會(huì )急劇提高。因此,在效率有問(wèn)題的地方多檢查自己語(yǔ)句的寫(xiě)法,有可能會(huì )取得重大突破。以下是一些實(shí)例:
(1).在保單表中查找“003”險種的“0101”區站的數據
select * from rta1 where bm_cert[1,7]=”0030101”
該語(yǔ)句運行前設置set explain on,運行后查看sqexplain.out 結果如下:
QUERY:
select * from rta1 
where bm_cert[1,7]="0030107" 
Estimated Cost: 1
Estimated # of Rows Returned: 1 
1) hsx.rta1: INDEX PATH 8
(1) Index Keys: bm_cert 
Lower Index Filter: hsx.rta1.bm_cert[1,7] = '0030107' 
顯示的搜索路徑為索引路徑,但實(shí)際上效率很低?,F改為如下寫(xiě)法:
select * from rta1 where bm_cert > = ”00301010000000000000” 
and bm_cert<=”00301019999999999999”
該語(yǔ)句運行前設置set explain on,運行后查看sqexplain.out 結果如下: 
QUERY: 
select * from rta1 where bm_cert >= "003010100000000" 
and bm_cert<=”00301019999999999999” 
Estimated Cost: 1
Estimated # of Rows Returned: 3
1) hsx.rta1: INDEX PATH 
(1) Index Keys: bm_cert 
Lower Index Filter: hsx.rta1.bm_cert >= '003010100000000' 
顯示與第一個(gè)寫(xiě)法無(wú)明顯差別,實(shí)際上第二種寫(xiě)法效率遠遠高于第一種。實(shí)際測試第一種寫(xiě)法的時(shí)間需要2 分41 秒而第二種寫(xiě)法的執行時(shí)間只需14 秒。 

因此, 程序中最好不要使用bm_cert[x,y]=”???” 這種形式, 而改為 bm_cert>=”???” 這種形式。
(2). 在程序中,我們經(jīng)常做這樣的工作,先判斷表內是否有該條數據,如果有就 update 該條數據,否則就插入一條。一般都寫(xiě)成如下形式:
select .. from . where key=t_key 
if status=notfound then 
insert into .. 
else 
update .. 
end if 
實(shí)際上,寫(xiě)成如下形式效率更高 
update . where key=t_key 
if status=0 and sqlca.sqlerrd[3]=0 then 
insert into ..
end if 
因為當該條數據存在時(shí),只做一次寫(xiě)操作。 
(3). 在應用系統中有這樣一條SQL 語(yǔ)句。 
select print_name from validate_item 
where (acc_book_type = t_acc_book_type 
and acc_book_code = t_acc_book_code 
and (center_code = t_center_code or center_code=”000000”) 
and item_code = t_item_code 
and direction_idx = t_dir_idx_val1 
and direction_other = t_dir_oth_val1) 
( validate_item 表中acc_book_type , acc_book_code , center_code , item_code , direction_idx , direction_other 為唯一索引) 該語(yǔ)句的效率不高,改寫(xiě)為以下形式后效率得到了很大提高。在存儲過(guò)程中,上面的寫(xiě)法此存儲過(guò)程執行需用時(shí)1 分多鐘,改為下面的寫(xiě)法后,用時(shí)僅需1 秒.
select print_name 
into t_str 
from validate_item 
where (acc_book_type = t_acc_book_type 
and acc_book_code = t_acc_book_code 
and center_code = t_center_code 
and item_code = t_item_code 
and direction_idx = t_dir_idx_val1
and direction_other = t_dir_oth_val1) 
or (acc_book_type = t_acc_book_type 
and acc_book_code = t_acc_book_code
and center_code = "000000" 
and item_code = t_item_code 
and direction_idx = t_dir_idx_val1 
and direction_other = t_dir_oth_val1); 
在SQL 語(yǔ)句中,where 條件中有or 的語(yǔ)句,where 條件盡量用大組合,而不要用小組合。 

3.7. 關(guān)于使用put , execute 來(lái)代替insert 提高效率在做數據轉換或登錄大批量數據時(shí),用put 或execute 替代insert ,將使效率大幅度提高。因為在循環(huán)體內,減少了對insert 的語(yǔ)法檢查及預處理的時(shí)間。 
Put 的用法如下:
let t_pre_1 = "insert into rta1 value"
"(?,?,?,?,?,?,?,?,?,?,"
"?,?,?,?,?,?,?,?,?,?,"
"?,?,?,?,?,?,?,?,?,?,"
"?,?,?,?,?,?,?,?,?,?,"
"?,?,?,?)" 
prepare pre_rta1_1 from t_pre_1
declare cur_ins_1 cursor for pre_rta1_1 
open cur_ins_1
循環(huán)體(while , for , foreach) 

put cur_ins_1 from p_rta1.* 

close cur_ins_1 
execute 的語(yǔ)法如下: 
let t_pre_1 = "insert into rta1 value"
"(?,?,?,?,?,?,?,?,?,?,"
"?,?,?,?,?,?,?,?,?,?,"
"?,?,?,?,?,?,?,?,?,?,"
"?,?,?,?,?,?,?,?,?,?,"
"?,?,?,?)" 
prepare pre_rta1_1 from t_pre_1 
循環(huán)體(while , for , foreach)

execute pre_rta1_1 using p_rta1.* 

使用put 必須注意以下內容:
u put 語(yǔ)句必須在事物中。 
u put 語(yǔ)句執行完后,馬上從庫中select 不一定能取到數
3.8. 使用隔離級別(isolation) 
共有四種隔離級別 
Dirty read 
Commited read 
Cursor stability 
Repeatable read 
<一> dirty read 
可能讀到未提交(commited)的記錄,可能讀到最后被回滾的記錄,該記錄是一個(gè)phantom。 在一些查詢(xún)中,使用此隔離級別,可提高效率。因為不受其他進(jìn)程鎖表,鎖記錄的影響。 

<二> committed read
讀到的數據均為提交后的數據。兩個(gè)進(jìn)程可同時(shí)update 同一條記錄。(缺省的隔離級別)
<三> cursor stability 
當隔離級別設置為cursor stability 時(shí),在某一游標內,當前記錄不能被其他
的進(jìn)程update,delete ,但游標內其他的記錄可被其他進(jìn)程update ,delete 。
<四> repeatable read 
當隔離級別設置為repeatable read 時(shí),在某一游標內有兩種情況
1. 該游標的where 子句有索引,則滿(mǎn)足條件的所有記錄均不能被其他進(jìn)程 
update ,delete 。(該索引的搜索樹(shù)的所有節點(diǎn))
2. 該游標的where 子句不在索引上,則該表的所有記錄均不能被其他進(jìn)程 update,delete 。
所以,當使用repeatable read 時(shí),最好有索引,否則相當于鎖表,極大損害系統效率。 
3.9. 使用優(yōu)化器(update statistics)
對表,存儲過(guò)程的優(yōu)化的語(yǔ)法如下: 
update statistics [low ] for procedure .. 
[ medium] for table tablename [colname] resolution percent . conf 
[high ]
優(yōu)化使系統表的信息與實(shí)際一致,使搜索樹(shù)的路徑最優(yōu)。 
同時(shí),整理索引樹(shù)。
例: 
1. update statistics for table 
2. update statistics for procedure 
3. update statistics for table rta1(bm_cert)
4. update statistics high for table rta1(bm_cert) resolution 0.5
5. update statistics medium for table rta1 resolution 0.5 0.89 
3.10. 使用復合索引 
建復合索引的原則:
1. 查詢(xún)語(yǔ)句中不定的字段盡量放在復合索引的后面。 
如有查詢(xún)語(yǔ)句select * from person where name=”王艷” sex=”0” and birthday >”1982/12/1” 
則索引建成如下形式效率最好。
Create index idx_person on person(name, ,birthday ,sex) 
而不要建成 
Create index idx_person on person(birthday,sex,name) 
2. 取值范圍大,可能值多的盡量放在復合索引的前面。 
性別只有兩種取值“男“”女“ ,最好放在最后。 
姓名可能值最多,最好放在最前,則索引為:
Create index idx_person on person(name,birthday,sex) 若與第一條有沖突,第一條優(yōu)先。 
3. 有單獨作為條件的,最好放在前面。
如果如下的sql 語(yǔ)句出現的頻率較高 
select * from person where name >” “ 
或select * from person where name matches “ “ 
則name 字段最好放在索引的前面。 
復合索引的建立必須根據整個(gè)系統的sql 語(yǔ)句,均衡的考慮。
4. INformIX 數據庫數據復制(CDR) 
4.1. 基本概念 
4.1.1. 數據復制類(lèi)型:同步、異步
l  同步:源數據更新同時(shí)馬上更新目標數據,系統使用2 步提交技術(shù)保證了數據的完整性。 
2 步提交要求目標主機和網(wǎng)絡(luò )環(huán)境有較高的可靠性。即任何時(shí)候都是可用的。 
l  異步:目標數據的復制可以根據應用要求設定,但最終要同步所有的數據。在一般的開(kāi)放系統中,異步方式更為常用,因為它忽略了主機和網(wǎng)絡(luò )的性能,這往往是一些系統的致命問(wèn)題。
異步復制又分為如下幾種模式:
1) 主從模式:所有數據更新都是從原到目標,是單向數據復制。如圖示:
2) 工作流模式:數據在服務(wù)器間一一流轉,也是單向數據復制。如圖示:
3) 任意更新模式:所有定義的數據庫之間都互相具有讀寫(xiě)權限,它的弊端是容易引起復制沖突,當然CDR 也提供了沖突解決規則。如圖示:
4.1.2. 復制機制:基于觸發(fā)器和基于日志 s5NT3uZ
l  觸發(fā)器方式:這種將與系統競爭對數據庫表讀寫(xiě)的資源,對正常業(yè)務(wù)效率有較大影響。并且需要通過(guò)應用保證數據完整性。該種方式不可取。
l  日志方式:由于是采取捕獲事物信息的方式,因此不會(huì )與系統競爭對數據庫表讀寫(xiě)資源,效率高。且由系統保持數據一致性、完整性。并有可集中管理的優(yōu)勢。 
4.1.3. CDR 的局限性
l  僅提供IDS 之間的復制 
l  不能與HDR 并行使用。 
l  復制的表不能用view 
l  一個(gè)數據庫服務(wù)器只能參與一個(gè)復制服務(wù)
一旦建立了復制服務(wù)器:
l  不能用drop table;rename talbe; alter fragment 等SQL 
l  復制的表必須有primary key,且不能修改 
l  不能對字段增刪改 
l  不能建立聚合索引 
4.1.4. CDR 如何實(shí)現 
l 復制過(guò)程主要包括4 個(gè)部分: 
1. 捕獲事物 
CDR 使用基于日志的事物捕獲機制獲得事物信息。這種方式不會(huì )與正常事物競爭對表的存取,所以能獲得較好的性能。CDR 讀log 后加上標志,并將它傳送到下一步,復制評估。
2. 復制評估 
CDR 要確定每一條記錄的最后值及更新發(fā)生時(shí)間,以便決定是否進(jìn)行復制。評估是并行處理的以保證較高性能。評估后CDR 將數據置于消息隊列。 
3. 數據分發(fā)
消息隊列存取方式可以保證所有數據都可以準確到達目標SERVER,它可以忽略主機或網(wǎng)絡(luò )的狀態(tài)。當網(wǎng)絡(luò )發(fā)生故障數據存放在本地發(fā)送消息隊列中,當網(wǎng)絡(luò )恢復后消息隊列再自動(dòng)將數據分發(fā)。 
4. 數據同步 :
CDR 用同步處理保證數據能正確的復制到目標SERVER,當復制數據正確存儲到目標SERVER 后,目標SERVER 向源SERVER 發(fā)送確認信息。
l  CDR 的幾個(gè)組成部分:
1. 復制SERVER:由一個(gè)dbserver 組成,與成員SERVER 可以在不同主機或同一主機上。 
2. 復制對象:包括database table columns 還有一些option 如沖突解決規則和范圍。 
3. 成員:目標dbserver database table columns  限制條件:必須有primary key 只能復制單表;不能使用Join 和subquery.
4. 全局目錄:是管理復制功能的一系列table , 全局目錄在每個(gè)dbserver 都有一份,可集中管理。 
l  復制規劃 
1. 確定系統拓撲結構,并制作如“三.復制實(shí)例”中的表3-1,拓撲如圖示:采用樹(shù)型主從模式。 
2. 有關(guān)邏輯日志:邏輯日志的大小應至少容納一次復制所復制的數據。
3. 有關(guān)消息隊列:消息隊列是一個(gè)dbspace,它的大小不僅與邏輯日志有關(guān),而且與網(wǎng)
絡(luò )中斷期間所需緩沖的數據多少有關(guān)。(Onconfig 中定義)
4. 影子表:如果定義了沖突解決規則,就要定義影子表,其大小根據規則不同而不同,
如基于時(shí)間戳的沖突解決規則需要是復制表的2 倍。 
5. 假脫機目錄:可以指定事物中斷后數據暫存目錄(缺?。?tmp)。
6. 復制線(xiàn)程個(gè)數:是個(gè)均衡值即要保證性能也不能浪費(onconfig 中定義)。 
7. 網(wǎng)絡(luò )帶寬: 
流量計算如公式:(#transactions per hour)*(#bytes)*(#sites)*130% 
8. 應用分析:估算每天大約有多少數據增刪改,分析傳送時(shí)間安排。
9.確定要復制的database 用的是unbuffer 方式的邏輯日志。
4.2. CDR 配置實(shí)例
4.2.1. 系統環(huán)境準備 
1.數據復制源主機:IBM 370 SCO 5.0.5 IDS 7.31.UC2 CBPS 7 
2.數據復制目的主機:IBM 250 SCO 5.0.5 IDS 7.31.UC2 
3.檢查邏輯日志(logical log)的大小 
4.建立發(fā)送、接受隊列dbspace 
5.確定參與復制的Informix Server、database 及table 
cdr 工作表:
Host name Informixserver group database table 
Picc21 ld370222_tcp Grp_picc21 Picc2 * 
Ibm500 ld370220_tcp Grp_ibm500 Picc2 * 
省公司dbserver
地市1 dbserver 地市2 dbserver 地市3 dbserver 
4.2.2. 確定復制環(huán)境 
1. 復制模式:?jiǎn)蜗驍祿椭?br>2. 復制時(shí)間間隔:立即更新 
4.2.3. 建立picc21 和ibm500 的數據庫之間的互訪(fǎng)
1) 分別在picc21 和scosysv 上編輯$INformIXDIR/etc/sqlhosts 文件如下: 
grp_picc21 group - - i=1
ld370222_shm onipcshm picc21 ls370222_shm g=grp_picc21 
ld370222_tcp ontlitcp picc21 ls370222_tcp g=grp_picc21 
grp_ibm500 group - - i=2 
ld370220_shm onipcshm ibm500 ls370220_shm g=grp_ibm500 
ld370220_tcp ontlitcp ibm500 ls370220_tcp g=grp_ibm500
2) 分別在picc21 和ibm500 上的/etc/hosts 文件包括如下2 項: 
176.176.21.78 picc21 picc21 
176.176.66.103 ibm500 
3) 分別在picc21 和ibm500 上的/etc/services 文件包括如下2 項: 
ls370222_tcp 5889/tcp 
ls370220_tcp 3720/tcp 
4) 在picc21 上的/etc/hosts.equiv 文件包括如下1 項: 
ibm500 
5) 在ibm500 上的/etc/hosts.equiv 文件包括如下1 項: 
picc21
以上各步完成picc21 和ibm500 的數據庫互訪(fǎng),可以通過(guò)dbaccess-connect 驗證。 
4.2.4. 定義replicate server 
執行上$INformIXDIR/cdr/crtser.sh 
腳本內容如下:
cdr define server -s sendq -r recvq -A /tmp/ats -R /tmp/ris -I grp_picc21 
注:確保picc21 上的dbspaces sendq 和recvq 已建立
確保picc21 上的/tmp/ats 和/tmp/ris 目錄已建立 
4.2.5. 確定復制服務(wù)器已建立 
執行picc21 上執行cdr list server
系統顯示如下說(shuō)明replicate server 已建立:
SERVER ID STATE STATUS CONNECTION CHANGED 

grp_picc21 1 Active Local 
注1. replicate server 建立時(shí)會(huì )在picc21 上建立一個(gè)名為syscdr 的database 用來(lái) 
管理所有的repliate 信息,因此也可以通過(guò)用dbaccess 命令看是否建立了
syscdr 來(lái)確定replicate server 是否正確定義。
注2. replicate 必須用DBSERVER GROUP 代替DBSERVER ( DBSERVER GROUP 在 
sqlhosts 中定義)
4.2.6. 增加連接成員: 
執行picc21 上$INformIXDIR/cdr/crtmeb.sh
腳本內容如下: TuhdxFz&
cdr define server -s datadbs -r datadbs -A /tmp/ats -R /tmp/ris 
--connect=grp_ibm500 --init --sync=grp_picc21 grp_ibm500 
注:確保ibm500 上的datadbs 和datadbs 已建立 
確保ibm500 上的/tmp/ats 和/tmp/ris 目錄已建立 
4.2.7. 確定成員已連接
執行picc21 上執行cdr list server 
系統顯示如下說(shuō)明新成員已連接:
SERVER ID STATE STATUS CONNECTION CHANGED
grp_ibm500 2 Active Connected Dec 7 14:54:17 2001 
grp_picc21 1 Active Local 
1. 在增加一個(gè)成員時(shí)也會(huì )在ibm500 上的database server 上建立一個(gè)名為
syscdr 的database,因此除了用cdr list server 外,也可以用dbaccess 命 
令看是否建立了syscdr 來(lái)確定一個(gè)成員是否正確加入。
2. 確保picc21 和ibm500 已做時(shí)間同步(參見(jiàn)附錄) 
4.2.8. 定義replicate 
執行picc21 上$INformIXDIR/cdr/repdef.sh 
腳本內容如下: Zq/
cdr def repl picc2_a_charge_ratio -C ignore -S row -T -R "PO
picc2@grp_picc21:cbps.a_charge_ratio" "select * from a_charge_ratio" "RO
picc2@grp_ibm500:cbps.a_charge_ratio" "select * from a_charge_ratio" 
cdr def repl picc2_a_comm_ratio -C ignore -S row -T -R "PO
picc2@grp_picc21:cbps.a_comm_ratio" "select * from a_comm_ratio" "RO 
picc2@grp_ibm500:cbps.a_comm_ratio" "select * from a_comm_ratio"
4.2.9. 確定replicate 建立 
執行picc21 上執行cdr list repl 
系統顯示如下說(shuō)明replicate 已建立(但為激活):
REPLICATE STATE CONFLICT FREQUENCY OPTIONS 
picc2_a_charge_ratio INACTIVE ignore immediate row,ris,triggers 
picc2_a_comm_ratio INACTIVE ignore immediate row,ris,triggers 
4.2.10. 啟動(dòng)replicate 
執行picc21 上$INformIXDIR/cdr/repstart.sh 
腳本內容如下:
cdr start repl picc2_a_charge_ratio 
cdr start repl picc2_a_comm_ratio
4.2.11. 確定replicate 已啟動(dòng) 
執行picc21 上執行cdr list repl 
系統顯示如下說(shuō)明replicate 已激活: 
REPLICATE STATE CONFLICT FREQUENCY OPTIONS 

picc2_a_charge_ratio ACTIVE ignore immediate row,ris,triggers 
picc2_a_comm_ratio ACTIVE ignore immediate row,ris,triggers 
4.2.12. 關(guān)閉replicate 
執行picc21 上$INformIXDIR/cdr/repstop.sh 
腳本內容如下:
cdr stop repl picc2_a_charge_ratio 
cdr stop repl picc2_a_comm_ratio 
4.2.13. 維護CDR ?/@#{J
CDR 配置完成后,系統將按照配置自動(dòng)完成數據復制功能。根據需要也可以停止CDR 和
重新啟動(dòng)CDR,或者修改CDR 的配置。下面列出幾種需要對CDR 進(jìn)行維護的情況:
1. 使用dbexport 卸載數據庫時(shí),需要通過(guò)如下命令停止CDR
cdr stop 
2. 可以通過(guò)如下命令重新啟動(dòng)CDR 
cdr start 
3. 修改復制時(shí)間間隔時(shí),可以通過(guò)如下命令修改replicate 的配置 
cdr modify repl -a 24:00 repl_name 
注:將復制間隔修改為每天24:00 開(kāi)始復制
可以使用腳本$INformIXDIR/cdr/repmdf.sh 進(jìn)行成批修改
4. 需要停止某個(gè)replicate 時(shí),可以通過(guò)如下命令完成
cdr stop repl repl_name
注:可以使用腳本$INformIXDIR/cdr/repstop.sh 停止一批replicate 
5. 需要刪除某個(gè)replicate 時(shí),可以通過(guò)如下命令完成 
cdr delete repl repl_name
注:可以使用腳本$INformIXDIR/cdr/repdel.sh 進(jìn)行成批修改 
6. 需要刪除replicate server 時(shí),可以通過(guò)如下命令完成 
cdr delete server server_name 
4.2.14. 監控CDR 工作情況 
1. 可以通過(guò)2.3、2.5 、2.7 章節中的命令分別監控replicate server、
participant 和replicate 的狀態(tài)是否正常。 
2. 通過(guò)查看/tmp/ats 和/tmp/ris 目錄,如有文件存在說(shuō)明有復制不成功的記錄,
通過(guò)vi 查看復制不成功的具體原因。
3. 通過(guò)查看$INformIXDIR/online.log 文件,判斷CDR 運行情況。 
4.2.15. CDR 出錯處理 
一旦有某個(gè)表的數據復制不成功, 完成如下步驟恢復該表的數據一致性:
1. Suspend 該表的復制 
2. 刪除該表在復制庫中的數據 
3. 從生產(chǎn)庫unload 該表數據,再在復制庫load 該表數據
4. resum 該表的復制 
4.3. CDR 的時(shí)間同步 
有關(guān)ntp(Network time protocol)的配置,必須在CDR 定義之前進(jìn)行。兩臺主機必須 
通過(guò)ntp 做時(shí)鐘同步,哪臺主機做ntp Server 是無(wú)所謂的。在跨平臺的情況配置有所不同 
這里介紹了兩種情況:2 臺SCO 主機和1 臺AIX、1 臺SCO
² 2 臺主機都是SCO 平臺
ntp Server 端:
1) 編輯/etc/ntp.conf(有可能無(wú)此文件,可以新建一個(gè)文件,其owner 和group 都是bin)
內容如下:
server 127.127.1.0 
2) 修改/etc/tcp 文件 
在/etc/tcp 文件中查xntpd 行,刪除tickadj 一行,下一行的xntpd 后加-g ,
ntp Client 端:
1) 編輯/etc/ntp.conf(有可能無(wú)此文件,可以新建一個(gè)文件,其owner 和group 都是bin)
內容如下:
peer (ntp Server 的IP 地址)如:peer 11.137.75.131
2) 修改/etc/tcp 文件 
在/etc/tcp 文件中查xntpd 行,保留tickadj 一行,下一行的xntpd 后加-g 
3)跟蹤兩臺主機ntp 是否同步成功:查/usr/adm 下的syslog
# tail -f syslog 
ntp Server 端應有ntp Server 啟動(dòng)的信息 
ntp Client 端應每隔5-10 分鐘有與ntp Server 握手的信息 
² 1 臺主機是SCO 平臺,1 臺主機是AIX 平臺 
1)server 端必須定義在A(yíng)IX 平臺上且/etc/ntp.conf 文件如下
server 127.127.1.0 
fudge 127.127.1.0 refid 
注:s7a 是time server 所在的主機名 
2)xntpd -g (或/etc/rc.tcpid 中加入該行,重啟機) 
3)查看兩臺主機是否同步:運行ntpqà readlist 
1. 存儲過(guò)程的使用 
公共模塊,用存儲過(guò)程代替函數,可使代碼統一。
Client /Server 模式,用存儲過(guò)程代替函數,減少client 端應用,減少傳輸量,提高效率。
在SQL 語(yǔ)句中,需要使用存儲過(guò)程處理復雜的事情。這一點(diǎn)在描述中使用的特別普遍。
2. 存儲過(guò)程的調用 
存儲過(guò)程有兩種調用方式 
(1). select getday( “1998/1/1”,1,”month”) from exec 
(2). Execute procedure getday(“1998/1/1”,1,”month”) 
注:exec 為一只有一條記錄的表 
當存儲過(guò)程以with resume 返回,返回值超過(guò)一列時(shí),只能用第二種調用方式。 
這兩種方式有一點(diǎn)區別,第二種方式執行的一定是存儲過(guò)程,第一種方式則不一定。
如下所示:
select mod(7,3) from exec 執行的是系統過(guò)程
execute procedure mod(7,4) 執行的是自己定義的存儲過(guò)程mod。
3. 存儲過(guò)程的調試 
存儲過(guò)程的調試通常采用兩種方法。
(1) 設置debug file ,以trace 方式。
(2) 用return .. with resume 方式調試。
例:1 
create procedure getday(t_day date,t_int int ,t_flag char(10)) returning date; 
define i int; 
define tt_day date; 
DEFINE ESQL,EISAM INT; 
DEFINE ETEXT CHAR(80); 
Set debug file to “sun.tmp”; 
let tt_day="18991231"
let i=0;
if t_flag="year" then 
while 1=1
on exception in(-1267) A|)
let i=i+1;
end exception 
let tt_day=t_day-i;
let tt_day=tt_day+t_int units year; 
trace tt_day; 
exit while; 
end while; 
elif t_flag="month" then 
while 1=1  
on exception in(-1267)  
let i=i+1;  
end exception  
let tt_day=t_day-i;  
let tt_day=tt_day+t_int units month; 
trace tt_day;  
exit while;  
end while;  
elif t_flag="day" then  
let tt_day=t_day+t_int units day;  
else  
let tt_day=t_day;  
end if; 
return tt_day;  
end procedure;  
例:2  
create procedure getday(t_day date,t_int int ,t_flag char(10)) returning date; 
define i int;  
define tt_day date;  
DEFINE ESQL,EISAM INT;  
DEFINE ETEXT CHAR(80);  
let tt_day="18991231";  
let i=0;  
if t_flag="year" then 
while 1=1 
on exception in(-1267) 
let i=i+1;
end exception  
let tt_day=t_day-i; 
let tt_day=tt_day+t_int units year; 
return tt_day with resume;
exit while;
end while; 
elif t_flag="month" then 
while 1=1 
on exception in(-1267) 
let i=i+1; 
end exception  
let tt_day=t_day-i; 
let tt_day=tt_day+t_int units month; 
return tt_day with resume; 
exit while; 
end while;
elif t_flag="day" then 
let tt_day=t_day+t_int units day; 
else 
let tt_day=t_day; 
end if; 
return tt_day; 
end procedure; 
4. 存儲過(guò)程中錯誤的捕獲 
在4gl 程序中,有whenever error continue 語(yǔ)句,屏蔽錯誤,在存儲過(guò)程中不能使用 
whenever error continue,但可以使用on exception 來(lái)捕獲錯誤,使存儲過(guò)程繼續執行。 
例1
create procedure get_pick_list(p_order_num int) returning int; 
define x integer; b
on exception in (-206) 
call log_error(-206); 
end exception with resume; 
select 
let x=y; 
return x; 
end procedure;  
例2 : 以下存儲過(guò)程用以計算時(shí)間,標準為向前靠,如“1998/1/31”  
日加一個(gè)月為“1998/2/28” 
create procedure getday(t_day date,t_int int ,t_flag char(10)) returning date;  
define i int;  
define tt_day date;  
DEFINE ESQL,EISAM INT;  
DEFINE ETEXT CHAR(80);  
let tt_day="18991231";   
let i=0;  
if t_flag="year" then  
while 1=1  
on exception in(-1267)  
let i=i+1; 
end exception  
let tt_day=t_day-i;  
let tt_day=tt_day+t_int units year;  
exit while;  
end while;  
elif t_flag="month" then 
while 1=1 No
on exception in(-1267)
let i=i+1;  
end exception   
let tt_day=t_day-i;  
let tt_day=tt_day+t_int units month;  
exit while;  
end while;  
elif t_flag="day" then 
let tt_day=t_day+t_int units day; 
else  
let tt_day=t_day; 
end if; 
return tt_day; 
end procedure; 
注:在存儲過(guò)程中,on exception 的使用有作用域,若使用在循環(huán)體內,其作用域為循環(huán)體, 
退出即退出本次循環(huán)。若使用在begin work 與commit work 內,其作用域為begin work 內,退出 
即退出該事物體。以下幾個(gè)實(shí)例給予說(shuō)明: 
例1:
create procedure get(t_day date,t_int int )
returning date;
define i int; 
define tt_day date; 
on exception in(-1267) ----此語(yǔ)句的作用域為整個(gè)存儲過(guò)程
let i=i+1; ----此語(yǔ)句必須為存儲過(guò)程的第一條語(yǔ)句 
end exception with resume; ------注意有with resume
set debug file to "sun.tmp";
let tt_day="18991231"
let i=0;
while 1=1
trace i;
trace tt_day; 
let tt_day=t_day-i;
let tt_day=tt_day+t_int units month; ---此處出錯后執行while 循
環(huán)外的第一條語(yǔ)句,即下面黑色字體的語(yǔ)句。若無(wú)with resume 則退出存儲過(guò)
程。 
trace "ok"
trace tt_day;
exit while;
end while;
trace "ok"; ---出錯后執行此語(yǔ)句
trace tt_day;
return tt_day;
end procedure; 

例2:
create procedure get(t_day date,t_int int ) 
returning date; 
define i int;
define tt_day date;
set debug file to "sun.tmp"
let tt_day="18991231";
let i=0; 
while 1=1 
on exception in(-1267) ----此語(yǔ)句的作用域為while 循環(huán)
let i=i+1; ----必須為while 循環(huán)內的第一條語(yǔ)句 
end exception; ------注意無(wú)with resume 
trace i; 
trace tt_day; 
let tt_day=t_day-i;
let tt_day=tt_day+t_int units month; ---此處出錯后執行while 循
環(huán)的下一循環(huán),相當于continue while。若有with resume 則執行下面一條語(yǔ) )
句,即黑色字體的語(yǔ)句。
trace "ok"
trace tt_day; 
exit while; 
end while;
trace tt_day;
return tt_day;
end procedure;
5. 存儲過(guò)程的效率 
系統中的存儲過(guò)程盡量放在一個(gè)extents 中,最好不要超過(guò)8 個(gè)extents. ( 注:extents 連
續的存儲空間),因此可定期將系統中的所有存儲過(guò)程重建。
存儲過(guò)程中使用set optimization low 可提高存儲過(guò)程的效率,前提是該存儲過(guò)程中所涉及
的表的結構,字段無(wú)任何改動(dòng)。
更為重要的是存儲過(guò)程的效率與存儲過(guò)程中的語(yǔ)句的寫(xiě)法很有關(guān)系。有時(shí)某一語(yǔ)句換一種寫(xiě) 
法,存儲過(guò)程的效率可得到極大提高。
例如:
create procedure true_rqstart( p_main_cert like rta1.bm_cert,p_kinds like
rta1.kinds ,t_rq_start like rta1.rq_start)
returning date; 
define p_rq_start date; 
define tt_rq_start date; 
define t_bm_min char(20);
define t_bm_max char(20); 
define p_bm_cert2 char (20); 
let p_rq_start = "1899/12/31"
le tt_bm_min = p_kinds[1,3] || p_main_cert[4,7] || "0000000000000"
let t_bm_max = p_kinds[1,3] || p_main_cert[4,7] || "9999999999999"
-- foreach select bm_cert2 into p_bm_cert2 from rta1f where
--bm_cert1=p_main_cert and bm_cert2>=t_bm_min and bm_cert2<= t_bm_max 
-- select rq_start into tt_rq_start from rta1 where bm_cert = p_bm_cert2; 
-- if tt_rq_start > p_rq_start then FST
-- let p_rq_start = tt_rq_start;
-- end if; 
--end foreach; 
--以上改為以下語(yǔ)句,效率顯著(zhù)提高,從30 分到不到1 秒
--該語(yǔ)句有多種寫(xiě)法,子查詢(xún),連表等,但在該存儲過(guò)程中,以下寫(xiě)法效率最高
foreach select bm_cert2 into p_bm_cert2 from rta1f where bm_cert1=p_main_cert
if p_bm_cert2[1,3]=p_kinds then 
select rq_start into tt_rq_start from rta1 where bm_cert = p_bm_cert2; 
if tt_rq_start > p_rq_start then 
let p_rq_start = tt_rq_start;
end if; 
end if;
end foreach; 
if p_rq_start = "1899/12/31" then 
if (t_rq_start + 35 units day ) >= today then 
return null; 
else 
return today; 
end if;
else 
if p_rq_start<>(t_rq_start -1 units year) and (t_rq_start-30 units SDP day)< (p_rq_start+1 units year) then 
let p_rq_start=p_rq_start+1 units year;
return p_rq_start; 
else 
return null; 
end if 
end if }
end procedure; 
6. 存儲過(guò)程內SQL 語(yǔ)句執行情況的判斷
   在4GL 程序中對SQL 語(yǔ)句執行情況的判斷可用status, sqlca 等來(lái)實(shí)現。但在存儲過(guò)程中,不能直接使用這些全局變量。但可通過(guò)dbinfo()來(lái)實(shí)現。
create procedure num_rows() 
returning int; 
define num_rows int; 
delete from orders where customer_num=104; 
let num_rows=dbinfo(“sqlca.sqlerrd[3]”); 
return num_rows;
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
常見(jiàn)面試題整理--數據庫篇(每位開(kāi)發(fā)者必備)
sql語(yǔ)句優(yōu)化
珍藏 | Java 崗位 【數據庫】 面試題及答案詳解
SQLITE的局限性
SQL Sever表變量和臨時(shí)表的比較
輕松提高千萬(wàn)級數據庫查詢(xún)效率
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久