日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Informix 高級培訓(xùn)教材...

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

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

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

三種寫的比較
1. 前臺寫:由sqlexec 親自刷新,前臺寫效率最低盡量避免。
2. LRU 寫:它是由LRU_MAX_DIRTY 和LRU_MIN_DIRTY 決定刷新的頻率,并且這種刷新操作是不徹底的,但有個好處是在刷新時不會終止用戶線索的操作。
3. Chunk 寫:這種寫實最徹底并且效率最高,但在寫的時候所有用戶線索不能進入臨界區(qū),因此檢查點會延遲用戶的響應(yīng)時間。
通過onstat -F 可以觀察以上三種寫的使用情況??梢酝ㄟ^改變LRU_MAX_DIRTY 和LRU_MIN_DIRTY 及CKPTINTVL 的值調(diào)整寫的方式。
2.4. 操作系統(tǒng)上的性能監(jiān)控 
IBM RS6000 系列小型機上的AIX 4.3.3 操作系統(tǒng)提供了一些列的系統(tǒng)性能分析工具,這些工具主要以命令行方式執(zhí)行,平時我們常用的主要有3 個命令sar、iostat 和vmstat, 它們是從不同側(cè)面反映當前系統(tǒng)的性能,sar 是針對系統(tǒng)整體性能的反映,iostat 是針對系統(tǒng)I/O 性能的反映,vmstat 是針對系統(tǒng)內(nèi)存和CPU 使用狀況的反映。下面我們一一進行分析說明。 
2.4.1. Sar
sar 是UNIX 系統(tǒng)提供的一個標準的系統(tǒng)性能報告工具,它有一些列的參數(shù),一部分參數(shù)因UNIX 系統(tǒng)的不同而不同。我們主要用sar 命令來觀察系統(tǒng)的整體性能。
使用方法: sar 60 60
說明:第一個數(shù)字代表采樣的時間間隔,這里定為60 秒 
第二個數(shù)字代表采樣的次數(shù),這里定為60 次
這樣我們就能看到系統(tǒng)從現(xiàn)在開始一個小時內(nèi)的系統(tǒng)性能報告(1 分鐘采樣1 次)
輸出結(jié)果:
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 
說明:標準sar 命令結(jié)果顯示如圖的五列內(nèi)容
第一列:說明采樣的系統(tǒng)時間 
%usr:用戶進程占用整個系統(tǒng)CPU 的百分比
%sys:系統(tǒng)進程占用整個系統(tǒng)CPU 的百分比 
%wio:I/O 等待占用整個系統(tǒng)CPU 的百分比 
%idle:空閑占用整個系統(tǒng)CPU 的百分比 
其中%usr + %sys + %wio+ %idle=100% 
可以通過觀察%idle 的值來確定當前整個系統(tǒng)的繁忙程度,該值越小說明系統(tǒng) WH越繁忙。當%wio 值持續(xù)大于15%時說明系統(tǒng)的I/O 可能成為瓶頸。當%idle 值持續(xù)是零,并且%sys 值很高且大于%usr 的值,說明系統(tǒng)過多的使用交換區(qū),即有可能內(nèi)存不足。 
從以上觀察系統(tǒng)性能的結(jié)果可以分析出,系統(tǒng)CPU 存在大量I/O 等待,即系統(tǒng)I/O 性能比較低,I/O 成為系統(tǒng)性能的瓶頸。
相對用戶和系統(tǒng)本身占用的CPU 資源平均20%,因此,現(xiàn)有CPU 資源可以滿足使用需要。
2.4.2. iostat D
iostat 是AIX 系統(tǒng)提供的一個系統(tǒng)I/O 性能報告工具??梢杂^察系統(tǒng)I/O 設(shè)備的吞吐率。
使用方法: iostat -d hdiskx 60 60 
說明:-d hdiskx 可以選擇具體的磁盤 
第一個數(shù)字代表采樣的時間間隔,這里定為60 秒 
第二個數(shù)字代表采樣的次數(shù),這里定為60 次
這樣我們就能看到系統(tǒng)從現(xiàn)在開始一個小時內(nèi)的系統(tǒng)性能報告(1 分鐘采樣1 次)
輸出結(jié)果:
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 
說明:iostat 命令結(jié)果顯示如圖的六列內(nèi)容
Disks: 所觀察的磁盤名稱 
% tm_act :設(shè)備使用率的百分比 
Kbps :設(shè)備每秒種讀、寫的KB 數(shù) 
tps :設(shè)備每秒種讀、寫請求的次數(shù) 
Kb_read :設(shè)備每秒種讀的KB 數(shù) 
Kb_wrtn :設(shè)備每秒種寫的KB 數(shù)
從以上觀察系統(tǒng)性能的結(jié)果可以分析出,用作數(shù)據(jù)庫的磁盤hdisk2 I/O 非常繁忙,最高時達到了100%,磁盤讀寫率最高5M/S, 平均3M/S, 可以判斷磁盤讀寫能力較差,這主要有兩方面的原因:現(xiàn)有磁盤陣列的磁盤本身讀寫慢( 7200 轉(zhuǎn)); RAID卡沒有讀cache。
2.4.3. vmstat 
vmstat 是AIX 系統(tǒng)提供的一個綜合性觀察系統(tǒng)性能的工具,包括觀察系統(tǒng)核心線
程、內(nèi)存、交換區(qū)、系統(tǒng)調(diào)用及CPU 的運行情況。
使用方法:vmstat 60 60 
說明:第一個數(shù)字代表采樣的時間間隔,這里定為60 秒 
第二個數(shù)字代表采樣的次數(shù),這里定為60 次 
這樣我們就能看到系統(tǒng)從現(xiàn)在開始一個小時內(nèi)的系統(tǒng)性能報告(1 分鐘采樣1 次)
輸出結(jié)果:
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 
說明:
kthr r : 在運行隊列中的核心線程的個數(shù) 
b : 在等待隊列中的核心線程的個數(shù)
memory avm : 正在使用的內(nèi)存的頁數(shù)
fre : 空閑的內(nèi)存的頁數(shù) 
page re : 內(nèi)存交換的總頁數(shù)
pi : 內(nèi)存交入的總頁數(shù)
po : 內(nèi)存交出的總頁數(shù) 
fr : 空閑的交換頁 
sr : 頁交換算法掃描過的頁數(shù) 
cy :頁交換算法鎖的循環(huán)數(shù) 
faults in :設(shè)備中斷
sy : 系統(tǒng)調(diào)用
cs : 核心線程上下文切換 
cpu us : 用戶進程占用的CPU 時間
sy : 系統(tǒng)進程占用的CPU 時間 
id : 系統(tǒng)空閑的CPU 時間 
wa: 系統(tǒng)I/O 等待的時間 
從以上觀察系統(tǒng)性能的結(jié)果可以分析出,系統(tǒng)還沒有用到交換區(qū)的空間,這說明現(xiàn)有內(nèi)存可以滿足現(xiàn)有應(yīng)用運行的需求,但空閑內(nèi)存數(shù)不多,在用戶持續(xù)增長的情況下有可能導(dǎo)致內(nèi)存不足,應(yīng)考慮適當增加內(nèi)存容量。
3. 程序及數(shù)據(jù)的性能調(diào)整 
3.1. 索引
   在數(shù)據(jù)庫中,索引對效率的影響可以說是決定性的。所以,索引使用的好壞直接影響系統(tǒng)的效率。每一索引的建立都要根據(jù)系統(tǒng)的使用綜合考慮,哪些語句使用最頻繁,這些語句的where 條件是什么,對當前表的更新頻率如何。在索引的建立過程中,能夠建成unique 索引的,最好建成unique 索引,舉例說明:假設(shè)在業(yè)務(wù)系統(tǒng)中,check_info 表是核保信息表,有保單號(bm_cert)字段,在投保單登錄前,此字段無值。若將此字段置為空,則登錄前的投保單的保單號(bm_cert)均為空,就不能建唯一索引。此時若改變策略,將投保單時的保單號置為投保單號,(投保單號與保單號不會重復(fù)),則bm_cert 字段就可建唯一索引,大大提高了連表查詢速度。對唯一索引可根據(jù)需要建成聚類,語法如下:
