摘 要:隨著數(shù)據(jù)庫應(yīng)用系統(tǒng)中數(shù)據(jù)的增加,系統(tǒng)的響應(yīng)速度成為系統(tǒng)設(shè)計中需要解決的主要問題。由于用戶對數(shù)據(jù)庫的要求越來越高,因此必須對數(shù)據(jù)庫進行優(yōu)化。系統(tǒng)優(yōu)化的一個很重要的方面就是SQL語句本身的優(yōu)化,文章從應(yīng)用的角度論述了SQL語句優(yōu)化的一些方法。
關(guān)鍵詞:數(shù)據(jù)庫 優(yōu)化 SQL Oracle
中圖分類號:TP3 文獻標(biāo)識碼:A 文章編號:1672-3791(2012)12(b)-0031-01
在信息化告訴發(fā)展的今天,數(shù)據(jù)庫的競爭和更新技術(shù)日新月異,部署有ERP、CRM等關(guān)鍵應(yīng)用的企業(yè)中,數(shù)據(jù)庫是不可或缺的組成部分。本文結(jié)合Orac數(shù)據(jù)庫,并通過多年的工作經(jīng)驗,談?wù)凷QL的一些優(yōu)化方法在計費帳務(wù)核查中應(yīng)用。
1 SQL的一些優(yōu)化方法在計費帳務(wù)稽核中的應(yīng)用
在目前的帳務(wù)稽核中,所有的檢查都是通過編寫SQL語句向數(shù)據(jù)庫提交需求的,面對全省同時提交的數(shù)百個數(shù)據(jù)需求,服務(wù)器接受的任務(wù)過多,往往會出現(xiàn)任務(wù)被吊起、長時間不響應(yīng)的現(xiàn)象,甚至影響了帳務(wù)結(jié)算工作。經(jīng)過核查,造成死鎖的原因很大部分是因為提交的語句存在各種語法或邏輯問題,易造成死鎖,極大的浪費了系統(tǒng)資源。因此必須對編寫和提交的SQL語句進行優(yōu)化,減少系統(tǒng)資源被無效占用和損耗,這是提高帳務(wù)結(jié)算及稽核效率,按期完成工作的前提。
1.1 依據(jù)“共享池中重用SQL語句”的原則,規(guī)定統(tǒng)一的語句語法
Oracle提供在數(shù)據(jù)庫中存儲代碼的能力。當(dāng)應(yīng)用系統(tǒng)開始運行時,從數(shù)據(jù)庫中讀取代碼傳遞到共享池中去處理。從數(shù)據(jù)庫中取出的代碼是編譯過的并駐留在共享池中。當(dāng)SQL語句被傳遞給Oracle處理時,如果Oracle接受了一個與共享池中的語句相一致的語句,就重用共享池中的語句。兩條SQL語句必須是語法、文本完全相同,才能視為可共享的SQL,利用Oracle的共享區(qū)。
帳務(wù)稽核工作是由全省各地本地網(wǎng)的人員同時參與,人員較多且語句的編寫思路均存在差異,但最終的需求是一致的,依據(jù)共享原則,由區(qū)公司帳務(wù)處理部門按照稽核要求和內(nèi)容,規(guī)定稽核點和稽核方法,下發(fā)經(jīng)過整理的具有標(biāo)準(zhǔn)格式、大小寫以及相同變量等遵循約定的稽核語句和過程,從而可以最大限度的重用共享池中的SQL語句。
1.2 對索引的有效利用
在Oracel的執(zhí)行規(guī)則中,如果目標(biāo)表無索引、語句中無條件限定、條件指定為NULL或者是不相等、或?qū)l件在表達式里使用以及使用Like操作以及值以‘%’開始等等,系統(tǒng)會進行全表掃描,效率低下,因此在語句的編寫中應(yīng)避免上述情況,盡量采用能夠使用索引的條件,對于必須使用到的列在使用前務(wù)必建立相應(yīng)的索引。
最基本的客戶、賬戶、用戶三級關(guān)系,在查詢或其他應(yīng)用中均會用到這三列,系統(tǒng)內(nèi)的表在這三列上均建有索引,因此在進行帳務(wù)稽核或者后期的數(shù)據(jù)提取中,應(yīng)對涉及到此字段的臨時表建立相同的單列索引,在有索引的列上進行條件限定,如下實例:
(1)及時建立索引:
create table tmp_alt_check_1009 as
select*from tmp_alt_check_1009_dsb
union all
select*from tmp_alt_check_1009_yhz;
create index tmp_alt_check_1009_serv on tmp_alt_check_1009 (serv_id);
create index tmp_alt_check_1009_cust on tmp_alt_check_1009 (cust_id);
create index tmp_alt_check_1009_acct on tmp_alt_check_1009 (acct_id);
上述應(yīng)用中對新建表tmp_alt_check_1009分別建立了serv_id,acct_id,cust_id的單列索引,以便在其后的使用中提高搜索效率。
(2)條件限定時避免使用Like操作或者限定值以‘%’開始,不使用NULL或者是不相等。
如:將select*from product_offer_t where region_id like‘1020%’;
替換為:
select*from product_offer_t where region_id=’1020’;
將select*from product_offer_t
Where pricing_pla_id is not null or pricing_pla_id<>0;
替換為:
select*from product_offer_t Where pricing_pla_id>0;
通過以上細節(jié)的注意和替換,可避免系統(tǒng)對全表進行掃描,有效利用索引,提高系統(tǒng)響應(yīng)效率。
1.3 使用選擇性好的索引
索引的選擇性是指索引列里不同值的數(shù)目與表中記錄數(shù)的比。最好的可能性選擇是1.0,即表內(nèi)索引列上無重復(fù)記錄。
在做帳務(wù)稽核中,常常會基于某種條件和需求建立一些臨時表,并為臨時表建立索引,在臨時表的建立和使用中,應(yīng)判斷建立索引的字段的選擇性和有效性的好壞,避免低效率的操作和資源的浪費。
1.4 根據(jù)實際情況區(qū)別使用UNION ALL和UNION操作
最常用的集操作是UNION和UNION ALL操作,UNION操作使多個記錄集聯(lián)結(jié)成為單個集,返回記錄的單個集并且沒有重復(fù)的行,進行表鏈接后會對所產(chǎn)生的結(jié)果集進行排序運算,刪除重復(fù)的記錄再返回結(jié)果。UNION ALL是一個行操作,操作允許重復(fù),不要求SORT UNIQUE操作,從而節(jié)省了開銷。當(dāng)UNION ALL操作產(chǎn)生巨大的結(jié)果集時,不需要任何排序便返回記錄給應(yīng)用,檢索的響應(yīng)時間更快,對臨時空間的要求也更低。
在稽核過程中,需要根據(jù)需求確定是否需要濾重,盡量避免不需濾重的情況下而用UNION操作,如果作為結(jié)果子集時,更應(yīng)該避免使用UNION操作,浪費排序的時間和空間資源。
稽核中最常見的需求是對營業(yè)區(qū)或著支局或某個帳目、事件等產(chǎn)生的費用或話務(wù)量進行與歷月的對比,以確定發(fā)生的數(shù)據(jù)是否脫離了正常規(guī)律,結(jié)果是否正確。若采用UNION會把重復(fù)記錄濾除掉,結(jié)果是不符合需求的,且采用UNION ALL操作,系統(tǒng)的響應(yīng)速度更快,最終根據(jù)需求確定此類稽核都需要采用UNION ALL操作,來保留所有完整的數(shù)據(jù)記錄。
1.5 將復(fù)雜的多子集連接操作轉(zhuǎn)化為小的帶索引的臨時表
在帳務(wù)稽核中,往往需要把符合條件的幾部分?jǐn)?shù)據(jù)匯總,形成一個新的結(jié)果表,處理方式有兩種:一種是用直接union all操作把各個查詢子集連接形成最終的結(jié)果表;另一種是分別將各個子集建成新的小表,再將小表用union all操作建成最終的結(jié)果表。第一種方法需要大量的臨時空間作為查詢結(jié)果子集的臨時存儲空間,對系統(tǒng)資源的占用也較大,經(jīng)過實踐驗證,采用第二種方式往往能獲得更快的響應(yīng)速度。
2 結(jié)語
文章結(jié)合省電信公司的收費系統(tǒng),結(jié)合Oracle數(shù)據(jù)庫,簡單討論了數(shù)據(jù)庫庫的應(yīng)用,在生活中,數(shù)據(jù)庫的應(yīng)用還很多,比如數(shù)據(jù)庫在電信收入保障的應(yīng)用等等。
參考文獻
[1]郎宇征,賈美英.服務(wù)器集群為數(shù)據(jù)庫系統(tǒng)搭臺[J],2005.
[2]黨正科,王新英.Oracle8.X For Windows NT實用教程[M].清華大學(xué)出版社,1999.