解析目前數(shù)據(jù)庫查詢優(yōu)化規(guī)劃問題

時(shí)間:2022-01-26 02:50:00

導(dǎo)語:解析目前數(shù)據(jù)庫查詢優(yōu)化規(guī)劃問題一文來源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。

解析目前數(shù)據(jù)庫查詢優(yōu)化規(guī)劃問題

摘要:數(shù)據(jù)庫系統(tǒng)是管理信息系統(tǒng)的核心,是銀行、企業(yè)、政府等眾多部門最為重要的應(yīng)用。而應(yīng)用當(dāng)中,查詢操作是重中之重,并且查詢操作往往需要花費(fèi)時(shí)間和空間等資源。所以它的效率高低就很大程度上決定了數(shù)據(jù)庫的在整體效率,同時(shí)也決定了系統(tǒng)的效率。本文重點(diǎn)圍繞數(shù)據(jù)庫的查詢優(yōu)化從需求分析、設(shè)計(jì)到使用等多方面提出了技術(shù)改進(jìn)和利用。

關(guān)鍵詞:數(shù)據(jù)庫;優(yōu)化;規(guī)范;查詢

隨著數(shù)據(jù)庫技術(shù)的發(fā)展,越來越多的數(shù)據(jù)庫應(yīng)用系統(tǒng)和信息管理系統(tǒng)被開發(fā)、使用。而很多數(shù)據(jù)庫應(yīng)用系統(tǒng)和信息管理系統(tǒng)中,查詢功能的要求是必不可少的,也是所占的比例最大的。數(shù)據(jù)庫的查詢功能優(yōu)化規(guī)劃好的話,整個(gè)系統(tǒng)的效率會(huì)有很大的提高,由此可見查詢優(yōu)化規(guī)劃的重要性。要想整個(gè)數(shù)據(jù)庫的查詢得到很大程度的優(yōu)化,就必須要從需求、設(shè)計(jì)到使用都要進(jìn)行規(guī)劃和技術(shù)改進(jìn)。

一、詳細(xì)的需求分析是優(yōu)化的基礎(chǔ)

數(shù)據(jù)庫設(shè)計(jì)是從系統(tǒng)的需求出發(fā),結(jié)合軟硬件相關(guān)要求,設(shè)計(jì)合理能否符合系統(tǒng)需要功能的數(shù)據(jù)的集合。數(shù)據(jù)庫設(shè)計(jì)中最基本的是數(shù)據(jù)庫模式的設(shè)計(jì)。但是,設(shè)計(jì)一個(gè)完善的比較優(yōu)秀的數(shù)據(jù)庫系統(tǒng)往往是一個(gè)反復(fù)且周期性的過程。

二、利用規(guī)范化是優(yōu)化的關(guān)鍵

在數(shù)據(jù)庫的設(shè)計(jì)周期中,需要進(jìn)行邏輯結(jié)構(gòu)設(shè)計(jì),這個(gè)時(shí)候必須進(jìn)行關(guān)系模式的規(guī)范化來達(dá)到優(yōu)化數(shù)據(jù)庫的目的。所謂關(guān)系規(guī)范化就是按統(tǒng)一標(biāo)準(zhǔn)對(duì)關(guān)系進(jìn)行優(yōu)化,從而最大程度上能消除關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)冗余、添加、刪除和修改等操作異常以提高關(guān)系的質(zhì)量,不好的關(guān)系操作時(shí)會(huì)有3個(gè)問題:1.冗余度大;2.插入異常;3.刪除異常。

規(guī)范化理論認(rèn)為,關(guān)系中的各屬性是相互關(guān)聯(lián)的,他們互相依賴、互相制約,構(gòu)成一個(gè)結(jié)構(gòu)嚴(yán)謹(jǐn)?shù)恼w。按照屬性間相關(guān)的關(guān)系,可大概分類為函數(shù)依賴、多值依賴和連接依賴。其中按照函數(shù)依賴又可分為部分依賴、完全依賴和傳遞依賴,根據(jù)這三類函數(shù)依賴等可得到規(guī)范化等級(jí)主要有5種,即第1范式(1NF),第2范式(2NF),第3范式(3NF),BC范式(BCNF)和第4范式(4NF),滿足這些范式條件的關(guān)系模式可在不同程度上避免冗余、插入和更新異常問題。