create cluster index id_person on person(insure_nu);
alter index id_person to cluster 
alter index id_person to not cluster 
聚類使數(shù)據(jù)的物理存儲順序與索引一致,減少取數(shù)的讀盤次數(shù),從而提高效率。
3.2. 關(guān)于with hold
   在游標中,如果在循環(huán)體內(nèi)使用了事物,該游標的聲明必須使用with hold 。否則該游標在事物后會被關(guān)閉。為此,可能習(xí)慣在聲明游標時加上with hold,不管內(nèi)部是否有事物。這種做法對單處理器機器可能沒什么影響,但對多處理器機器就有影響了。 因為使用with hold 后,就不能使用并行查詢。也就是說,用了with hold 后,pdq 不能起作用。因此,對于游標內(nèi)未使用事物的,建議最好不要使用with hold。
3.3. 關(guān)于隔離級別
隔離級別設(shè)成臟讀,可提高查詢速度。若對某表查詢,而該表的更新頻率較高,這時在查詢前設(shè)置set isolation to dirty read 可使查詢速度大大提高。但要注意臟數(shù)據(jù)。有兩種情況可以這樣使用:
(1) 不怕讀到臟數(shù)據(jù),有臟數(shù)據(jù)也沒有關(guān)系。 3#.6S
(2) 確信讀不到臟數(shù)據(jù)。例如,假設(shè)在業(yè)務(wù)系統(tǒng)中,對rtdz2(單證狀態(tài)表)表的更新比較頻繁,而且此表的記錄數(shù)也比較多,在很多情況下又要對該表進行實時查詢。在更新時要鎖記錄,那么查詢只好set lock mode to wait ,這樣查詢速度將會受到很大影響。只好將隔離級別設(shè)成臟讀。為了保證實時數(shù)據(jù)不是臟數(shù)據(jù),那么我們必須確保一點:系統(tǒng)中所有對rtdz2 的更新的語句都在事物的最后一句。而業(yè)務(wù)系統(tǒng)中已經(jīng)做到了這一點。事實證明,此處效率的提高是顯著的。
3.4. 關(guān)于事物 
   事物的作用相信大家都明白,這里就不再說明了。但在使用事物的時候,為了盡量減少鎖表時間,事物中的語句應(yīng)盡量少。因此在begin work 內(nèi)最好只有更新語句update, delete , insert 等。而一些預(yù)備工作如查詢,計算等都應(yīng)放在begin work 外。
