使用Oracle資料庫進行企業開發 三

2021-09-22 08:36:57 字數 4035 閱讀 2488

三、sql調優

資料庫優化主要是dba的工作,而且調優分成很多步驟,根據經驗來看,首先需要調整的就是程式設計師寫的sql語句,一句不良的sql,能致使整個oracle宕機,這並不是誇張的說法,當然也不要根據這個來說明oracle多麼脆弱,首先應該看的是sql如何優化。

其實在開發環境或測試環境下,有時很難發現真正的效能問題,因為開發環境的資料量可能比生產環境的實際資料量要小很多,即便出現很多的fts,效率也是可以接受的,這種工作方式,就給調優帶來了一定的難度,所以一般都是上線後,由生產系統反饋出了問題,然後程式設計師再想辦法模擬生產環境,從而使問題重現,進而將之解決。

對於比較好的測試方案中一般包括壓力測試,其中也包括大資料量測試,可以自己模擬一些大的資料量,然後進行測試,這是比較好的方式。對於調優的方式,首先是使用sql的執行計畫來檢視是否使用了正確的索引,如上已經討論過,如果確認索引有問題,請新建索引從而解決問題,如果已經建立了索引,但是發現索引沒有用上,那麼可能是表分析不到位,需要重新進行表分析,可以申請dba進行協助。如果以上兩者都做了,還是不能正確利用索引,那麼就需要使用hint功能,強制使用索引,此功能比較複雜,不再多說,在實際工作中,可向dba諮詢。

有時sql是存在於整個系統中的,很難單獨提取出來,這時有幾個辦法:

1.在程式中加斷點,當程式執行到sql處,先把sql取出來,自己去分析

2.在程式中加輸出,把sql直接輸出到外部檔案,然後再慢慢分析

3.向dba申請,開啟oracle的trace功能,記錄所有的sql語句。不過這種方式會使整個系統的效率降低不少,使用之後,一定記得把引數調整回去。 程式設計師所能涉及到的就是sql調優,其它更深入的系統調優,可以不做過多的考慮。

四、多資料庫協作

這裡所說的資料庫,實際上指的是oracle中常說的「例項」,這些例項可以位於同一臺機器上,也可以位於不同的機器上。有時「多資料庫」還可以指在同乙個例項中不同的使用者中,如果所有的內容均在乙個例項中進行,只是分屬於不同的使用者,這種處理方式最簡單,只需要在引用的表名前加上其它使用者的名字即可,比如 user1想使用user2中的表,可以寫成:select * from user2.table_name。

如果覺得在應用程式中每次都要帶著其它的使用者名稱不方便或有其它原因,可以有兩種方式來替換:

1.檢視

create or replace view table_name as select * from user2.table_name;

這種方式,直接在user1中引用檢視,就可以實現對user2中表的引用

2.同義詞

create synonym table_name for user2.table_name;

這種方式相對於檢視來說更加專業,一般都是按這種方式來處理,在user1中使用table_name的時候,自動根據同義詞定義轉到相應的位置。

與檢視的另乙個區別是,同義詞可以對任何的object進行對映,而不僅侷限於表,比如package等。所以應該多用這種方式來替代檢視的方式。

如果多資料庫不在同乙個例項中,則需要使用dblink進行連線,可以參考create database link的寫法,在一般的應用中,很少用到這種方式。

以上的使用有乙個預設前提就是user2允許user1來使用它的資源,如果沒有許可權,user1是不能操作user2的表的,這時就涉及到乙個賦權的操作,賦權必須由user2親自來處理,其它具有dba角色的使用者也不可以代勞。

賦權使用如下語句:grant select on table_name to user1;

有一點需要特別注意,如果user1具有dba角色,在沒有顯示賦權的情況下,他也可以直接使用user2中的表,但是如果在user1中寫儲存過程,在函式中引用user2中的表,必須顯示的賦權,這點是非常容易引起混淆的地方,需要提醒特別注意。

五、錯誤排查

程式寫多了,難免會出錯,資料庫也不例外。出錯並不可怕,只要及時找到出錯的解決方案就可以了。

在上面已經提起過記錄sql語句的一些做法,當把sql執行的時候,資料庫一般會報乙個ora錯誤,如ora-00600這樣的方式,並給出乙個簡短的說明,但是說明的文字都不會太細緻。如何根據這個蛛絲馬跡找到問題的所在呢?如果你的資料庫伺服器位於unix或linux伺服器上,你需要telnet登入伺服器,系統提供了乙個oerr的命令列工具,可以方便的查出錯誤的具體含義,如 oerr ora 600這種樣式。如果你的資料庫伺服器位於windows伺服器,那麼沒有這樣的工具,只能檢視幫助文件了。 

雖然用oerr工具可以看到錯誤的詳情,但是經過一段時間的試用後就會發現,其實它所給出的提示也是相對簡單的,有些甚至什麼都看不出來,那麼這時就會用到其它的解決辦法:

1.google等搜尋引擎

這是乙個非常經濟實惠的解決方案,並且根據搜尋引擎的強大功能,可以找到很多的相關資料,說不定看到有人和你有同樣的問題,***跟著就是解決辦法。 

