A. 資料庫設計的重要性
原創點經驗吧,好的資料庫設計有下面的一些作用,下面說的都是關系型資料庫。
1、首先充分體現系統的需求,資料庫是為應用服務的,好的資料庫設計應該首先能滿足應用系統的業務需求,准確的表達數據間關系。
2、保證數據的准確性和一致性,通過主外鍵、非空、限制、唯一索引等保證數據的健壯。
3、提高數據的查詢效率,通過合理表結構,安排物理存儲分區、增加索引等方式,提高數據的讀取速度,提高查詢效率。
4、有好的擴展性,在必要時能根據需求擴展數據結構。
B. 中國建設銀行用什麼資料庫
核心系統(core banking)應該用的是DB2,但外圍應用有別的資料庫,比如網銀好像是oracle。
C. 簡單的銀行叫號系統 C++編程
編程是好比是兩個城市之間的旅程,開發語言(C++)就好比是交通工具,其實乘坐什麼工具並不重要,最重要的是你要知道怎麼走,也就是整個程序的設計你要明了。廢話少說,下面簡單介紹一下這個系統的開發流程:
第一步,先把資料庫設計好,如果是單個銀行網點,可以用ACCESS或者sqllite資料庫,如果是某個銀行集團的多個網點,那就需考慮用大型資料庫了,比如Microsoft SQL Server;
資料庫中最起碼要包含以下幾個表:
1,業務類型表:
2,取號類型表(普通號、優先號)
3,掛號表等
第二步,搭系統框架,這個是整個程序的基石,如果如果要自己設計的話,首先你要有兩三年的編程經驗,急不得。你可以去網上或者是學長那找一些好的模板,這樣會快一點。
4,畫界面
整個程序的界麵包含主界面和一些基本數據的維護界面以及統計報表等,這個需要你一步一步去畫。
5,基本的增刪改查資料庫操作
界面畫好之後,就要對基本數據進行處理了,程序的許多BUG也會在這個時候產生,這個也是基本功,祝你好運。
6,數據的增刪改查做完之後整個程序的開發也就完成的差不多了,剩下的就是一下細節性的東西,不過此時你的旅途只完成了一半。
7,還有一半的工作就是測試測試再測試
若還有疑問,咨詢HESIN排隊。網路HESIN排隊就可以。
D. 什麼是銀行的數據大集中,為什麼要數據大集中呢
簡單地講,大集中就是將分布在各個分支機構和營業網點的業務數據及其他一些相關的數據實現集中。事實上,大集中是依靠科技手段,實現數據的集中和數據的整合,並通過對數據深層次的挖掘,對銀行的客戶數據、業務數據進行系統分析和評價,推動商業銀行向決策科學化方向邁進,提高銀行的管理水平和工作效率。
60年代,自IBM發明了第一台商業計算機系統後,IT開始從無到有,以一種置於玻璃房的主機掛終端的形式起步發展。從80年末期到90年代初期,由於較低的附加開銷、較低的勞工費用,使整個工業界的趨勢走向分布式及部門式管理。為了加快對市場的響應時間,對IT應用系統開發的速度提出了更快的要求,因此IT的體系結構從原來單一集中式模式,走向分布式模式。並且逐步演變成難以控制的分散式架構。經過幾年實踐證明,在這種分散式模式下,帶來許多負面效果:
1)降低了IT的效率
*分散的數據
*分散的技術力量
*機器,軟體系統資源不可共享
*管理水平的不平衡
2)支持及管理人員的增加
*艱難的整體規劃
*艱難的整體管理
3)缺乏標准化
4)增加數據安全性、完整性的風險
5)軟體需要分散的重復投資,軟體及維護費用急劇上升
6)計算機硬體資源利用率低,眾多的計算中心均需自備備份主機及相應設備,無法公用機器的「白色空間」(及空置的CPU資源)
7)更困難的財政及固定資產管理
8)企業內部無法形成數據集中及應用集中,因此無法快速有效地為企業整體的經營管理者提供管理輔助信息。
9)無法承受災難備份的投資,在眾多的分散中心的條件下,實施相互災難備份的費用非常龐大,其管理及運作是及其艱難的。
面對這些挑戰,IT的管理者自然要問:
*怎樣更好地支持、管理網路、軟體及伺服器?
*怎樣更好地控制投資回報?
*怎樣有效快速地分析業務數據?
*怎樣集成分布式應用及數據?
*怎樣將傳統的應用面向電子商務的同時,又能保證關鍵應用的高可用性及安全性?
大集中就是在這種背景下產生的。總結國外IT業的集中方式,無非可以分為以下四種形式的集中:
1)管理運作的集中:即將分散式的IT體系結構,用集中式管理模式進行運作。
2)物理集中:即不改變任何應用體系結構,僅僅將運作在多個伺服器上的應用集中在一台或多台集群式系統內,從而減少了伺服器的數量及種類,可共享系統資源,但客戶數據可能依然是分散的。
3)數據集中:可以使用存儲技術,實施數據的集中存儲及管理;或通過一定的共享軟體機制,實施數據的集中共享。
4)應用的集中:真正可以做到與業務集中相匹配的應用集中,及客戶關鍵業務信息的數據集中。
不同程度的集中,會產生不同的效果,投入及工程的復雜程度也不盡相同。在大集中項目中要考慮許多技術因素,但最最關鍵的是高層領導的重視及支持,及業務部門的介入。
大集中可能會引進對當前IT體系結構的重組(reengineering),因此需從以下幾個方面考量其系統的設計:
首先集中決不是單純IT的技術問題,為IT集中而集中是無效之舉。集中必源於業務的改革,必帶來業務流程的改變。其最終目的是提高企業整體的運作及管理效率並帶來最大利潤。
次之,集中必帶來對應用體系結構的重新評估,可能帶來應用的調整甚至結構重組。
在設計大中心系統時,要有端到端的全局體系結構設計觀念。即從客戶端經由底層網路到前端機,經由骨幹網路到大中心伺服器,其整體結構要具有端到端的高可用性及可管理性。
大中心的整體設計考量因素為以下幾個方面:
1)應用的考量:
在多層次的系統架構中,各類應用在何層伺服器上運行,應用的功能如何分布。要不斷評估何種應用要進行集中,何種應用具有地區的特性,需要分布式運作。
2)企業核心信息資料庫的考量:
核心企業信息如何存放。只有形成了一個邏輯的統一的企業信息資料庫,才可以充分享受到集中的優勢。
3)整體系統性能考量:
由於集中將所有的核心業務運行在一個集中的系統上,客戶的服務業務量呈爆炸式增長,雖著電子商務的發展,BTB、BTC系統的建立,將每天都需要面對大量來自外界的數據訪問和互動式操作,所有這些需要大中心系統具有持續且穩定的響應性能。
4)系統的可擴展性的考量:
大中心系統必須具有很好的可擴展性及成長的能力。中國是一個人口眾多的國家,因此大型企業的客戶數量是驚人的。中國許多大型企業所服務的客戶數大於任何一個北美或歐洲的大型企業。以銀行為例,中國四大商業銀行的客戶帳號數均達上億,因此其企業客戶核心信息數據量將達到幾十個GB甚至為幾十個TB的數據量。因此資料庫、中間件、伺服器及存儲系統均需要具有優秀的可擴展性。除了應付爆發式的數據存儲需求,基礎設施還需要應付短時間內訪問高峰的沖擊,並提供足夠的靈活性對信息有效的管理。
5)高可靠性及高可恢復性的考量:
企業需要考慮為客戶提供每周7天、每天24小時的不間斷服務。同時,基礎設施必須為以不同方式接入的用戶提供同樣的易用性,以及在異構系統之間進行快速的信息查找和交換的應用靈活性,並保持系統能夠以很快的速度得到擴展。
6)冗災備份及恢復能力考量:
災難備份方案絕不是一個單純的技術方案,並且災難備份也決不是一個數據遠程拷貝的方案。它必須基於應用的考量,並外加業務備份規劃。從技術角度考慮,級別越高則備份的能力越高。方案的選擇必須立足於業務的需求,級別越高的備份方案,其項目實施總成本則越高,因此必須基於商務的承受能力進行方案的選擇。
7)端到端的系統管理:
集中後的系統管理將比分布式小中心的運作顯得尤其重要。在小型中心中,通常靠個體的手工管理,當實施大集中後,手工的、無系統化的管理將無法提供所需要的服務水準。因此必須建立可以集中觀測、集中管理的系統,但同時又可以分級進行控制、維護的體系結構。由於應用的集中運作,因此建立幫助平台及嚴格的變更管理體系尤為重要。
8)系統安全性考量:
企業需要保證系統和數據的安全性。需要考慮安全性的不僅是系統設備,還有設備提供商的實際能力。企業需要選擇可信賴的合作夥伴和供應商,在基礎設施系統的管理能力和數據安全方面都要有出色表現。安全可靠的系統不僅能保證前端與後端的系統安全,還需要確保伺服器與應用程序的防攻擊能力。
9)投資保護及降低業務風險:
大集中體系結構是在現有的IT體系結構之上進行再造的過程。體系結構方案必須考慮對現有的IT技術、設備的投資加以保護。甚至包括對應用投資及技術人員投資的保護。在設計和構建基礎設施的過程中,大中心方案不僅僅要著眼於當前的需求,更要放眼於未來的業務發展需求,本著節約成本、保護投資的原則,優化、整合和利用舊系統的資源,使大中心體系結構具有前瞻性。
大集中項目是一個逐步演變的過程,我們不可能在一日之間廢棄舊的體系結構,建立新的體系結構。在建設過程中需要保證與原有系統的成功整合,保證公司和顧客數據的安全性,降低整體風險。在由多種平台和技術組成的異構環境中,大集中項目必須實現新系統結構與原有系統的平滑轉換,這要求有嚴格的項目規劃和項目管理。
10)總體成本考量:
成本效益永遠是要考量的因素之一。與分布式環境相比,數據中心集中可以節省總體IT成本。但是要注意的是,在向集中過渡的過程中,必須重視新型應用的投資。所有IT的投資都不應偏離未來集中的大方向,以避免投資浪費。
分布式的信息技術結構是歷史的原因造成的,它在當時是最佳的選擇,並且也是中國IT發展必經之路。面對未來WTO的挑戰,許多企業開始重視規模化經營。為了在競爭中生存並超越對手,IT也必然需要採用高度的集中和可管理的結構。它也是內部業務集中管理的必然要求,大集中不只是一個技術上的項目,除了它的高科技含量外,它是一個強有力的、策略性的業務項目,它是中國銀行業發展所面臨的一個挑戰。
E. 資料庫高手請進——關於銀行儲蓄系統問題
....要是設計好了,就可以自己開銀行
F. 銀行如何建設企業級資料庫基礎邏輯數據模型
前言:邏輯數據模型LDM是一種圖形化的展現方式,一般採用面向對象的設計方法,有效組織來源多樣的各種業務數據,使用統一的邏輯語言描述業務。藉助相對抽象、邏輯統一且結構穩健的結構,實現數據倉庫系統所要求的數據存儲目標,支持大量的分析應用,是實現業務智能的重要基礎,同時也是數據管理分析的工具和交流的有效手段。 需要強調的是,數據倉庫邏輯數據模型特指數據倉庫系統的核心基礎模型,在搭建企業級數據倉庫系統時,需要充分了解和分析種前台業務處理系統和應用,在此基礎上進行有效的重組和整合,為各種分析應用(如客戶關系管理、風險管理等)提供單一的、整合的數據基礎,保證全行不同業務部門從不同的視角都可以使用統一的數據實現各自的分析需求。——擔負這種數據重組和整合任務的數據模型稱為數據倉庫系統的「基礎邏輯數據模型」。 基礎邏輯數據模型建設好之後,銀行可根據不同的分析應用需要(如客戶關系管理、績效考核、風險管理等),根據應用產品和功能設計不同的分析應用模型,包含具體的、特定的分析邏輯,往往這種模型中都含有較多加工處理的成分。——這種為實現特定用途而設計的數據模型稱為數據倉庫系統的「應用數據模型」。 因此,不誇張地說核心基礎數據模型建設的成敗性會影響到整個數據倉庫系統的建設乃至後續各種分析應用,應引起銀行科技建設和業務分析人員的高度重視。 本文嘗試從銀行建設基礎邏輯數據模型的角度出發,分析、探討建設過程中應該考慮的主要因素、建設的方法以及注意的問題。 一、整體規劃、明確目標、合理定位 銀行建設數據倉庫系統時應充分明確建設目標,核心的邏輯數據模型是對銀行業務的高度抽象、能夠提供對關鍵業務數據的組織和整理,建立一套完整、統一、規范的標准,以便進行各類分析。一個好的核心基礎數據數據模型應該滿足以下條件: 概念上:具有高度抽象的、中性的、可共享的的概念,可有效、全面、完整地適應與涵蓋銀行現有的業務范疇以及數據范圍;不針對某個特別的應用而設計; 結構上:應是穩定的、靈活的、可擴展的;能以滿足第三範式的方法構建模型,存放最詳盡的數據,保證足夠的靈活性,適應復雜的實際業務情況,在業務發生變化或者新增數據源時易於擴展;核心結構在很長時間內應保持穩定性,便於回答不斷產生、不斷變化且無法預先定義的業務問題; 表現形式:應是規范的,易懂的;包括各類命名規范,業務規則定義,度量方式等。使用統一的業務語言進行模型設計,易於業務人員的理解和使用;也有利於IT部門和業務部門人員的溝通; 數據倉庫系統的建設目的和方法不同於傳統業務系統,其開發建設方式也有所不同,它的建設絕不是一蹴而就的事情,不能期望一朝一夕就可以全部完成,比較成熟的建設步驟應該是分階段實施,逐步進行完善和增強因此作為項目起步的LDM建設對於規范和推動整個數據倉庫系統的建設都將起到一個很好的促進。整個建設過程最關鍵的階段就是項目的最初階段,應將工作重心放在搭建模型框架、建立模型設計思想和培養模型設計人員三個方面。 明確了建設目標,具體實施應該如何開展呢? 二、審慎選擇、量體裁衣、度身定做 銀行在明確建設目標之後,如何選擇具體的實施策略、制定設計的階段和步驟呢?常見的主要有以下兩種: 第一種:自主研發:銀行根據以往的業務經驗提煉本行業務的關鍵主題;再設計出本行的概念模型;然後通過具體的業務反復論證,同時考慮將來的分析需求進行基礎邏輯數據模型的詳細設計。 這種方法可以快速啟動,完全依託本行的業務元素和規則,使用行內技術人員和業務人員比較熟悉的語言進行模型的設計,具有很好的適用性。但是整個建設周期比較長,同時往往由於經驗不足等原因給項目帶來一些不可控的風險,由於參與人員經驗的不足,不能夠站在全行的高度,從管理分析的角度去理解所有的業務以及相應的數據,造成一些局限性。 第二種:依託業成熟產品進行客戶化:銀行研究不同的業界模型產品,從中選擇一個作為藍本,結合本行的業務數據和應用系統進行具體的定製化。 這種方法的建設周期短、風險小,同時也能夠很好地借鑒成熟的邏輯數據模型中蘊涵的經營管理理念。但是銀行需要研究和比較多個業界流行的邏輯數據模型,熟悉各自的設計思想和理念,並從中挑選一個適合本行的模型產品進行客戶化。 從國際、國內商業銀行建設數據倉庫系統的經驗和案例來看,為了保證項目的成功實施,避免和控制項目風險,他們幾乎都選擇了第二種方法:客戶化。那銀行在面對眾多邏輯數據模型產品進行選擇的過程中主要應該都關注一些什麼樣的內容呢? 產品層面: 覆蓋范圍:模型產品應能夠適合、涵蓋銀行的所有業務范圍,可以在單一模型中能支撐金零售銀行、公司業務、保險、信用卡、經紀、證券和電子商務等,滿足未來混業經營的需要; 對業務發展的適應性:模型產品應有高度的概括和歸納,既滿足範式化要求,又具有足夠的靈活性,在擴展業務、新增品種或改變規則時,模型通過簡單的調整和擴展即可適應; 對應用的支撐和擴充:模型產品不應偏向某個部門或某些專業的特定應用,要能夠支持績效管理、客戶關系管理、資產負債管理、資金財務管理、風險管理等應用,並與國際金融業完全接軌,從數據介面層面支撐業界監管需要; 模型的開放性:模型產品應有清晰、嚴謹的模型架構,滿足模塊化和結構化的設計要求,真正實現數據一次導入,多次使用; 轉化成物理數據模型的方便性:LDM設計完成,進行一些物理化的定義之後就可以直接利用建模工具平滑地完成物理模型設計。 服務層面: 客戶化方法與能力:邏輯數據模型必須有經過實際項目驗證過的客戶化方法論做指導,明確嚴格的工作步驟、流程、任務分配,並提供必要模板; 業績經驗與表現:應具有國際化大型(特別是國內)商業銀行相關項目和領域的成功實施案例;在行業內具有良好的信譽和業績; 全球支持能力:全球專職研發團隊——各國家地區的具體實施團隊;高級建模顧問——高級金融行業顧問; 不難看出,上述這些考核的方面都是和將來的實施密切相關的。的確,一個成熟的優秀的模型產品,如果沒有得到成功的實施,最終也不能為銀行創造效益。下一部分主要討論在實施過程中的關鍵因素。 三、關鍵成功因素 (1)參與人員的業務經驗 LDM的設計和實施不是一個純粹的技術問題,需要參與人員具有較高的銀行業務修養和素質,設計人員應能夠憑借豐富的業務經驗和知識,將散落在各種不同業務系統以及日常經營管理中的各種數據元素進行高度的抽象和概況,形成本行的幾個主題域(如當事人、協議、產品、事件等),用以清晰地表達業務邏輯和關系。同時,他們也必須時刻以目標(建設數據倉庫系統)為導向,有選擇地從前台業務系統中抽取相關的數據信息進行映射。 (2)設計團隊的溝通機制 邏輯數據模型的設計過程本身就是一個不斷發現問題、解決問題的過程,不可能某一個人就能夠掌握龐雜銀行業務中的點點滴滴,因此需要整個項目團隊的密切配合。每個設計人員都必應具有良好的學習溝通能力,能夠對建模工作達成共識,根據所定義的結構,將具體的業務數據映射到模型中,同時進行一些修改和校正。 (3)銀行內部IT管理的水平 LDM設計過程中很大量的工作都是對現有業務系統的分析,包括對系統架構和功能的梳理、業務規則和關鍵業務元素的提煉、系統之間的邏輯關系等,並結合樣本數據初步了解數據質量。如果沒有一套有效的管理模式和有力的技術支持,如果沒有現有業務系統的完備資料;如果沒有快速問題反饋和解決機制,LDM的建設只能是空談,因此這給銀行內部IT管理水平提出了很高的要求。 (4)模型的管理和維護 在LDM整個建設周期內還應高度重視維護和管理工作,必需有嚴格的建模技術規范做指導和約束,包括命名、描述、版本控制等。隨著時間的推移和項目建設階段和目標的變化,為了使建成的基礎數據模型具有持續的生命力,應在建設的所有階段把涉及的建模規范內容文檔化並強制執行;在人員發生變動時規定新參與人員應嚴格遵守這些規范,不能另行編制,保證前後的一致性。 總結: 盡管LDM僅僅是一個邏輯的概念,數據倉庫系統需要在邏輯數據模型的指導下,進行真正的物理實施,將把分散在不同平台、以不同方式組織的各種業務數據以及部分外部信息經過清洗和轉化,在保證數據一致性、准確性和實效性的前提下,開發各種應用,奠定實現銀行商業智能的重要基礎。 但是可以看到,通過數據倉庫系統邏輯數據模型的設計,將有利於對銀行現有業務過程的全局認識和系統把握,同時還能夠從整體上對全行使用的操作型業務系統進行回顧,從而提供改造和完善的建議,最終探索出一條符合銀行自身業務實際發展要求的分析型應用系統的道路,為數據倉庫系統的建設奠定堅實的基礎。
G. 資料庫設計過程中,對於大批量的數據如何進行資料庫優化
實例講解MYSQL資料庫的查詢優化技術
作者:佚名 文章來源:未知 點擊數:2538 更新時間:2006-1-19
資料庫系統是管理信息系統的核心,基於資料庫的聯機事務處理(OLTP)以及聯機分析處理(OLAP)是銀行、企業、政府等部門最為重要的計算機應用之一。從大多數系統的應用實例來看,查詢操作在各種資料庫操作中所佔據的比重最大,而查詢操作所基於的SELECT語句在SQL語句中又是代價最大的語句。舉例來說,如果數據的量積累到一定的程度,比如一個銀行的賬戶資料庫表信息積累到上百萬甚至上千萬條記錄,全表掃描一次往往需要數十分鍾,甚至數小時。如果採用比全表掃描更好的查詢策略,往往可以使查詢時間降為幾分鍾,由此可見查詢優化技術的重要性。
筆者在應用項目的實施中發現,許多程序員在利用一些前端資料庫開發工具(如PowerBuilder、Delphi等)開發資料庫應用程序時,只注重用戶界面的華麗,並不重視查詢語句的效率問題,導致所開發出來的應用系統效率低下,資源浪費嚴重。因此,如何設計高效合理的查詢語句就顯得非常重要。本文以應用實例為基礎,結合資料庫理論,介紹查詢優化技術在現實系統中的運用。
分析問題
許多程序員認為查詢優化是DBMS(資料庫管理系統)的任務,與程序員所編寫的SQL語句關系不大,這是錯誤的。一個好的查詢計劃往往可以使程序性能提高數十倍。查詢計劃是用戶所提交的SQL語句的集合,查詢規劃是經過優化處理之後所產生的語句集合。DBMS處理查詢計劃的過程是這樣的:在做完查詢語句的詞法、語法檢查之後,將語句提交給DBMS的查詢優化器,優化器做完代數優化和存取路徑的優化之後,由預編譯模塊對語句進行處理並生成查詢規劃,然後在合適的時間提交給系統處理執行,最後將執行結果返回給用戶。在實際的資料庫產品(如Oracle、Sybase等)的高版本中都是採用基於代價的優化方法,這種優化能根據從系統字典表所得到的信息來估計不同的查詢規劃的代價,然後選擇一個較優的規劃。雖然現在的資料庫產品在查詢優化方面已經做得越來越好,但由用戶提交的SQL語句是系統優化的基礎,很難設想一個原本糟糕的查詢計劃經過系統的優化之後會變得高效,因此用戶所寫語句的優劣至關重要。系統所做查詢優化我們暫不討論,下面重點說明改善用戶查詢計劃的解決方案。
解決問題
下面以關系資料庫系統Informix為例,介紹改善用戶查詢計劃的方法。
1.合理使用索引
索引是資料庫中重要的數據結構,它的根本目的就是為了提高查詢效率。現在大多數的資料庫產品都採用IBM最先提出的ISAM索引結構。索引的使用要恰到好處,其使用原則如下:
●在經常進行連接,但是沒有指定為外鍵的列上建立索引,而不經常連接的欄位則由優化器自動生成索引。
●在頻繁進行排序或分組(即進行group by或order by操作)的列上建立索引。
●在條件表達式中經常用到的不同值較多的列上建立檢索,在不同值少的列上不要建立索引。比如在雇員表的「性別」列上只有「男」與「女」兩個不同值,因此就無必要建立索引。如果建立索引不但不會提高查詢效率,反而會嚴重降低更新速度。
●如果待排序的列有多個,可以在這些列上建立復合索引(compound index)。
●使用系統工具。如Informix資料庫有一個tbcheck工具,可以在可疑的索引上進行檢查。在一些資料庫伺服器上,索引可能失效或者因為頻繁操作而使得讀取效率降低,如果一個使用索引的查詢不明不白地慢下來,可以試著用tbcheck工具檢查索引的完整性,必要時進行修復。另外,當資料庫表更新大量數據後,刪除並重建索引可以提高查詢速度。
2.避免或簡化排序
應當簡化或避免對大型表進行重復的排序。當能夠利用索引自動以適當的次序產生輸出時,優化器就避免了排序的步驟。以下是一些影響因素:
●索引中不包括一個或幾個待排序的列;
●group by或order by子句中列的次序與索引的次序不一樣;
●排序的列來自不同的表。
為了避免不必要的排序,就要正確地增建索引,合理地合並資料庫表(盡管有時可能影響表的規范化,但相對於效率的提高是值得的)。如果排序不可避免,那麼應當試圖簡化它,如縮小排序的列的范圍等。
3.消除對大型錶行數據的順序存取
在嵌套查詢中,對表的順序存取對查詢效率可能產生致命的影響。比如採用順序存取策略,一個嵌套3層的查詢,如果每層都查詢1000行,那麼這個查詢就要查詢10億行數據。避免這種情況的主要方法就是對連接的列進行索引。例如,兩個表:學生表(學號、姓名、年齡……)和選課表(學號、課程號、成績)。如果兩個表要做連接,就要在「學號」這個連接欄位上建立索引。
還可以使用並集來避免順序存取。盡管在所有的檢查列上都有索引,但某些形式的where子句強迫優化器使用順序存取。下面的查詢將強迫對orders表執行順序操作:
SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008
雖然在customer_num和order_num上建有索引,但是在上面的語句中優化器還是使用順序存取路徑掃描整個表。因為這個語句要檢索的是分離的行的集合,所以應該改為如下語句:
SELECT * FROM orders WHERE customer_num=104 AND order_num>1001
UNION
SELECT * FROM orders WHERE order_num=1008
這樣就能利用索引路徑處理查詢。
4.避免相關子查詢
一個列的標簽同時在主查詢和where子句中的查詢中出現,那麼很可能當主查詢中的列值改變之後,子查詢必須重新查詢一次。查詢嵌套層次越多,效率越低,因此應當盡量避免子查詢。如果子查詢不可避免,那麼要在子查詢中過濾掉盡可能多的行。
5.避免困難的正規表達式
MATCHES和LIKE關鍵字支持通配符匹配,技術上叫正規表達式。但這種匹配特別耗費時間。例如:SELECT * FROM customer WHERE zipcode LIKE 「98_ _ _」
即使在zipcode欄位上建立了索引,在這種情況下也還是採用順序掃描的方式。如果把語句改為SELECT * FROM customer WHERE zipcode >「98000」,在執行查詢時就會利用索引來查詢,顯然會大大提高速度。
另外,還要避免非開始的子串。例如語句:SELECT * FROM customer WHERE zipcode[2,3]>「80」,在where子句中採用了非開始子串,因而這個語句也不會使用索引。
6.使用臨時表加速查詢
把表的一個子集進行排序並創建臨時表,有時能加速查詢。它有助於避免多重排序操作,而且在其他方面還能簡化優化器的工作。例如:
SELECT cust.name,rcvbles.balance,……other columns
FROM cust,rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
AND cust.postcode>「98000」
ORDER BY cust.name
如果這個查詢要被執行多次而不止一次,可以把所有未付款的客戶找出來放在一個臨時文件中,並按客戶的名字進行排序:
SELECT cust.name,rcvbles.balance,……other columns
FROM cust,rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
ORDER BY cust.name
INTO TEMP cust_with_balance
然後以下面的方式在臨時表中查詢:
SELECT * FROM cust_with_balance
WHERE postcode>「98000」
臨時表中的行要比主表中的行少,而且物理順序就是所要求的順序,減少了磁碟I/O,所以查詢工作量可以得到大幅減少。
注意:臨時表創建後不會反映主表的修改。在主表中數據頻繁修改的情況下,注意不要丟失數據。
7.用排序來取代非順序存取
非順序磁碟存取是最慢的操作,表現在磁碟存取臂的來回移動。SQL語句隱藏了這一情況,使得我們在寫應用程序時很容易寫出要求存取大量非順序頁的查詢。
有些時候,用資料庫的排序能力來替代非順序的存取能改進查詢。
實例分析
下面我們舉一個製造公司的例子來說明如何進行查詢優化。製造公司資料庫中包括3個表,模式如下所示:
1.part表
零件號零件描述其他列
(part_num)(part_desc)(other column)
102,032Seageat 30G disk……
500,049Novel 10M network card……
……
2.vendor表
廠商號廠商名其他列
(vendor _num)(vendor_name) (other column)
910,257Seageat Corp……
523,045IBM Corp……
……
3.parven表
零件號廠商號零件數量
(part_num)(vendor_num)(part_amount)
102,032910,2573,450,000
234,423321,0014,000,000
……
下面的查詢將在這些表上定期運行,並產生關於所有零件數量的報表:
SELECT part_desc,vendor_name,part_amount
FROM part,vendor,parven
WHERE part.part_num=parven.part_num
AND parven.vendor_num = vendor.vendor_num
ORDER BY part.part_num
如果不建立索引,上述查詢代碼的開銷將十分巨大。為此,我們在零件號和廠商號上建立索引。索引的建立避免了在嵌套中反復掃描。關於表與索引的統計信息如下:
錶行尺寸行數量每頁行數量數據頁數量
(table)(row size)(Row count)(Rows/Pages)(Data Pages)
part15010,00025400
Vendor1501,000 2540
Parven13 15,000300 50
索引鍵尺寸每頁鍵數量頁面數量
(Indexes)(Key Size)(Keys/Page)(Leaf Pages)
part450020
Vendor45002
Parven825060
看起來是個相對簡單的3表連接,但是其查詢開銷是很大的。通過查看系統表可以看到,在part_num上和vendor_num上有簇索引,因此索引是按照物理順序存放的。parven表沒有特定的存放次序。這些表的大小說明從緩沖頁中非順序存取的成功率很小。此語句的優化查詢規劃是:首先從part中順序讀取400頁,然後再對parven表非順序存取1萬次,每次2頁(一個索引頁、一個數據頁),總計2萬個磁碟頁,最後對vendor表非順序存取1.5萬次,合3萬個磁碟頁。可以看出在這個索引好的連接上花費的磁碟存取為5.04萬次。
實際上,我們可以通過使用臨時表分3個步驟來提高查詢效率:
1.從parven表中按vendor_num的次序讀數據:
SELECT part_num,vendor_num,price
FROM parven
ORDER BY vendor_num
INTO temp pv_by_vn
這個語句順序讀parven(50頁),寫一個臨時表(50頁),並排序。假定排序的開銷為200頁,總共是300頁。
2.把臨時表和vendor表連接,把結果輸出到一個臨時表,並按part_num排序:
SELECT pv_by_vn,* vendor.vendor_num
FROM pv_by_vn,vendor
WHERE pv_by_vn.vendor_num=vendor.vendor_num
ORDER BY pv_by_vn.part_num
INTO TMP pvvn_by_pn
DROP TABLE pv_by_vn
這個查詢讀取pv_by_vn(50頁),它通過索引存取vendor表1.5萬次,但由於按vendor_num次序排列,實際上只是通過索引順序地讀vendor表(40+2=42頁),輸出的表每頁約95行,共160頁。寫並存取這些頁引發5*160=800次的讀寫,索引共讀寫892頁。
3.把輸出和part連接得到最後的結果:
SELECT pvvn_by_pn.*,part.part_desc
FROM pvvn_by_pn,part
WHERE pvvn_by_pn.part_num=part.part_num
DROP TABLE pvvn_by_pn
這樣,查詢順序地讀pvvn_by_pn(160頁),通過索引讀part表1.5萬次,由於建有索引,所以實際上進行1772次磁碟讀寫,優化比例為30∶1。筆者在Informix Dynamic
Sever上做同樣的實驗,發現在時間耗費上的優化比例為5∶1(如果增加數據量,比例可能會更大)。
小結
20%的代碼用去了80%的時間,這是程序設計中的一個著名定律,在資料庫應用程序中也同樣如此。我們的優化要抓住關鍵問題,對於資料庫應用程序來說,重點在於SQL的執行效率。查詢優化的重點環節是使得資料庫伺服器少從磁碟中讀數據以及順序讀頁而不是非順序讀頁。