3.5. 關(guān)于數(shù)據(jù)分割 
當某一表的數(shù)據(jù)量較大時,可考慮用數(shù)據(jù)分割的方式來提高效率。數(shù)據(jù)分割就是將某一表的數(shù)據(jù)根據(jù)一定的條件放入不同的dbspace ,若這些不同的dbspace 在不同的物理盤上效果會更好。數(shù)據(jù)分割的用法如下所示:
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)于語句寫法 
語句的效率與SQL 語句的寫法有很大關(guān)系。在幾種寫法中選擇一個合適的寫法相當重要,有時效率會急劇提高。因此,在效率有問題的地方多檢查自己語句的寫法,有可能會取得重大突破。以下是一些實例:
(1).在保單表中查找“003”險種的“0101”區(qū)站的數(shù)據(jù)
select * from rta1 where bm_cert[1,7]=”0030101”
該語句運行前設(shè)置set explain on,運行后查看sqexplain.out 結(jié)果如下:
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' 
顯示的搜索路徑為索引路徑,但實際上效率很低?,F(xiàn)改為如下寫法:
select * from rta1 where bm_cert > = ”00301010000000000000” 
and bm_cert<=”00301019999999999999”
該語句運行前設(shè)置set explain on,運行后查看sqexplain.out 結(jié)果如下: 
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' 
顯示與第一個寫法無明顯差別,實際上第二種寫法效率遠遠高于第一種。實際測試第一種寫法的時間需要2 分41 秒而第二種寫法的執(zhí)行時間只需14 秒。 

