




已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
此文檔收集于網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系網(wǎng)站刪除DB2 靜態(tài) SQL 和動(dòng)態(tài) SQL 的比較與實(shí)踐(轉(zhuǎn))SQL 語(yǔ)言作為標(biāo)準(zhǔn)的查詢語(yǔ)言,幾乎被所有的數(shù)據(jù)庫(kù)管理系統(tǒng) (DBMS) 所支持,并成為國(guó)際標(biāo)準(zhǔn)。標(biāo)準(zhǔn)的 SQL 語(yǔ)言一般包括三類,即 DDL (Data Definition Language, 數(shù)據(jù)描述語(yǔ)言 ) 、DML (Data Manipulation Language, 數(shù)據(jù)操縱語(yǔ)言 ) 和 DCL(Data Control Language,數(shù)據(jù)控制語(yǔ)言 )。通過(guò)這些標(biāo)準(zhǔn)的 SQL 語(yǔ)句,使得各種數(shù)據(jù)庫(kù)能以一種較為統(tǒng)一的方式被訪問(wèn)。 DB2(本文以下專指 DB2 UDB for Linux, Unix 和 Windows 版本)允許用戶通過(guò)多種編程接口發(fā)送 SQL 語(yǔ)句到數(shù)據(jù)庫(kù)引擎,然后由引擎統(tǒng)一編譯并且運(yùn)行。SQL 語(yǔ)句從編譯和運(yùn)行的角度可以分為兩種,靜態(tài) SQL和 動(dòng)態(tài) SQL,這兩種 SQL 在使用方式、運(yùn)行機(jī)制和性能表現(xiàn)等方面各有特點(diǎn) : 靜態(tài) SQL:靜態(tài) SQL 語(yǔ)句一般用于嵌入式 SQL 應(yīng)用中,在程序運(yùn)行前,SQL 語(yǔ)句必須是確定的,例如 SQL 語(yǔ)句中涉及的列名和表名必須是存在的。靜態(tài) SQL 語(yǔ)句的編譯是在應(yīng)用程序運(yùn)行前進(jìn)行的,編譯的結(jié)果會(huì)存儲(chǔ)在數(shù)據(jù)庫(kù)內(nèi)部。而后程序運(yùn)行時(shí),數(shù)據(jù)庫(kù)將直接執(zhí)行編譯好的 SQL 語(yǔ)句,降低運(yùn)行時(shí)的開(kāi)銷。 動(dòng)態(tài) SQL:動(dòng)態(tài) SQL 語(yǔ)句是在應(yīng)用程序運(yùn)行時(shí)被編譯和執(zhí)行的,例如,使用 DB2 的交互式工具 CLP 訪問(wèn)數(shù)據(jù)庫(kù)時(shí),用戶輸入的 SQL 語(yǔ)句是不確定的,因此 SQL 語(yǔ)句只能被動(dòng)態(tài)地編譯。動(dòng)態(tài) SQL 的應(yīng)用較多,常見(jiàn)的 CLI 和 JDBC 應(yīng)用程序都使用動(dòng)態(tài) SQL。 表 1列舉了靜態(tài) SQL 和動(dòng)態(tài) SQL 的比較結(jié)果。 表 1. 靜態(tài) SQL 和動(dòng)態(tài) SQL 的比較靜態(tài) SQL動(dòng)態(tài) SQLSQL 語(yǔ)句直接嵌入到宿主編程語(yǔ)言,程序需要預(yù)編譯處理這些嵌入的 SQL 語(yǔ)句SQL 語(yǔ)句一般作為宿主語(yǔ)言的變量出現(xiàn)。嵌入式動(dòng)態(tài) SQL 應(yīng)用需要預(yù)編譯,非嵌入式 SQL 應(yīng)用則無(wú)需預(yù)編譯SQL 語(yǔ)句在程序被編譯時(shí)已知,涉及的數(shù)據(jù)庫(kù)對(duì)象已存在SQL 語(yǔ)句在程序被編譯時(shí)未知,涉及的數(shù)據(jù)庫(kù)對(duì)象可以是運(yùn)行時(shí)才創(chuàng)建的SQL 語(yǔ)句在程序運(yùn)行前被編譯SQL 語(yǔ)句在程序運(yùn)行時(shí)被編譯SQL 語(yǔ)句的編譯結(jié)果在 DB2 的目錄 (catalog) 中持久化保存SQL 語(yǔ)句的編譯結(jié)果緩存在數(shù)據(jù)庫(kù)的內(nèi)存里運(yùn)行時(shí)僅讀取目錄 (catalog)運(yùn)行時(shí)編譯 SQL 語(yǔ)句需對(duì)目錄 (catalog) 加鎖SQL 語(yǔ)句的優(yōu)化是根據(jù)編譯時(shí)的數(shù)據(jù)庫(kù)統(tǒng)計(jì)信息進(jìn)行的,不能完全反映運(yùn)行時(shí)的情況SQL 語(yǔ)句的優(yōu)化是根運(yùn)行時(shí)的數(shù)據(jù)庫(kù)統(tǒng)計(jì)信息進(jìn)行的對(duì) SQL 語(yǔ)句所訪問(wèn)的數(shù)據(jù)對(duì)象的權(quán)限檢查是在綁定時(shí)進(jìn)行的對(duì) SQL 語(yǔ)句所訪問(wèn)的數(shù)據(jù)對(duì)象的權(quán)限檢查是在運(yùn)行時(shí)進(jìn)行的權(quán)限控制的粒度是包(package,一組 SQL 語(yǔ)句的編譯結(jié)果),用戶僅需要訪問(wèn)包的權(quán)限權(quán)限控制的粒度是 SQL 語(yǔ)句,用戶需要具有訪問(wèn) SQL 語(yǔ)句中每個(gè)數(shù)據(jù)對(duì)象的權(quán)限如果 SQL 語(yǔ)句中的對(duì)象被修改,如 DDL 執(zhí)行,整個(gè)包都需要重新綁定當(dāng) SQL 語(yǔ)句中的對(duì)象被修改時(shí),僅執(zhí)行過(guò)的語(yǔ)句在下次運(yùn)行時(shí)需要重新編譯根據(jù)編程方法的不同,DB2 的應(yīng)用程序開(kāi)還可以分為嵌入式 SQL 編程和非嵌入式編程 : 嵌入式 SQL 編程將 SQL 語(yǔ)句嵌入到宿主語(yǔ)言 (host) 的程序中,例如 C/C+ 程序。因?yàn)樗拗髡Z(yǔ)言不識(shí)別 SQL 語(yǔ)句,先要對(duì)程序進(jìn)行預(yù)編譯,把 SQL 語(yǔ)句轉(zhuǎn)變?yōu)閷?duì) DB2 服務(wù)的調(diào)用,并重寫源代碼,最后再使用宿主語(yǔ)言的編譯器對(duì)應(yīng)用程序進(jìn)行編譯。嵌入式 SQL 都需要被綁定到特定的數(shù)據(jù)庫(kù)中,可分為嵌入式靜態(tài) SQL 和嵌入式動(dòng)態(tài) SQL。 非嵌入式應(yīng)用程序不需要預(yù)編譯,且方法較多,如 CLI、JDBC、ODBC、ADO.NET 等等,這些方法中都使用動(dòng)態(tài) SQL。表 2列舉了常見(jiàn)的 DB2 編程接口。 表 2. DB2 的編程接口一覽編程接口靜態(tài) / 動(dòng)態(tài)是否為嵌入式嵌入式 SQL靜態(tài)和動(dòng)態(tài)是DB2 CLI動(dòng)態(tài)否SQLJ靜態(tài)是JDBC動(dòng)態(tài)否ADO.NET,OLE DB動(dòng)態(tài)否Perl DBI動(dòng)態(tài)否PDO(PHP 數(shù)據(jù)對(duì)象 )動(dòng)態(tài)否在下面的幾個(gè)章節(jié)中,我們將陸續(xù)從使用角度上描述靜態(tài)和動(dòng)態(tài) SQL 在各種編程接口中的應(yīng)用,并運(yùn)用一些實(shí)例來(lái)介紹在具體的場(chǎng)景中如何選擇。 靜態(tài) SQL 應(yīng)用嵌入式靜態(tài) SQL無(wú)論是嵌入式靜態(tài) SQL 還是嵌入式動(dòng)態(tài) SQL,都需要先進(jìn)行預(yù)編譯,并綁定到特定的數(shù)據(jù)庫(kù)。DB2 的嵌入式 SQL 應(yīng)用程序支持以下幾種語(yǔ)言:C,C+,COBOL,F(xiàn)ORTRAN 和 REXX。 對(duì)嵌入式靜態(tài) SQL 而言,只能使用編譯時(shí)確定的 SQL 語(yǔ)句和訪問(wèn)編譯時(shí)已經(jīng)存在的數(shù)據(jù)庫(kù)對(duì)象。清單 1是一個(gè)查詢表的例子,使用 C 語(yǔ)言 : 清單 1. 嵌入式靜態(tài) SQL 的 C 語(yǔ)言片斷 /test.sqc EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; sqlint32 t_seq = 0; char t_name64=0; EXEC SQL END DECLARE SECTION; . t_seq = 5; EXEC SQL SELECT c_name INTO :t_name FROM test_tbl WHERE seq=:t_seq; printf(c_name = %s n, t_name);使用下面的命令,對(duì)上述代碼進(jìn)行預(yù)編譯和編譯: 清單 2. 嵌入式靜態(tài) SQL 的編譯命令 # 需要先連接數(shù)據(jù)庫(kù) db2 connect to TESTDB # 使用 PREP 命令對(duì) sqc 源文件進(jìn)行預(yù)編譯,這將生成 test.c 源文件 db2 PREP test.sqc # 使用 C 編譯器對(duì) test.c 進(jìn)行編譯 xlC -q64 -I$DB2PATH/include -g -L$DB2PATH/lib -ldb2 -o test test.cSQLJSQLJ 是應(yīng)用于靜態(tài) SQL 的 Java 編程接口。使用 SQLJ 編寫應(yīng)用程序和使用其他的語(yǔ)言接口相似,一個(gè)典型的 SQLJ 應(yīng)用程序主要包括以下幾個(gè)方面: 載入包含 SQLJ 和 JDBC 的 Java 包。 定義收發(fā)數(shù)據(jù)的載體變量。 連接至數(shù)據(jù)庫(kù),運(yùn)行相應(yīng)的 SQL 語(yǔ)句并且正確處理錯(cuò)誤情況,最后從數(shù)據(jù)庫(kù)斷開(kāi)。 清單 3是 SQLJ 中執(zhí)行 SELECT 語(yǔ)句的代碼片斷。 清單 3. 簡(jiǎn)單的 SQLJ 程序片斷 / 載入相關(guān)包 import sqlj.runtime.*; import java.sql.*; / 連接至數(shù)據(jù)庫(kù) Connection con0 = DriverManager.getConnection(url); / 執(zhí)行相關(guān)的 SQL 語(yǔ)句 #sql ctx iter = SELECT NAME FROM EMP; / 得到結(jié)果 while (iter.next() System.out.println(iter.LASTNAME(); 在 SQLJ 應(yīng)用程序中,可以使用 ExecutionContext 類去控制和監(jiān)控 SQL 語(yǔ)句的執(zhí)行,如 清單 4所示。 清單 4. 在 SQLJ 使用 ExecutionContext / 分配存儲(chǔ)執(zhí)行上下文的變量 ExecutionContext exeCtx=new ExecutionContext(); / 關(guān)聯(lián)變量和要執(zhí)行的語(yǔ)句 #sql connCtx, exeCtx DELETE FROM EMP WHERE SALARY 10000; / 獲取結(jié)果 System.out.println(Deleted + exeCtx.getUpdateCount() + rows);動(dòng)態(tài) SQL 應(yīng)用嵌入式動(dòng)態(tài) SQL與嵌入式靜態(tài) SQL 相同,嵌入式動(dòng)態(tài) SQL 也需要預(yù)編譯。不同的是,嵌入式動(dòng)態(tài) SQL 將 SQL 語(yǔ)句存放在宿主語(yǔ)言的字符型變量中,這樣的 SQL 語(yǔ)句在預(yù)編譯時(shí)是不被處理的,而是被當(dāng)作主機(jī)變量對(duì)待,直到程序運(yùn)行時(shí)才被編譯執(zhí)行。 得益于動(dòng)態(tài) SQL 的優(yōu)點(diǎn),嵌入式動(dòng)態(tài) SQL 可以處理運(yùn)行時(shí)才確定的 SQL 語(yǔ)句,例如由程序運(yùn)行時(shí)拼接的 SQL 語(yǔ)句。為了處理返回結(jié)果未知的 SELECT 語(yǔ)句,嵌入式動(dòng)態(tài) SQL 使用 SQLDA(SQL descriptor area) 結(jié)構(gòu)和 DESCRIBE 語(yǔ)句獲取結(jié)果集的結(jié)構(gòu)和屬性。SQLDA 結(jié)構(gòu)如 圖 1所示。HEADER 描述整個(gè)結(jié)果集的信息,而每個(gè) SQLVAR 結(jié)構(gòu)描述結(jié)果集中一個(gè)字段的信息。 圖 1. SQLDA 結(jié)構(gòu)清單 5展示了如何使用 SQLDA 結(jié)構(gòu)和 DESCRIBE 語(yǔ)句處理 SELECT 語(yǔ)句。 清單 5. 使用 SQLDA 結(jié)構(gòu)和 DESCRIBE 語(yǔ)句的偽代碼 /test1.sqc / 聲明兩個(gè) SQLDA 指針,minsqlda 將是一個(gè)最小的 SQLDA 結(jié)構(gòu),用于 PREPARE 語(yǔ)句, / 此時(shí)結(jié)果集的字段數(shù)量未知,所以只需一個(gè)最小的 SQLDA,即包含 HEADER 和一個(gè) SQLVAR struct sqlda * minsqlda = new sqlda; struct sqlda * fulsqlda = NULL; strcpy(hostVarStmt, SELECT name FROM TEST_TBL); / PREPARE 將填寫 minsqlda 的 header,sqldabc 為 SQLDA 總長(zhǎng)度,sqln 為 SQLVAR 數(shù)量,即字段數(shù)量 EXEC SQL PREPARE STMT INTO :*minsqlda FROM :hostVarStmt; / 根據(jù)從 minsqlda 中獲取的長(zhǎng)度,分配完整的 SQLDA 結(jié)構(gòu) fulsqlda,其中將包括合適數(shù)量的 SQLVAR 結(jié)構(gòu) fulsqlda = (struct sqlda *)malloc(SQLDASIZE(minsqlda-sqln); / 使用 DESCRIBE 語(yǔ)句,獲取結(jié)果集中每個(gè)字段的描述信息,包括各字段的類型 (sqltype) 和長(zhǎng)度 (sqllen) EXEC SQL DESCRIBE STMT INTO :fulsqlda; Loop / 根據(jù)每個(gè)字段的長(zhǎng)度,分配內(nèi)存,將地址存儲(chǔ)在對(duì)應(yīng) SQLVAR 的 sqldata 中 / 聲明游標(biāo) EXEC SQL DECLARE c1 CURSOR FOR STMT; EXEC SQL OPEN c1; / 讀取記錄,記錄中每個(gè)字段的內(nèi)容將寫入 fulsqlda 中對(duì)應(yīng) SQLVAR 結(jié)構(gòu)的 sqldata 指向的內(nèi)存 EXEC SQL FETCH c1 USING DESCRIPTOR :*fulsqlda; / 循環(huán)讀取所有記錄 while (sqlca.sqlcode != 100) EXEC SQL FETCH c1 USING DESCRIPTOR :*fulsqlda; EXEC SQL CLOSE c1;DB2 CLIDB2 CLI(Call Level Interface)基于微軟的 ODBC(Open Database Connectivity)標(biāo)準(zhǔn),同時(shí)也增加了 DB2 特有的功能。它允許開(kāi)發(fā)人員使用 C/C+ 語(yǔ)言訪問(wèn) DB2 并通過(guò)函數(shù)調(diào)用將動(dòng)態(tài) SQL 語(yǔ)句傳遞給 DB2。DB2 CLI 一方面在 ODBC 的環(huán)境中作為 ODBC 驅(qū)動(dòng)被 ODBC 管理器加載,另一方面,應(yīng)用程序也可以直接使用 DB2 CLI API,此時(shí)具有更好的性能。清單 6展示了 CLI 如何執(zhí)行一個(gè) DELETE 語(yǔ)句。 清單 6. CLI 應(yīng)用程序片斷 /* SQL statements to be executed */ SQLCHAR * stmt1 = (SQLCHAR *)delete from test1 where col1 = 5; /* directly execute statement 1 */ cliRC = SQLExecDirect(hstmt, stmt1, SQL_NTS);對(duì)一個(gè)返回結(jié)果未知的 SELECT 查詢語(yǔ)句,需要使用相關(guān)的 CLI API 函數(shù)動(dòng)態(tài)地獲取對(duì)結(jié)果集的描述,并取回?cái)?shù)據(jù)。圖 2展示了這個(gè)處理過(guò)程。 圖 2. DB2 CLI 應(yīng)用程序處理 SELECT 語(yǔ)句流程與嵌入式動(dòng)態(tài) SQL 應(yīng)用相比,CLI 程序的靈活性更強(qiáng)。表 3列舉了 CLI 應(yīng)用程序和嵌入式動(dòng)態(tài) SQL 應(yīng)用程序的比較。 表 3. CLI 應(yīng)用程序和嵌入式動(dòng)態(tài) SQL 應(yīng)用程序的比較CLI嵌入式動(dòng)態(tài) SQLDB2 CLI 應(yīng)用程序使用 API 函數(shù)發(fā)送 SQL 語(yǔ)句,應(yīng)用程序的編譯、連接和運(yùn)行獨(dú)立于特定數(shù)據(jù)庫(kù),即無(wú)需預(yù)編譯,也不需要綁定到某個(gè)數(shù)據(jù)庫(kù)實(shí)例。嵌入式動(dòng)態(tài) SQL 應(yīng)用程序需要預(yù)編譯,并且需要綁定到特定的數(shù)據(jù)庫(kù)實(shí)例。CLI 提供的滾動(dòng)游標(biāo)(scroll cursor)支持前、后向移動(dòng)一行或者多行記錄,而移動(dòng)的起點(diǎn)可以是第一行、最后一行或者之前存儲(chǔ)的位置。只支持順序前向讀取游標(biāo),并使用 FETCH 語(yǔ)句取得記錄??梢垣@取存儲(chǔ)過(guò)程調(diào)用返回的結(jié)果集。并支持多種 DB2 服務(wù)器??梢垣@取存儲(chǔ)過(guò)程的輸出型或輸入 - 輸出型參數(shù)的值,但不能獲取存儲(chǔ)過(guò)程返回的結(jié)果集。只支持 C/C+ 語(yǔ)言。支持 C/C+, FORTRAN、COBOL 和 Java(SQLJ)。使用 CLI API 函數(shù) SQLDescribeCol()、SQLAttribute() 描述未知 SQL 語(yǔ)句結(jié)果集的信息,包括結(jié)果集字段長(zhǎng)度、類型、精度等信息。使用 SQLDA 結(jié)構(gòu)和 DESCRIBE 語(yǔ)句獲取未知 SQL 語(yǔ)句結(jié)果集的字段列表,包括類型、長(zhǎng)度等信息。JDBCJDBC 是 Java 編程語(yǔ)言訪問(wèn)關(guān)系型數(shù)據(jù)庫(kù)的工業(yè)標(biāo)準(zhǔn),類似于 ODBC,為訪問(wèn)基于 SQL 的數(shù)據(jù)庫(kù)提供了一組調(diào)用級(jí)的 API。在 JDBC 規(guī)范中,存在 4 種類型的 JDBC 驅(qū)動(dòng),DB2 LUW V9.7 中支持 Type 2 和 Type 4 兩種類型。更多關(guān)于 JDBC 的信息可參考 DB2 UDB for Linux, UNIX 和 Windows 中的 Java 開(kāi)發(fā)概述(參見(jiàn) 參考資源部分)。 JDBC 以 Java 包的形式提供了一組接口和類,用來(lái)連接數(shù)據(jù)庫(kù)和執(zhí)行 SQL 語(yǔ)句,這里的 SQL 語(yǔ)句也是動(dòng)態(tài) SQL,無(wú)須預(yù)編譯和數(shù)據(jù)庫(kù)綁定。清單 7所示為 JDBC 程序片斷。 清單 7. JDBC 應(yīng)用程序片斷 try stmt = con.prepareCall(select * from table1); stmt.execute(); rs = stmt.getResultSet(); while (rs!=null && rs.next() System.out.println(output: = + rs.getInt(1); catch(SQLException sqle) System.out.println(Error, SQLCODE = + sqle.getSQLState(); con.rollback(); 除了編程語(yǔ)言和運(yùn)行基礎(chǔ)架構(gòu)的不同,JDBC 應(yīng)用和 CLI 應(yīng)用具有很多相似的特性,例如它們都支持后向游標(biāo),分布式事務(wù)等。 ADO.NET 和 OLE DBADO.NET 是 Microsoft .NET Framework 基礎(chǔ)類庫(kù)的一部分,提供了訪問(wèn)關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng)和其他數(shù)據(jù)源的能力。ADO.NET 主要包括兩個(gè)部分:DataSet 和 DataProvider。使用 ADO.NET,有三種 DataProvider 可以用來(lái)訪問(wèn) DB2: OLE DB .NET Data Provider 和 ODBC .NET Data Provider 是兩種橋接式 provider,它們將 ADO.NET 請(qǐng)求轉(zhuǎn)換為對(duì) IBM OLE DB Provider 或 IBM ODBC Driver 的請(qǐng)求。 DB2 .NET Data Provider 是訪問(wèn) DB2 時(shí)推薦使用的 .NET provider,由于沒(méi)有額外的 OLE DB 或 ODBC 層,它具有更好的性能。 OLE DB 是一種較早出現(xiàn)的數(shù)據(jù)訪問(wèn)模型,它基于 Microsoft 的 COM 技術(shù),提供了訪問(wèn)不同信息源的統(tǒng)一方法。OLE DB 定義了 OLE DB 消費(fèi)者和提供者,OLE DB 消費(fèi)者可以通過(guò) IBM OLE DB Provider for DB2 訪問(wèn) DB2 中的數(shù)據(jù)。使用 OLE DB 訪問(wèn) DB2 的應(yīng)用程序可能包括 Microsoft Visual Studio C+ 應(yīng)用,Microsoft Visual Basic 應(yīng)用,ATL 應(yīng)用等。 其他應(yīng)用程序開(kāi)發(fā)接口Perl 程序員可以使用 Perl 數(shù)據(jù)庫(kù)接口 DBI 來(lái)訪問(wèn) DB2。IBM 提供的 DBI 驅(qū)動(dòng)為 IBMDB2Database Driver for Perl DBI (the DBD:DB2 driver)。Perl DBI 同樣使用動(dòng)態(tài) SQL,而且 Perl DBI 的接口與 CLI 和 JDBC 很相似,易于使用。 PHP 在 Web 應(yīng)用開(kāi)發(fā)領(lǐng)域一直占據(jù)很大份額,IBM 提供了下面兩種 PHP 擴(kuò)展以訪問(wèn) DB2 數(shù)據(jù)庫(kù): ibm_db2,是一種過(guò)程化的應(yīng)用編程接口,與 PHP 應(yīng)用一起編譯,提供一系列的 PHP 函數(shù)來(lái)訪問(wèn)數(shù)據(jù)庫(kù)。 pdo_ibm,是 IBM 提供的 PHP Data Objects (PDO) 驅(qū)動(dòng)。 此外,IBM 對(duì) Python,Ruby on Rails 等編程語(yǔ)言都提供了相應(yīng)的 DB2 訪問(wèn)支持。這些開(kāi)發(fā)接口同樣都使用動(dòng)態(tài) SQL。 應(yīng)用場(chǎng)景以及如何選擇本節(jié)將結(jié)合幾個(gè)應(yīng)用場(chǎng)景來(lái)介紹如何選擇 DB2 編程接口以及靜態(tài) / 動(dòng)態(tài) SQL。 場(chǎng)景 1銀行中賬目統(tǒng)計(jì)系統(tǒng)比較穩(wěn)定,一般運(yùn)行在一個(gè)特定的數(shù)據(jù)庫(kù)中,其目的是整合業(yè)務(wù)數(shù)據(jù)庫(kù)上數(shù)據(jù),并通過(guò)分析數(shù)據(jù)得到一些相關(guān)的統(tǒng)計(jì)信息。這樣的系統(tǒng)具有以下一些特點(diǎn) : 穩(wěn)定,系統(tǒng)邏輯不會(huì)有什么變化,訪問(wèn)固定的數(shù)據(jù)庫(kù)以及表。 定時(shí)運(yùn)行,賬目統(tǒng)計(jì)信息通常需要在一段時(shí)間內(nèi)進(jìn)行整合。 數(shù)據(jù)量比較大,對(duì)性能要求較高。 針對(duì)這些特點(diǎn),建議使用主要由靜態(tài) SQL 語(yǔ)句組成的應(yīng)用程序,這樣該系統(tǒng)在建立的時(shí)候會(huì)被編譯,然后相關(guān)的編譯信息會(huì)被存儲(chǔ)到數(shù)據(jù)庫(kù)里,在以后的運(yùn)行過(guò)程中避免重復(fù)編譯,同時(shí),這種應(yīng)用由于結(jié)構(gòu) 簡(jiǎn)單使得其很容易維護(hù)。當(dāng)然,由于系統(tǒng)的數(shù)據(jù)變化較快,而且數(shù)據(jù)量很大,所以建議定時(shí)重新編譯程序,使得數(shù)據(jù)庫(kù)對(duì)每條 SQL 語(yǔ)句可以選擇最優(yōu)的運(yùn)行方式。 場(chǎng)景 2考慮電信運(yùn)營(yíng)商對(duì)用戶話單的計(jì)費(fèi)場(chǎng)景,圖 3顯 示了一個(gè)電信運(yùn)行系統(tǒng)結(jié)構(gòu)圖。業(yè)務(wù)系統(tǒng)產(chǎn)生的各種話單會(huì)集中存放在一個(gè)關(guān)系型數(shù)據(jù)庫(kù)中,該數(shù)據(jù)庫(kù)可能位于大規(guī)模的高可靠性服務(wù)器。而計(jì)費(fèi)程序則往往作為一 個(gè)單獨(dú)的應(yīng)用部署在其他規(guī)模較小的 UNIX 服務(wù)器上,并作為守護(hù)程序或者批處理程序運(yùn)行。另外,很多業(yè)務(wù)規(guī)則例如計(jì)費(fèi)標(biāo)準(zhǔn)可能存放在單獨(dú)得小型數(shù)據(jù)庫(kù)系統(tǒng)中。 圖 3. 電信運(yùn)營(yíng)系統(tǒng)結(jié)構(gòu)示意圖計(jì)費(fèi)程序的工作主要包括:從話單數(shù)據(jù)庫(kù)讀新話單,從業(yè)務(wù)配置數(shù)據(jù)庫(kù)讀取計(jì)費(fèi)標(biāo)準(zhǔn),計(jì)算話單的費(fèi)用和優(yōu)惠,將計(jì)費(fèi)完畢的話單寫回話單數(shù)據(jù)庫(kù)。 由于計(jì)費(fèi)標(biāo)準(zhǔn)的選擇經(jīng)常和日期等變化的信息相關(guān),程序中會(huì)存在一些不固定的 SQL 語(yǔ)句,因此靜態(tài) SQL 應(yīng)用并不適用。另外,除了訪問(wèn)結(jié)構(gòu)穩(wěn)定的話單數(shù)據(jù)庫(kù),計(jì)費(fèi)程序也需要訪問(wèn)一些變化概率較大的小型數(shù)據(jù)庫(kù),例如計(jì)費(fèi)標(biāo)準(zhǔn)可能會(huì)因?yàn)檫\(yùn)營(yíng)商營(yíng)銷策略的調(diào)整而發(fā) 生變化。如果使用嵌入式 SQL,就必須將應(yīng)用程序和數(shù)據(jù)庫(kù)進(jìn)行綁定,這將
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 挖機(jī)租用合同協(xié)議書
- 房租拆改合同協(xié)議書
- 平臺(tái)運(yùn)營(yíng)外包協(xié)議書
- 放棄失地保險(xiǎn)協(xié)議書
- 建筑合同銷毀協(xié)議書
- 房屋協(xié)商買賣協(xié)議書
- 承包道路維修協(xié)議書
- 抵押船舶買賣協(xié)議書
- 房房合同解除協(xié)議書
- 房屋合伙改造協(xié)議書
- 物業(yè)公司保安巡邏崗巡查記錄表(完整版)
- 2025年全國(guó)保密知識(shí)競(jìng)賽經(jīng)典試題庫(kù)及答案(共250題)
- 2025年中國(guó)鐵路上海局集團(tuán)限公司招聘495名畢業(yè)生四(高等職業(yè)院校)高頻重點(diǎn)提升(共500題)附帶答案詳解
- 中國(guó)AI+Agent應(yīng)用研究報(bào)告
- 品管圈PDCA獲獎(jiǎng)案例提高護(hù)士對(duì)患者身份識(shí)別和查對(duì)制度的正確率
- 痛風(fēng)診療規(guī)范2023版課件
- 中建中建滑模施工方案范本
- 【MOOC】頸肩腰腿痛中醫(yī)防治-暨南大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 《法國(guó)師范教育》課件
- 安全法規(guī)-終結(jié)性考試-國(guó)開(kāi)(SC)-參考資料
- 公司用工協(xié)議書簡(jiǎn)單范本(2篇)
評(píng)論
0/150
提交評(píng)論