提高CS系統效能的一些方法

2021-08-04 01:46:24 字數 4740 閱讀 1311

二、乙個例子

下面,我們來考慮這樣乙個例子:乙個資料庫應用程式完成顯示每個銷售訂單的所有行的金額合計。

一般演算法分兩步:

(1)每行專案中數量乘以單價=金額;

(2)把每行金額累加。

第一種方法:

每次一行,然後,用應用程式累加,即

select orderid, quantity ,unitprice

from item ,stock

where stock.id=item.id

order by orderid

結果為:

orderid quantity unitprice

1 1 6.03

1 1 21.4

1 4 87.12

2 2 8.97

2 3 21.4

採用這種方法,若業務量增大,則其網路的傳輸量相應增大。

第二種方法:

讓資料庫伺服器進行計算,然後只把結果從網上取過來,即:

select orderid ,sum(quantity *unitprice)

from item , stock

where item.id=stock.id

group by orderid

order by orderid

結果為:

orderid sum(quantity*unitprice)

1 265.87

2 82.14

如上所示,由於第二種查詢使用了乙個sql的組合,即乙個sql函式(sum)以及乙個group by子句,讓伺服器來執行計算。因此,只需從網上傳輸較少的資料。

這個簡單例子說明:

1.在客戶機/伺服器環境中如何用sql函式減少網路上的傳輸量;

2.開發人員必須完全熟悉sql才能做出好的客戶機資料庫應用程式。

三、提高效能的方法

下面我們介紹幾種提高效能的方法。

1.使用完整性約束

所有客戶機應用程式必須遵循一系列預先定義的資料完整性規劃及業務規則,以保證所有資料庫資料是合法的。可以使用兩種方法來實施乙個簡單的完整的規則:讓應用程式執行完整性檢查;使用oracle7的完整性約束。

(1)讓應用程式執行完整性檢查

例如,任何乙個訂單( orders)的顧客號必須是客戶機表( customer)中的顧客戶機號。這是乙個最簡單的引用完整性,可以用應用程式本身執行完整性檢查。

declare

flag integer;

begin

select id into flag

from customer

where id=3

for update of id;

if sql%found then

insert into orders

values(5,3,sysdate,null,null,'f');

-- 其他應用邏輯

commit;

end if;

end;

這個過程只是在應用程式內部用於實施引用完整性規則的一種方法,但可以看出,為實施乙個簡單的完整性規則,應用程式要花大量的時間通過網路來請求和傳送資料。

(2)使用oracle 7的完整性約束

create table orders

(id integer primary key,

customer id integer not null references customer,

orderdate date not null,

shipdate date default sysdate,

paidate date default sysdate,

status char(1) default 『f' check(status in(『f'

,『b'))

);   實施簡單完整性規則(如引用完整性)的更好方法是使用oracle 7的完整性約束。該方法的好處是明顯的:

①定義乙個表的同時,方便地建立完整性約束,開發人員不需為實施乙個簡單的完整性規則而建立測試、排錯複雜的資料完整性邏輯,提高了工作效率;

②用集中化的方法實現完整性規則;

③無需任何網路i/o,客戶機/伺服器系統也就不會因為網路訪問而降低效能。

2.使用資料庫觸發器

應用程式經常需要實施複雜的業務規則,這些規則無法用完整性規則表示,所以最好不要按照常規思路在應用程式中實施完整性規則;而是用資料觸發子(triggers)來實施業務規則。其優點是容易建立,可集中進行規則實施,避免不必要的網路i/o。利用資料庫觸發子可以使其他一些應用程式集中化和自動化。

比如,計算item 表中的total 列的值是所訂零件的數量乘以零件的單價,而零件單價存放在stock表中,當插入乙個新的行專案時,應用程式計算total列的值有兩種方法。

方法一:讓應用程式通過sql命令執行這個操作

declare total real;

begin

select unitprice*quantity into total

from stock, item

where id=4;

insert into item values(...);

end應用程式通過網路發出請求,取得某一些零件單價,然後插入這個含有該行計算值(tota l)的行。修改item表中某行數量值,應用程式需要包含相似的邏輯來計算。此外,多個使用者還可能同一時刻插入和修改訂單。

總之,用這種方法來計算total 列時會在客戶機/伺服器系統中產生大量的網路傳輸。

