OracleSQL調(diào)優(yōu)的作用是什么?
以下的文章主要是講述在使用Oracle數(shù)據(jù)庫進(jìn)行相關(guān)的企業(yè)開我們所要用到的相關(guān)的項(xiàng)目,其中包括OracleSQL調(diào)優(yōu),還有相關(guān)的多數(shù)據(jù)庫協(xié)作的相關(guān)內(nèi)容的描述,以下就是相關(guān)內(nèi)容的具體介紹。
OracleSQL調(diào)優(yōu)
數(shù)據(jù)庫優(yōu)化主要是DBA的工作,而且調(diào)優(yōu)分成很多步驟,根據(jù)經(jīng)驗(yàn)來看,首先需要調(diào)整的就是程序員寫的SQL語句,一句不良的SQL,能致使整個(gè)Oracle宕機(jī),這并不是夸張的說法,當(dāng)然也不要根據(jù)這個(gè)來說明Oracle多么脆弱,首先應(yīng)該看的是OracleSQL如何優(yōu)化。
其實(shí)在開發(fā)環(huán)境或測(cè)試環(huán)境下,有時(shí)很難發(fā)現(xiàn)真正的性能問題,因?yàn)殚_發(fā)環(huán)境的數(shù)據(jù)量可能比生產(chǎn)環(huán)境的實(shí)際數(shù)據(jù)量要小很多,即便出現(xiàn)很多的FTS,效率也是可以接受的,這種工作方式,就給調(diào)優(yōu)帶來了一定的難度,所以一般都是上線后,由生產(chǎn)系統(tǒng)反饋出了問題,然后程序員再想辦法模擬生產(chǎn)環(huán)境,從而使問題重現(xiàn),進(jìn)而將之解決。
對(duì)于比較好的測(cè)試方案中一般包括壓力測(cè)試,其中也包括大數(shù)據(jù)量測(cè)試,可以自己模擬一些大的數(shù)據(jù)量,然后進(jìn)行測(cè)試,這是比較好的方式。對(duì)于調(diào)優(yōu)的方式,首先是使用SQL的執(zhí)行計(jì)劃來查看是否使用了正確的索引,如上已經(jīng)討論過,如果確認(rèn)索引有問題。
請(qǐng)新建索引從而解決問題,如果已經(jīng)建立了索引,但是發(fā)現(xiàn)索引沒有用上,那么可能是表分析不到位,需要重新進(jìn)行表分析,可以申請(qǐng)DBA進(jìn)行協(xié)助。如果以上兩者都做了,還是不能正確利用索引,那么就需要使用hint功能,強(qiáng)制使用索引,此功能比較復(fù)雜,不再多說,在實(shí)際工作中,可向DBA咨詢。
有時(shí)SQL是存在于整個(gè)系統(tǒng)中的,很難單獨(dú)提取出來,這時(shí)有幾個(gè)辦法:
1.在程序中加斷點(diǎn),當(dāng)程序運(yùn)行到SQL處,先把OracleSQL取出來,自己去分析
2.在程序中加輸出,把SQL直接輸出到外部文件,然后再慢慢分析
3.向DBA申請(qǐng),打開Oracle的Trace功能,記錄所有的SQL語句。不過這種方式會(huì)使整個(gè)系統(tǒng)的效率降低不少,使用之后,一定記得把參數(shù)調(diào)整回去。程序員所能涉及到的就是SQL調(diào)優(yōu),其它更深入的系統(tǒng)調(diào)優(yōu),可以不做過多的考慮。
多數(shù)據(jù)庫協(xié)作
這里所說的數(shù)據(jù)庫,實(shí)際上指的是Oracle中常說的“實(shí)例”,這些實(shí)例可以位于同一臺(tái)機(jī)器上,也可以位于不同的機(jī)器上。有時(shí)“多數(shù)據(jù)庫”還可以指在同一個(gè)實(shí)例中不同的用戶中,如果所有的內(nèi)容均在一個(gè)實(shí)例中進(jìn)行,只是分屬于不同的用戶,這種處理方式最簡單,只需要在引用的表名前加上其它用戶的名字即可,比如 user1想使用user2中的表,可以寫成:
- select * from user2.table_name
如果覺得在應(yīng)用程序中每次都要帶著其它的用戶名不方便或有其它原因,可以有兩種方式來替換:
1.視圖
- Create or replace view table_name as select * from user2.table_name;
這種方式,直接在user1中引用視圖,就可以實(shí)現(xiàn)對(duì)user2中表的引用
2.同義詞
- Create synonym table_name for user2.table_name;
這種方式相對(duì)于視圖來說更加專業(yè),一般都是按這種方式來處理,在user1中使用table_name的時(shí)候,自動(dòng)根據(jù)同義詞定義轉(zhuǎn)到相應(yīng)的位置。
與視圖的另一個(gè)區(qū)別是,同義詞可以對(duì)任何的object進(jìn)行映射,而不僅局限于表,比如package等。所以應(yīng)該多用這種方式來替代視圖的方式。
如果多數(shù)據(jù)庫不在同一個(gè)實(shí)例中,則需要使用DBLINK進(jìn)行連接,可以參考create database link的寫法,在一般的應(yīng)用中,很少用到這種方式。
以上的使用有一個(gè)默認(rèn)前提就是user2允許user1來使用它的資源,如果沒有權(quán)限,user1是不能操作user2的表的,這時(shí)就涉及到一個(gè)賦權(quán)的操作,賦權(quán)必須由user2親自來處理,其它具有DBA角色的用戶也不可以代勞。
賦權(quán)使用如下語句:
- grant select on table_name to user1;
有一點(diǎn)需要特別注意,如果user1具有DBA角色,在沒有顯示賦權(quán)的情況下,他也可以直接使用user2中的表,但是如果在user1中寫存儲(chǔ)過程,在函數(shù)中引用user2中的表,必須顯示的賦權(quán),這點(diǎn)是非常容易引起混淆的地方,需要提醒特別注意。
【編輯推薦】
- Oracle遠(yuǎn)程復(fù)制和異地容災(zāi)的3種解決方案介紹
- Oracle數(shù)據(jù)庫保持其優(yōu)良性的手段有哪些
- 九大Oracle性能優(yōu)化基本方法詳解
- Oracle數(shù)據(jù)庫的四種實(shí)用性很強(qiáng)的啟動(dòng)方式
- Oracle 11g中最具有獨(dú)特點(diǎn)的5大特點(diǎn)