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