那么如何進(jìn)行規(guī)范化呢?具體做法是:確定數(shù)據(jù)依賴,按照數(shù)據(jù)依賴的理論,逐一分析這組關(guān)系模式,確定他們屬于第幾范式,進(jìn)行模式分解,逐步消除非主屬性對(duì)碼的部分依賴和傳遞依賴。在分解過程當(dāng)中必須遵守以下2條原則:

1.無損分解原則無損分解就是在關(guān)系分解過程中,既不丟失數(shù)據(jù)也不增加數(shù)據(jù),同時(shí)還能保持原有的函數(shù)依賴。

2.相互獨(dú)立原則所謂獨(dú)立是指分解后的新關(guān)系之間相互獨(dú)立,對(duì)一個(gè)關(guān)系內(nèi)容的修改不應(yīng)該影響到另一關(guān)系。

三、規(guī)范化的收尾工作

關(guān)系分解必須從實(shí)際出發(fā),并不是范式等級(jí)越高,分解得越細(xì)就越好。若把關(guān)系分解得過于瑣碎,雖然對(duì)于消除數(shù)據(jù)冗余和更新異常等有好處,但在進(jìn)行查詢操作時(shí)往往又需要進(jìn)行鏈接,降低查詢效率。相反的若是范式等級(jí)太低,雖有利于查詢,但會(huì)造成相關(guān)數(shù)據(jù)冗余、更新異常等情況。因此我們應(yīng)該根據(jù)實(shí)際應(yīng)用進(jìn)行相關(guān)范式的設(shè)計(jì)。

四、查詢使用中的優(yōu)化技術(shù)

應(yīng)用項(xiàng)目的實(shí)施中,許多程序員在利用一些前端數(shù)據(jù)庫開發(fā)工具開發(fā)數(shù)據(jù)庫應(yīng)用程序時(shí),只注重用戶界面的華麗,并不重視查詢語句的效率問題,導(dǎo)致所開發(fā)出來的應(yīng)用系統(tǒng)效率低下,資源浪費(fèi)嚴(yán)重。因此,如何設(shè)計(jì)高效合理的查詢語句就顯得非常重要。

實(shí)際應(yīng)用中許多程序員認(rèn)為查詢優(yōu)化是DBMS的任務(wù),與程序員所編寫的SQL語句關(guān)系不大,這是錯(cuò)誤的。一個(gè)好的查詢計(jì)劃往往可以使程序性能提高數(shù)十倍。查詢計(jì)劃是用戶所提交的SQL語句的集合,查詢規(guī)劃是經(jīng)過優(yōu)化處理之后所產(chǎn)生的語句集合。在實(shí)際的數(shù)據(jù)庫產(chǎn)品的高版本中都是采用基于代價(jià)的優(yōu)化方法,這種優(yōu)化能根據(jù)從系統(tǒng)字典表所得到的信息來估計(jì)不同的查詢規(guī)劃的代價(jià),然后選擇一個(gè)較優(yōu)的規(guī)劃。雖然現(xiàn)在的數(shù)據(jù)庫產(chǎn)品在查詢優(yōu)化方面已經(jīng)做得越來越好,但由用戶提交的SQL語句是系統(tǒng)優(yōu)化的基礎(chǔ),很難設(shè)想一個(gè)原本糟糕的查詢計(jì)劃經(jīng)過系統(tǒng)的優(yōu)化之后會(huì)變得高效,因此用戶所寫語句的優(yōu)劣至關(guān)重要。下面重點(diǎn)說明改善用戶查詢計(jì)劃的常用解決方案。

1.合理使用索引

索引是數(shù)據(jù)庫中重要的數(shù)據(jù)結(jié)構(gòu),它的根本目的就是為了提高查詢效率?,F(xiàn)在大多數(shù)的數(shù)據(jù)庫產(chǎn)品都采用IBM最先提出的ISAM索引結(jié)構(gòu)。索引的使用要恰到好處,其使用原則如下:

●在經(jīng)常進(jìn)行連接,但是沒有指定為外鍵的列上建立索引,而不經(jīng)常連接的字段則由優(yōu)化器自動(dòng)生成索引。

●在頻繁進(jìn)行排序或分組的列上建立索引。