方法二:用資料庫觸發子, 從乙個行專案自動匯出total 的值, 當使用者在item表中插入新行或修改quantity時,無需任何網路訪問。

create trigger linetotal

before insert or update of quantity,stockid

on item

for each row

delare

itemprice real;

begin

select unitprice

into itemprice

from stock

where id=:new.stockid;

:new.tolal:=new.quantity*itemprice;

end linetotal;

當建立觸發器linetotal後, 應用開發人員在編寫應用程式時就不需考慮保持total列為最新值的問題,而且網路資料庫上所有應用都會因此受益。

3.利用過程和包優化效能

這裡主要討論如何利用完整性約束和資料庫觸發器把應用邏輯移到資料庫伺服器中執行以便減少網路i/o,提高效能。其它型別應用處理邏輯分布到資料庫伺服器亦可以減少客戶機/伺服器應用中的網路i/ o,應用程式不必再用包含多個網路操作的sql語句去執行資料庫伺服器操作,而是簡單且有效地呼叫儲存過程。包是一種用來把多個有關的過程在資料庫中封裝起來的方法。

下面是用sql和用儲存過程例子的差異:

例如要插入某些行專案的訂單,用sql實現過程:

insert into orders values(...)

insert into item values(1,..)

update stock set onhand=...

insert into orders values(...)

insert into item values(2,..)

update stock set onhand=...

insert into orders values(...)

insert into item values(3,..)

update stock set onhand=...

commit;

要建立乙個新銷售訂單並插入它的三個行專案,應用程式必須用7個不同的的sql語句來實現,每個語句都要通過網路傳輸資料,要減少這些sql語句在客戶機/伺服器系統中產生的網路傳輸量,可以建立兩個簡單的過程來插入訂單及行專案。

create procedure placeorder(custid in integer) as

begin

insert into orders

values(orderseq.nextval,custid,sysdate,null,null,『f

');end placeorder;

create procedure placeitem

(itemid in integer,partid in integer, quan in integer)

asbegin

insert into item(id,orderid,stockid,quantity)

values(itemid,orderseq.currval,partid,quan);

update stock

set onhand=onhand-quan

where id=partid;

end placeitem;

應用程式只需簡單呼叫這幾個過程。

placeorder(3);

placeitem(1,3,2);

placeitem(2,8,1);

placeitem(3,9,3);

當乙個應用程式呼叫儲存過程時,通過網路傳送的資料只有過程呼叫及引數。本文提出的提高客戶機/伺服器應用系統效能的方法,主要是採用合理分布處理邏輯於客戶機端與伺服器端,並充分利用資料庫伺服器來提高執行速度。該方法的有效性,已在我們開發的多項客戶機/伺服器應用系統中得到證實。

此外,在提高效能的措施和方法中,sql語句的查詢優化問題也不可忽視。綜合上述兩種方法,才能從根本上提高客戶機/伺服器應用系統的效能。

文獻研究的一些方法

研究是一門藝術,也是一種科學。研究的藝術性與科學性很大程度上取決於研究方法。愈來愈意識到研究方法的重要性,對於即將開始的博士 研究更是如此,這對於當下的我來說無疑是一大挑戰。需要進一步了解更加科學與具體的研究方法,並將其適切地運用在研究工作中,本階段的工作重點就是確定選題和研究方法。今天看到的三種量...

魔法中的一些方法

翻譯者補述 五芒星盤充能其實很簡單,找乙個乾淨的圓木盤 圓形木板也行,不需要太大 在上面畫上乙個五芒星 廣告顏料就好,初學者與一般人不用太高階 然後將對應的蠟燭放在五芒星盤的前方,將護符放在盤上,點燃蠟燭,念誦咒語,冥想全宇宙的對應能源進入護符之中,直到你覺得滿意為止。翻譯者補述 這裡寫的是南半球的...

銷售管理的一些方法

一 一季度的工作小結 今年一季度在全體銷售人員與經銷商的努力下,實現了開門紅,產銷量比去年同期增長16.77 其中瓶裝水增長26.4 配製奶增長8.52 發酵奶增長15.66 碳酸飲料負增長28.97 果汁飲料增長62.36 茶飲料增長45.09 八寶粥增長32.58 純牛奶 花式奶負增長49.33...