因此, 程序中最好不要使用bm_cert[x,y]=”???” 這種形式, 而改為 bm_cert>=”???” 這種形式。
(2). 在程序中,我們經(jīng)常做這樣的工作,先判斷表內(nèi)是否有該條數(shù)據(jù),如果有就 update 該條數(shù)據(jù),否則就插入一條。一般都寫成如下形式:
select .. from . where key=t_key 
if status=notfound then 
insert into .. 
else 
update .. 
end if 
實際上,寫成如下形式效率更高 
update . where key=t_key 
if status=0 and sqlca.sqlerrd[3]=0 then 
insert into ..
end if 
因為當該條數(shù)據(jù)存在時,只做一次寫操作。 
(3). 在應(yīng)用系統(tǒng)中有這樣一條SQL 語句。 
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 為唯一索引) 該語句的效率不高,改寫為以下形式后效率得到了很大提高。在存儲過程中,上面的寫法此存儲過程執(zhí)行需用時1 分多鐘,改為下面的寫法后,用時僅需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 語句中,where 條件中有or 的語句,where 條件盡量用大組合,而不要用小組合。 

3.7. 關(guān)于使用put , execute 來代替insert 提高效率在做數(shù)據(jù)轉(zhuǎn)換或登錄大批量數(shù)據(jù)時,用put 或execute 替代insert ,將使效率大幅度提高。因為在循環(huán)體內(nèi),減少了對insert 的語法檢查及預(yù)處理的時間。 
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 的語法如下: 
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 必須注意以下內(nèi)容:
u put 語句必須在事物中。 
u put 語句執(zhí)行完后,馬上從庫中select 不一定能取到數(shù)
3.8. 使用隔離級別(isolation) 
共有四種隔離級別 
Dirty read 
Commited read 
Cursor stability 
Repeatable read 
<一> dirty read 
可能讀到未提交(commited)的記錄,可能讀到最后被回滾的記錄,該記錄是一個phantom。 在一些查詢中,使用此隔離級別,可提高效率。因為不受其他進程鎖表,鎖記錄的影響。 

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