2.metalink

這是oracle官方提供的乙個收費的**,使用者可以在上面查詢資料(海量資料,資訊量非常大),如果實在查不到解決辦法,還可以提問,會有oracle的專家負責來解答。這是解決oracle問題權威的地方,但是缺點就是如果你沒有賬號的話,就等於零了。

對於有些實在看不懂的錯誤提示,也可以請dba協助,因為有些錯誤提示表面上看是sql的問題,但是實際上可能是資料庫本身引起的。如果你從錯誤資訊中可以直接看到「不能擴充套件」、「表空間已滿」或「回滾段過舊」等顯然和sql無關的錯誤,就可以直接去尋求dba的幫助了。

如果您正在部署乙個bs結構的系統,很有可能會發現,使用客戶端工具連線的時候,與伺服器連線一切正常,可就是web程式無法連線資料庫,並且報告    「oci需要8.1.7或以上版本」這個錯誤。這是個比較「曖昧」的錯誤資訊,很顯然我們現在所裝的客戶端都滿足它的要求,那到底是**的問題呢?問題就在於需要給oracle的ora92目錄賦乙個許可權,如下圖:

如果你嘗試做這個授權的時候,你會發現,這個使用者已經存在,並且已經授權成功!但是為什麼還不行呢?這裡需要乙個技巧,先把「讀取和執行」這個對勾去掉,再選中,然後「確定」,也就是重新做一次賦權,就可以了。根據機器的效能,可能要稍等幾秒鐘或幾分鐘。

經過上面的折騰一般就行了。如果還不能正常訪問,那麼請重新啟動web伺服器(不是資料庫伺服器),這個問題肯定就能解決了。

對於oracle10g,沒有這個目錄,我的做法就是把oracle整個安裝目錄全做一下這個授權,就沒有問題了。

六、字符集問題

如果資料庫伺服器是裝在中文環境下,客戶端也是在中文環境下執行,那麼這一部分基本就不用看了。但是如果安裝情況比較複雜,特別是伺服器需要支援多語言及多字符集的時候,客戶端如何配合就成了乙個問題。

要想知道客戶端怎麼配置,就需要知道伺服器端是按什麼標準來安排的,可以通過以下sql來查詢:

select * from database_properties

其中nls_characterset指的就是伺服器端的字符集,比如伺服器上查出來的結果是zhs16gbk,那麼客戶端就需要按這個標準來配置。對於我們開發人員來說,客戶端一般是windows平台,這個配置需要在登錄檔中修改,登錄檔的路徑為:我的電腦\hkey_local_machine\software\oracle\home0\nls_lang

比如我的機器這個鍵值就是simplified chinese_china.zhs16gbk(注意保留空格),表示簡體中文的中文字符集。從字符集上看,目前伺服器與客戶端是匹配的,字符集匹配,查詢出來的內容就不會是亂碼了,否則你將看到很多不願意看到的文字。

一般為了實現多語言支援,字符集都設成utf8,這樣可以支援多種文字了。如果伺服器端與客戶端字符集不一致,一般會出問題,但是問題主要都在顯示上面,不會對系統有太多的影響,比如俄羅斯錄入了當地語言的名字,在中文系統下有可能就顯示不出來。

oracle一共支援多少的字符集呢,我沒有數過,如果zhs16gbk不行,換utf8試一下,說不定就行了。也有個例外,早期的oracle有些版本只支援西歐字符集,那是乙個單位元組的字符集,位元組的高位是空的。這個字符集與zhs16gbk是不相容的,這時就要把客戶端同樣設成西歐字符集才可以。字符集之間有包容關係,只要符合這個包容關係,兩端設的不一樣也沒有關係,比如zhs16gbk和utf8之間就是包容的。

好了,說了這麼多,都是我在實際工作中的一些感受,希望對大家有益,也希望大家都能成為真正的高手。

使用Oracle資料庫進行企業開發 一

開發人員與dba是兩個不同的角色,在實際工作中,兩個角色可以互相幫助,互通有無,共同做好專案。但是實際上,開發人員需要一定的oracle基礎知識,這樣才可以做出更好更專業的應用程式。對於oracle系統架構等和開發關係不太大的知識,並不在本文討論範圍之內,本文僅針對部分開發人員需要了解的方面展開討論...

Oracle資料庫使用ODU進行資料恢復時的場景

由於odu命令比較多,特別是關鍵的unload命令比較複雜,本文將簡單介紹幾種場景下使用odu進行資料恢復時,使用的命令序列。場景1.資料庫不能啟動,但是system表空間中的資料字典是完整的。生成資料字典 unload dict 列出使用者 list user 列出使用者下的所有表 list ta...

JMeter對Oracle資料庫進行壓力測試

步驟 1 複製oracle的jdbc驅動jar包檔案 ojdbc14.jar 到jmeter的lib目錄下。2 執行jmeter.bat 3 建立執行緒組 右鍵測試計畫 新增 threads 執行緒組 4 建立jdbc connection configuration 右擊執行緒組 新增 配置原件 ...