●在條件表達(dá)式中經(jīng)常用到的不同值較多的列上建立檢索,在不同值少的列上不要建立索引。比如在雇員表的“性別”列上只有“男”與“女”兩個(gè)不同值,因此就無必要建立索引。如果建立索引不但不會(huì)提高查詢效率,反而會(huì)嚴(yán)重降低更新速度。如果待排序的列有多個(gè),可以在這些列上建立復(fù)合索引(compoundindex)。

2.避免或簡化排序

應(yīng)當(dāng)簡化或避免對(duì)大型表進(jìn)行重復(fù)的排序。當(dāng)能夠利用索引自動(dòng)以適當(dāng)?shù)拇涡虍a(chǎn)生輸出時(shí),優(yōu)化器就避免了排序的步驟。

3.消除對(duì)大型表行數(shù)據(jù)的順序存取

在嵌套查詢中,對(duì)表的順序存取對(duì)查詢效率可能產(chǎn)生致命的影響。比如采用順序存取策略,一個(gè)嵌套3層的查詢,如果每層都查詢1000行,那么這個(gè)查詢就要查詢10億行數(shù)據(jù)。避免這種情況的主要方法就是對(duì)連接的列進(jìn)行索引。還可以使用并集來避免順序存取。

4.避免相關(guān)子查詢

一個(gè)列的標(biāo)簽同時(shí)在主查詢和where子句中的查詢中出現(xiàn),那么很可能當(dāng)主查詢中的列值改變之后,子查詢必須重新查詢一次。查詢嵌套層次越多,效率越低,因此應(yīng)當(dāng)盡量避免子查詢。如果子查詢不可避免,那么要在子查詢中過濾掉盡可能多的行。

5.避免困難的正規(guī)表達(dá)式

LIKE關(guān)鍵字支持通配符匹配,技術(shù)上叫正規(guī)表達(dá)式。但這種匹配特別耗費(fèi)時(shí)間。例如:SELECT*FROMcustomerWHEREzipcodeLIKE“98___”即使在zipcode字段上建立了索引,在這種情況下也還是采用順序掃描的方式。如果把語句改為SELECT*FROMcustomerWHEREzipcode>“98000”,在執(zhí)行查詢時(shí)就會(huì)利用索引來查詢,顯然會(huì)大大提高速度。

6.使用臨時(shí)表加速查詢

把表的一個(gè)子集進(jìn)行排序并創(chuàng)建臨時(shí)表,有時(shí)能加速查詢。它有助于避免多重排序操作,而且在其他方面還能簡化優(yōu)化器的工作。

7.盡量不要使用or使用or會(huì)引起全表掃描,將大大降低查詢效率。

8.字段提取要按照“需多少、提多少”的原則

避免“select*”,盡量使用“select字段1,字段2,字段3........”。實(shí)踐證明:每少提取一個(gè)字段,數(shù)據(jù)的提取速度就會(huì)有相應(yīng)的提升。提升的速度還要看您舍棄的字段的大小來判斷。

五、結(jié)語

數(shù)據(jù)庫查詢優(yōu)化是一項(xiàng)綜合性工作,受到各種各樣因素的制約,有些要求往往是彼此矛盾的。因此設(shè)計(jì)者必須根據(jù)實(shí)際情況,綜合應(yīng)用上述技術(shù),在基本合理的總體設(shè)計(jì)的基礎(chǔ)上,對(duì)數(shù)據(jù)庫查詢做一些優(yōu)化調(diào)整,力求最大限度地提高操作效率,減少異常等,滿足用戶各種各樣的要求,實(shí)現(xiàn)數(shù)據(jù)庫的查詢優(yōu)化設(shè)計(jì)。

參考文獻(xiàn):

[1]薩師煊.數(shù)據(jù)庫系統(tǒng)概論[M].北京:高等教育出版社,2000

[2]王能斌.數(shù)據(jù)庫系統(tǒng)原理[M].北京:電子工業(yè)出版社,2000

[3]李芳.關(guān)系數(shù)據(jù)庫設(shè)計(jì)的優(yōu)化技術(shù)[J].現(xiàn)代電子技術(shù),2003,9

[4]袁長河.SybaseSQLserver性能優(yōu)化技術(shù)初探[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2000,1