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