grp_picc21 1 Active Local 
注1. replicate server 建立時會在picc21 上建立一個名為syscdr 的database 用來 
管理所有的repliate 信息,因此也可以通過用dbaccess 命令看是否建立了
syscdr 來確定replicate server 是否正確定義。
注2. replicate 必須用DBSERVER GROUP 代替DBSERVER ( DBSERVER GROUP 在 
sqlhosts 中定義)
4.2.6. 增加連接成員: 
執(zhí)行picc21 上$INformIXDIR/cdr/crtmeb.sh
腳本內(nèi)容如下: 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. 確定成員已連接
執(zhí)行picc21 上執(zhí)行cdr list server 
系統(tǒng)顯示如下說明新成員已連接:
SERVER ID STATE STATUS CONNECTION CHANGED
grp_ibm500 2 Active Connected Dec 7 14:54:17 2001 
grp_picc21 1 Active Local 
1. 在增加一個成員時也會在ibm500 上的database server 上建立一個名為
syscdr 的database,因此除了用cdr list server 外,也可以用dbaccess 命 
令看是否建立了syscdr 來確定一個成員是否正確加入。
2. 確保picc21 和ibm500 已做時間同步(參見附錄) 
4.2.8. 定義replicate 
執(zhí)行picc21 上$INformIXDIR/cdr/repdef.sh 
腳本內(nèi)容如下: 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 建立 
執(zhí)行picc21 上執(zhí)行cdr list repl 
系統(tǒng)顯示如下說明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. 啟動replicate 
執(zhí)行picc21 上$INformIXDIR/cdr/repstart.sh 
腳本內(nèi)容如下:
cdr start repl picc2_a_charge_ratio 
cdr start repl picc2_a_comm_ratio
4.2.11. 確定replicate 已啟動 
執(zhí)行picc21 上執(zhí)行cdr list repl 
系統(tǒng)顯示如下說明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 
執(zhí)行picc21 上$INformIXDIR/cdr/repstop.sh 
腳本內(nèi)容如下:
cdr stop repl picc2_a_charge_ratio 
cdr stop repl picc2_a_comm_ratio 
4.2.13. 維護CDR ?/@#{J
CDR 配置完成后,系統(tǒng)將按照配置自動完成數(shù)據(jù)復(fù)制功能。根據(jù)需要也可以停止CDR 和
重新啟動CDR,或者修改CDR 的配置。下面列出幾種需要對CDR 進行維護的情況:
1. 使用dbexport 卸載數(shù)據(jù)庫時,需要通過如下命令停止CDR
cdr stop 
2. 可以通過如下命令重新啟動CDR 
cdr start 
3. 修改復(fù)制時間間隔時,可以通過如下命令修改replicate 的配置 
cdr modify repl -a 24:00 repl_name 
注:將復(fù)制間隔修改為每天24:00 開始復(fù)制
可以使用腳本$INformIXDIR/cdr/repmdf.sh 進行成批修改
4. 需要停止某個replicate 時,可以通過如下命令完成
cdr stop repl repl_name
注:可以使用腳本$INformIXDIR/cdr/repstop.sh 停止一批replicate 
5. 需要刪除某個replicate 時,可以通過如下命令完成 
cdr delete repl repl_name
注:可以使用腳本$INformIXDIR/cdr/repdel.sh 進行成批修改 
6. 需要刪除replicate server 時,可以通過如下命令完成 
cdr delete server server_name 
4.2.14. 監(jiān)控CDR 工作情況 
1. 可以通過2.3、2.5 、2.7 章節(jié)中的命令分別監(jiān)控replicate server、
participant 和replicate 的狀態(tài)是否正常。 
2. 通過查看/tmp/ats 和/tmp/ris 目錄,如有文件存在說明有復(fù)制不成功的記錄,
通過vi 查看復(fù)制不成功的具體原因。
3. 通過查看$INformIXDIR/online.log 文件,判斷CDR 運行情況。 
4.2.15. CDR 出錯處理 
一旦有某個表的數(shù)據(jù)復(fù)制不成功, 完成如下步驟恢復(fù)該表的數(shù)據(jù)一致性:
1. Suspend 該表的復(fù)制 
2. 刪除該表在復(fù)制庫中的數(shù)據(jù) 
3. 從生產(chǎn)庫unload 該表數(shù)據(jù),再在復(fù)制庫load 該表數(shù)據(jù)
4. resum 該表的復(fù)制 
4.3. CDR 的時間同步 
有關(guān)ntp(Network time protocol)的配置,必須在CDR 定義之前進行。兩臺主機必須 
通過ntp 做時鐘同步,哪臺主機做ntp Server 是無所謂的。在跨平臺的情況配置有所不同 
這里介紹了兩種情況:2 臺SCO 主機和1 臺AIX、1 臺SCO
² 2 臺主機都是SCO 平臺
ntp Server 端:
1) 編輯/etc/ntp.conf(有可能無此文件,可以新建一個文件,其owner 和group 都是bin)
內(nèi)容如下:
server 127.127.1.0 
2) 修改/etc/tcp 文件 
在/etc/tcp 文件中查xntpd 行,刪除tickadj 一行,下一行的xntpd 后加-g ,
ntp Client 端:
1) 編輯/etc/ntp.conf(有可能無此文件,可以新建一個文件,其owner 和group 都是bin)
內(nèi)容如下:
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 端應(yīng)有ntp Server 啟動的信息 
ntp Client 端應(yīng)每隔5-10 分鐘有與ntp Server 握手的信息 
² 1 臺主機是SCO 平臺,1 臺主機是AIX 平臺 
1)server 端必須定義在AIX 平臺上且/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. 存儲過程的使用 
公共模塊,用存儲過程代替函數(shù),可使代碼統(tǒng)一。
Client /Server 模式,用存儲過程代替函數(shù),減少client 端應(yīng)用,減少傳輸量,提高效率。
在SQL 語句中,需要使用存儲過程處理復(fù)雜的事情。這一點在描述中使用的特別普遍。
2. 存儲過程的調(diào)用 
存儲過程有兩種調(diào)用方式 
(1). select getday( “1998/1/1”,1,”month”) from exec 
(2). Execute procedure getday(“1998/1/1”,1,”month”) 
注:exec 為一只有一條記錄的表 
當存儲過程以with resume 返回,返回值超過一列時,只能用第二種調(diào)用方式。 
這兩種方式有一點區(qū)別,第二種方式執(zhí)行的一定是存儲過程,第一種方式則不一定。
如下所示:
select mod(7,3) from exec 執(zhí)行的是系統(tǒng)過程
execute procedure mod(7,4) 執(zhí)行的是自己定義的存儲過程mod。
3. 存儲過程的調(diào)試 
存儲過程的調(diào)試通常采用兩種方法。
(1) 設(shè)置debug file ,以trace 方式。
(2) 用return .. with resume 方式調(diào)試。
例: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. 存儲過程中錯誤的捕獲 
在4gl 程序中,有whenever error continue 語句,屏蔽錯誤,在存儲過程中不能使用 
whenever error continue,但可以使用on exception 來捕獲錯誤,使存儲過程繼續(xù)執(zhí)行。 
例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 : 以下存儲過程用以計算時間,標準為向前靠,如“1998/1/31”  
日加一個月為“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; 
注:在存儲過程中,on exception 的使用有作用域,若使用在循環(huán)體內(nèi),其作用域為循環(huán)體, 
退出即退出本次循環(huán)。若使用在begin work 與commit work 內(nèi),其作用域為begin work 內(nèi),退出 
即退出該事物體。以下幾個實例給予說明: 
例1:
create procedure get(t_day date,t_int int )
returning date;
define i int; 
define tt_day date; 
on exception in(-1267) ----此語句的作用域為整個存儲過程
let i=i+1; ----此語句必須為存儲過程的第一條語句 
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; ---此處出錯后執(zhí)行while 循
環(huán)外的第一條語句,即下面黑色字體的語句。若無with resume 則退出存儲過
程。 
trace "ok"
trace tt_day;
exit while;
end while;
trace "ok"; ---出錯后執(zhí)行此語句
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) ----此語句的作用域為while 循環(huán)
let i=i+1; ----必須為while 循環(huán)內(nèi)的第一條語句 
end exception; ------注意無with resume 
trace i; 
trace tt_day; 
let tt_day=t_day-i;
let tt_day=tt_day+t_int units month; ---此處出錯后執(zhí)行while 循
環(huán)的下一循環(huán),相當于continue while。若有with resume 則執(zhí)行下面一條語 )
句,即黑色字體的語句。
trace "ok"
trace tt_day; 
exit while; 
end while;
trace tt_day;
return tt_day;
end procedure;
5. 存儲過程的效率 
系統(tǒng)中的存儲過程盡量放在一個extents 中,最好不要超過8 個extents. ( 注:extents 連
續(xù)的存儲空間),因此可定期將系統(tǒng)中的所有存儲過程重建。
存儲過程中使用set optimization low 可提高存儲過程的效率,前提是該存儲過程中所涉及
的表的結(jié)構(gòu),字段無任何改動。
更為重要的是存儲過程的效率與存儲過程中的語句的寫法很有關(guān)系。有時某一語句換一種寫 
法,存儲過程的效率可得到極大提高。
例如:
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; 
--以上改為以下語句,效率顯著提高,從30 分到不到1 秒
--該語句有多種寫法,子查詢,連表等,但在該存儲過程中,以下寫法效率最高
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. 存儲過程內(nèi)SQL 語句執(zhí)行情況的判斷
   在4GL 程序中對SQL 語句執(zhí)行情況的判斷可用status, sqlca 等來實現(xiàn)。但在存儲過程中,不能直接使用這些全局變量。但可通過dbinfo()來實現(xiàn)。
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ǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多