分布式網(wǎng)絡(luò)系統(tǒng)中的數(shù)據(jù)訪問設(shè)計(jì)與優(yōu)化_第1頁
分布式網(wǎng)絡(luò)系統(tǒng)中的數(shù)據(jù)訪問設(shè)計(jì)與優(yōu)化_第2頁
分布式網(wǎng)絡(luò)系統(tǒng)中的數(shù)據(jù)訪問設(shè)計(jì)與優(yōu)化_第3頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

分布式網(wǎng)絡(luò)系統(tǒng)中的數(shù)據(jù)訪問設(shè)計(jì)與優(yōu)化

摘要:在基于局域網(wǎng)的大型分布式仿真和控制系統(tǒng)中,包括數(shù)據(jù)庫服務(wù)器在內(nèi)的各計(jì)算機(jī)之間的信息交互方案的設(shè)計(jì)是系統(tǒng)性能優(yōu)異的關(guān)鍵,尤其是在計(jì)算機(jī)數(shù)量較多或待交互的單位時(shí)間信息量較大時(shí)更為重要。計(jì)算機(jī)間的信息交互涉及各機(jī)間的共享數(shù)據(jù)的讀取、存貯和更新等方面的內(nèi)容,需采取有效的系統(tǒng)規(guī)劃、實(shí)時(shí)通訊和快速數(shù)據(jù)庫訪問等手段解決。本文全面論述了有關(guān)內(nèi)容,給出了有效的解決方案。關(guān)鍵詞:網(wǎng)絡(luò)系統(tǒng)、信息交互、優(yōu)化設(shè)計(jì)1前言隨著計(jì)算機(jī)和網(wǎng)絡(luò)技術(shù)的不斷提高,使用基于局域網(wǎng)的,分布式的計(jì)算機(jī)系統(tǒng)對(duì)大型、綜合或復(fù)雜的工業(yè)過程和運(yùn)行環(huán)境進(jìn)行系統(tǒng)仿真與運(yùn)行模擬以及控制已越來越普遍。由于這樣的仿真與控制系統(tǒng)一般規(guī)模龐大或過程復(fù)雜,單獨(dú)一臺(tái)計(jì)算機(jī)無法完成整個(gè)系統(tǒng)任務(wù),需要多機(jī)參與,構(gòu)成計(jì)算機(jī)網(wǎng)絡(luò),通過網(wǎng)上信息交互共同協(xié)調(diào)完成整個(gè)仿真與控制任務(wù)。各機(jī)之間信息交互的方式、頻率和數(shù)量決定了整個(gè)網(wǎng)絡(luò)系統(tǒng)的綜合性能。由于在這樣的系統(tǒng)中,機(jī)間的信息交互一般都非常頻繁,各機(jī)都要面臨數(shù)據(jù)更新、系統(tǒng)運(yùn)行、結(jié)果存貯等過程的快速性問題,因此有關(guān)的設(shè)計(jì)是非常重要和關(guān)鍵的。2系統(tǒng)規(guī)劃與設(shè)計(jì)無論是仿真還是控制系統(tǒng),合理的系統(tǒng)和數(shù)據(jù)規(guī)劃至關(guān)重要。通過系統(tǒng)和數(shù)據(jù)規(guī)劃可以優(yōu)化系統(tǒng)設(shè)計(jì),解決各機(jī)任務(wù)均衡,資源充分利用等問題,在兼顧可靠性、安全性和故障可診斷性的同時(shí)充分發(fā)揮系統(tǒng)的整體效率和性能,并容許具有一定的可擴(kuò)展性。目前有許多分布式仿真和控制系統(tǒng)采用以數(shù)據(jù)庫為中心的設(shè)計(jì)方案。在這種設(shè)計(jì)方案中,網(wǎng)上的交互信息通過數(shù)據(jù)庫來進(jìn)行,首先由產(chǎn)生交互信息的機(jī)器存入數(shù)據(jù)庫,然后由需要該交互信息的機(jī)器從數(shù)據(jù)庫中讀出來完成一個(gè)信息交互或更新過程。由于該信息交互通過一個(gè)中間環(huán)節(jié)即數(shù)據(jù)庫來進(jìn)行,因此在網(wǎng)上的計(jì)算機(jī)數(shù)量較多或程序要求的數(shù)據(jù)更新較多較快時(shí),易造成數(shù)據(jù)沖突和網(wǎng)絡(luò)堵塞,極易導(dǎo)致系統(tǒng)運(yùn)行遲緩或死機(jī),成為整個(gè)系統(tǒng)性能的瓶頸。當(dāng)然以數(shù)據(jù)庫為中心的分布式仿真和控制系統(tǒng)也有其優(yōu)點(diǎn),其編程思路比較簡單清晰,容易被人理解和掌握。對(duì)于網(wǎng)上信息交互量不多的系統(tǒng),可以采用以數(shù)據(jù)庫為中心的系統(tǒng),同時(shí)可以通過數(shù)據(jù)規(guī)劃合理地分配各計(jì)算機(jī)的任務(wù),使用一些編程技術(shù)來降低網(wǎng)上的信息流量,提高系統(tǒng)的性能。例如在程序中應(yīng)盡量使用全局變量創(chuàng)建公用數(shù)據(jù)庫連接,避免每次不必要的數(shù)據(jù)連接重建時(shí)間。如果系統(tǒng)較大、網(wǎng)上信息交互量較多或?qū)ο到y(tǒng)實(shí)時(shí)性和可擴(kuò)展性要求較高時(shí),應(yīng)采用實(shí)時(shí)網(wǎng)絡(luò)數(shù)據(jù)通訊的設(shè)計(jì)方案。在以數(shù)據(jù)庫為中心的系統(tǒng)設(shè)計(jì)方案中,由于數(shù)據(jù)的變化首先要存入數(shù)據(jù)庫,然后被其它程序訪問才能刷新,經(jīng)歷了數(shù)據(jù)庫存取這一中間環(huán)節(jié)。如果網(wǎng)上有多個(gè)應(yīng)用程序都需要知道該數(shù)據(jù)的變化,則都必須通過數(shù)據(jù)庫訪問才能更新。這樣就浪費(fèi)了許多網(wǎng)絡(luò)資源,容量造成瓶頸。在采用實(shí)時(shí)網(wǎng)絡(luò)數(shù)據(jù)通訊的設(shè)計(jì)方案中,通過網(wǎng)絡(luò)實(shí)時(shí)通訊來解決網(wǎng)上各機(jī)器間的數(shù)據(jù)交互與刷新問題,其中對(duì)于多臺(tái)機(jī)器都需要的數(shù)據(jù)變化通過網(wǎng)絡(luò)廣播的方式,以定時(shí)和數(shù)據(jù)變化實(shí)時(shí)觸發(fā)傳送的機(jī)制向所需機(jī)器通知該數(shù)據(jù)已發(fā)生變化和具體的數(shù)值;對(duì)于只存在兩臺(tái)機(jī)器之間的信息交互可采用點(diǎn)對(duì)點(diǎn)的方式進(jìn)行通訊。通訊的數(shù)據(jù)格式和組織可以自行定義。因此,與以數(shù)據(jù)庫為中心的方案相比,該設(shè)計(jì)方案減少了因數(shù)據(jù)刷新所需的多次訪問問題,大大減少了數(shù)據(jù)流量,同時(shí)網(wǎng)絡(luò)傳輸還可以增加數(shù)據(jù)正確性和合法性校驗(yàn),為操作者或系統(tǒng)管理員及時(shí)提供系統(tǒng)信息和出錯(cuò)信息,便于系統(tǒng)故障診斷和系統(tǒng)調(diào)試。如果把各子系統(tǒng)初始化數(shù)據(jù)都保存在服務(wù)器的數(shù)據(jù)庫中,則各機(jī)一起啟動(dòng)時(shí),由于都需要建立數(shù)據(jù)庫鏈接,讀取其中的初始化數(shù)據(jù),容易造成起動(dòng)時(shí)間過長的現(xiàn)象。為此,對(duì)于不必要存于服務(wù)器的數(shù)據(jù)可存于本地?cái)?shù)據(jù)庫中,本地?cái)?shù)據(jù)庫可采用ACCESS數(shù)據(jù)庫。對(duì)于一般不變的系統(tǒng)初始化數(shù)據(jù)也可以備存到本地?cái)?shù)據(jù)庫中,供日常程序起動(dòng)時(shí)使用。如果系統(tǒng)的初始化數(shù)據(jù)進(jìn)行了更新,可以編制一段程序,根據(jù)數(shù)據(jù)庫服務(wù)器的數(shù)據(jù)庫版本號(hào)來更新本地?cái)?shù)據(jù)庫。無論何種方案,數(shù)據(jù)庫的訪問總是不能避免的,如何提高數(shù)據(jù)庫的訪問速度非常值得研究。3提高數(shù)據(jù)庫訪問速度(以SQL數(shù)據(jù)庫為例)客戶機(jī)程序一般采用VC++,VB,PowerBuilder,Delphi等支持訪問數(shù)據(jù)庫的集成開發(fā)環(huán)境進(jìn)行開發(fā)。在編寫客戶端程序時(shí),一般通過ODBC(OpenDatabaseConnectibvity)API,RDO(RemoteDataObjects)[5],ADO(ActiveXDataObjects)[5]訪問數(shù)據(jù)庫,查詢或修改數(shù)據(jù)庫中的數(shù)據(jù)。其中ODBCAPI是被人們廣泛接受的用于數(shù)據(jù)庫訪問的應(yīng)用程序編程接口。具有訪問數(shù)據(jù)庫速度快效率高,但編程復(fù)雜的特點(diǎn);遠(yuǎn)程數(shù)據(jù)對(duì)象(RDO)對(duì)ODBCAPI函數(shù)進(jìn)行了封裝,為編程人員提供了一個(gè)訪問遠(yuǎn)程數(shù)據(jù)庫的高級(jí)接口,在程序中通過該對(duì)象可輕松對(duì)數(shù)據(jù)庫進(jìn)行遠(yuǎn)程訪問。組件對(duì)象(ADO)不僅繼承而且發(fā)展了RDO,它不但具有訪問遠(yuǎn)程數(shù)據(jù)庫的能力,而且還具有訪問其它數(shù)據(jù)提供者(不一定是數(shù)據(jù)庫,可能是其他文件或其他應(yīng)用程序所提供的數(shù)據(jù))的能力。在VB中可很方便的使用RDO和ADO來訪問數(shù)據(jù)庫,但訪問數(shù)據(jù)庫效率不高,速度較慢,靈活性也差。為了滿足系統(tǒng)的要求經(jīng)常需要提高訪問數(shù)據(jù)庫的速度,具體方法有:3.1使用ODBCAPI函數(shù)由于ODBCAPI函數(shù)的入口參數(shù)表中有些參數(shù)需要傳遞指針,而VB不支持指針,因此在VB中調(diào)用ODBCAPI函數(shù)會(huì)有一定的限制。另外,VB的字符串內(nèi)存存儲(chǔ)格式與C語言不同,而ODBCAPI函數(shù)是用C語言開發(fā)的,這也限制了VB和ODBCAPI函數(shù)之間的數(shù)據(jù)交換。為此需要開發(fā)一個(gè)動(dòng)態(tài)鏈接庫(DynamicLinkLibrary-DLL),編制二個(gè)API函數(shù)分別以獲取參數(shù)指針和支持?jǐn)?shù)據(jù)交換,從而實(shí)現(xiàn)在該動(dòng)態(tài)鏈接庫的支持下,在VB中直接調(diào)用ODBCAPI函數(shù)的目的??梢允褂肰C++6.0開發(fā)動(dòng)態(tài)鏈接庫。VC++6.0可開發(fā)三種類型的動(dòng)態(tài)鏈接庫:Win32DLL、常規(guī)MFCDLL、擴(kuò)展MFCDLL。其中Win32DLL、常規(guī)MFCDLL可被任意Win32編程環(huán)境(包括VisualBasic6.0版)加載使用。常規(guī)MFCDLL在發(fā)行時(shí)必須附帶MFC42.DLL庫,而Win32DLL可單獨(dú)發(fā)行[3]。如果只提供給VB編程環(huán)境使用,可建立Win32DLL即可。具體的開發(fā)步驟為:利用VC++6.0編程環(huán)境的AppWizard創(chuàng)建一個(gè)簡單Win32DLL工程,工程名為SQLAPI,在此基礎(chǔ)上加入自己的代碼。代碼如下:#include"stdafx.h"#defineDLLEXPORTextern"C"__declspec(dllexport)//定義導(dǎo)出宏BOOLAPIENTRYDllMain(HANDLEhModule,DWORDul_reason_for_call,LPVOIDlpReserved){returnTRUE;}DLLEXPORTlong__stdcallGetAddress(void*Address)//按地址傳送{return(long)Address;

}//將地址強(qiáng)制轉(zhuǎn)換為長整形DLLEXPORTlong__stdcallstrCopyToByte(char*BytesAddress,char*strAddress){return(long)strcpy(BytesAddress,strAddress);}//將字符串傳送到指定地址經(jīng)編譯鏈接生成SQLAPI.DLL動(dòng)態(tài)鏈接庫,將其拷貝到C:\WINDOWS\SYSTEM(對(duì)于Windows)或C:\WINNT\SYSTEM32(對(duì)于WindowsNT或2000)目錄下,這樣就可在VB中調(diào)用這兩個(gè)API函數(shù)實(shí)現(xiàn)對(duì)ODBCAPI的調(diào)用。ODBC調(diào)用的一般流程為:1連接至數(shù)據(jù)源:分配環(huán)境句柄、設(shè)置環(huán)境屬性、分配聯(lián)接句柄、聯(lián)接數(shù)據(jù)源和設(shè)置聯(lián)接屬性。2初始化應(yīng)用程序:分配語句句柄、設(shè)置語句屬性,必要時(shí)進(jìn)行數(shù)據(jù)綁定。3建立和執(zhí)行SQL語句:a)建立SQL語句,或使用硬編碼的SQL語句。b)如果SQL語句含有參數(shù),將每個(gè)參數(shù)綁定至應(yīng)用程序變量。c)用SQLExecDirect執(zhí)行該語句。如果語句要多次執(zhí)行,則進(jìn)行語句準(zhǔn)備,并用SQLExecute來執(zhí)行。使用API函數(shù)可以加快數(shù)據(jù)庫的訪問,提高效率,另外也要注意SQL語句的語法優(yōu)化。對(duì)于巨表和多表訪問,SQL語句的語法優(yōu)化對(duì)訪問速度的影響會(huì)顯得尤為重要。3.2SQL優(yōu)化應(yīng)從數(shù)據(jù)庫端和客戶端程序兩方面入手,提高訪問SQL數(shù)據(jù)庫的速度,提高查詢和修改數(shù)據(jù)庫數(shù)據(jù)的效率。在數(shù)據(jù)庫的表中記錄數(shù)很多時(shí),訪問速度尤其重要,由于SQL數(shù)據(jù)庫采用先進(jìn)的索引技術(shù)和高效的查詢算法,因此在保證結(jié)果正確的同時(shí),要注意選用性能最佳的實(shí)現(xiàn)方法。其中可以通過對(duì)數(shù)據(jù)庫的索引,多表間的連接和where子句進(jìn)行適當(dāng)?shù)膬?yōu)化,使運(yùn)行速度大大提高,同時(shí)可使用存儲(chǔ)過程來使SQL變得更加靈活和高效。SQL數(shù)據(jù)庫可高效處理成批和成組的數(shù)據(jù),而對(duì)于單個(gè)數(shù)據(jù)處理則效率低下,因此,在編寫客戶端程序時(shí),應(yīng)盡量將數(shù)據(jù)成批(成組)地送往數(shù)據(jù)庫,或成批(成組)地查詢數(shù)據(jù)。另外,在客戶端,使用SQL語句也存在優(yōu)化問題。如:dimmValueasSingle,strSQLasstringmValue=12.34strSQL=”UPDATEtablenameSETvalue=“+str(mValue)+”WHEREname=’Generator’”SQLExecDirect(語句句柄,strSQL,SQL_NTS);該語句將表tablename中name=’Generator’記錄的value值更新為12.34,該操作在程序運(yùn)行中經(jīng)過兩次轉(zhuǎn)換,首先將單精度數(shù)轉(zhuǎn)換為字符串,和其他字符串合并后傳遞給ODBC驅(qū)動(dòng)程序,驅(qū)動(dòng)程序又將字符串再轉(zhuǎn)換為ODBC特有的數(shù)據(jù)格式,如更新大量數(shù)據(jù)則花費(fèi)在轉(zhuǎn)換數(shù)據(jù)格式上的系統(tǒng)開銷很大,應(yīng)盡量避免編寫上述代碼。對(duì)于多次常用語句應(yīng)進(jìn)行語句準(zhǔn)備,以后可多次使用。一般來說,針對(duì)有大量重復(fù)值、且經(jīng)常有范圍查詢(between,>,<,>=,<=)和orderby、groupby發(fā)生的列,建立非缺省的群集索引可能會(huì)使性能更佳,而對(duì)于經(jīng)常同時(shí)存取多列,且每列都含有重復(fù)值的情況可考慮建立組合索引,注意組合索引要盡量使關(guān)鍵查詢形成索引覆蓋,其前導(dǎo)列一定要是使用最頻繁的列。在進(jìn)行多表操作時(shí),可在執(zhí)行前根據(jù)連接條件,使用查詢優(yōu)化器列出幾組可能的連接方案并從中找出系統(tǒng)開銷最小的最佳方案。連接條件要充分考慮帶有索引的表、行數(shù)多的表。內(nèi)外表的選擇可由下列公式確定。其中乘積最小的方案為最佳。乘積=外層表中的匹配行數(shù)*內(nèi)層表中每一次查找的次數(shù)在where子句中,任何對(duì)列的操作都將導(dǎo)致表掃描,這些操作包括數(shù)據(jù)庫函數(shù)、計(jì)算表達(dá)式等等,查詢時(shí)要盡可能將操作移至等號(hào)右邊。假設(shè)有如下兩個(gè)SQL語句,其條件語句中的列value已建有恰當(dāng)?shù)乃饕Z句1:select*fromTable1wherevalue/30<100語句2:select*fromTable1wherevalue<100*30在表中數(shù)據(jù)很多時(shí),可明顯看出語句2的運(yùn)行速度比語句1快得多,這是因?yàn)閣here子句中對(duì)列的任何操作結(jié)果都是在SQL運(yùn)行時(shí)逐列計(jì)算得到的,因此它不得不進(jìn)行表搜索,而沒有使用已建在該列上的索引。如果在查詢編譯時(shí)就能得到這些列的操作結(jié)果,那么就可以被SQL優(yōu)化器優(yōu)化,從而使用索引,避免表搜索,如語句2所示。在where條件中in、or子句常會(huì)使用臨時(shí)數(shù)據(jù)庫的工作表,使索引失效;如果子句拆開后不產(chǎn)生大量重復(fù)值,可以考慮把子句拆開來優(yōu)化運(yùn)行,拆開的子句中應(yīng)該包含索引。例如,假設(shè)在表Parts中有200000行記錄,在類型字段Type上有非群集索引,則針對(duì)SQL語句:selectcount(amount)fromPartswhereTypein('0','1'),因?yàn)槠鋡here條件中的'in'在邏輯上相當(dāng)于'or',所以語法分析器會(huì)將in('0','1')轉(zhuǎn)化為Type='0'orType='1'來執(zhí)行。我們?cè)瓉砥谕鼤?huì)根據(jù)每個(gè)or子句分別查找,再將結(jié)果相加,從而可以利用Type字段上的索引;但實(shí)際上它卻采用了"OR策略",即先取出滿足每個(gè)or子句的行,存入臨時(shí)數(shù)據(jù)庫的工作表中,再建立唯一索引以去掉重復(fù)行,最后從這個(gè)臨時(shí)表中計(jì)算結(jié)果。因此,實(shí)際過程沒有利用Type字段上的索引,并且完成時(shí)間還要受tempdb數(shù)據(jù)庫性能的影響。SQL優(yōu)化的實(shí)質(zhì)就是在結(jié)果正確的前提下,用優(yōu)化器可以識(shí)別的語句,盡量減少類型轉(zhuǎn)換和計(jì)算,充分利用索引,減少表掃描的I/O次數(shù),盡量避免表搜索的發(fā)生。其實(shí)SQL的性能優(yōu)化是一個(gè)復(fù)雜的過程,上述內(nèi)容只是在應(yīng)用層次的一些體現(xiàn),深入研究還會(huì)涉及其它內(nèi)容如數(shù)據(jù)庫層的資源配置、網(wǎng)絡(luò)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論