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

來源:互聯網
上載者:User
    三、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之間就是包容的。
    好了,說了這麼多,都是我在實際工作中的一些感受,希望對大家有益,也希望大家都能成為真正的高手。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.