檢查 SQL 中不合理的語句 |
|
digitraveler
初階會員 發表:89 回覆:91 積分:46 註冊:2005-06-01 發送簡訊給我 |
大家參考參考
http://www.javaeye.com/topic/159 ■ 其中有提到 : 下面是查詢 shared pool 中佔用記憶體超過 100K 的 sql 語句 : select sql_text ,sharable_mem from v$sql where sharable_mem > '100000' order by sharable_mem ; 這個sql可以非常有效的檢查出Oracle shared pool中那些嚴重佔用記憶體的sql,根據我的經驗,絕大多數有問題的sql語句都會在這裏留下痕跡,通過在這裏找出有問題的sql語句並進行修改,再反復運行這個sql腳本,直到所以有問題的sql都處理完畢,這就是對Oracle資料庫在sql上面的最好的優化,可以保證不會因為程式師的sql語句問題導致Oracle資料庫的性能問題。 由於程式師的sql語句寫的非常不合理,導致Oracle資料庫查詢速度緩慢,嚴重的情況會導致資料庫的故障。 舉個例子,我以前就遇到過Oracle資料庫定期(一周左右)出現 ORA-4031錯誤(shared pool記憶體不夠,無法連接Oracle資料庫),此時資料庫已經無法再使用了。必須關閉重起,來釋放那些占在shared pool裏面無法釋放的物件。 所以對於一個Oracle DBA來說,需要定期的檢查shared pool中的sql語句佔用的記憶體空間,對於嚴重佔用shared pool,無法釋放的sql語句,必須要求程式師修改或優化sql語句。 |
daniel
一般會員 發表:12 回覆:20 積分:16 註冊:2002-06-03 發送簡訊給我 |
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
|
chaoyen
一般會員 發表:1 回覆:3 積分:0 註冊:2007-06-07 發送簡訊給我 |
其實會造share pool暴增的原因大部分是不良的sql語法所造成
在這裡建議一下大家良好的sql 寫法 也就一個重點 Bind variable. 何謂bind variable也是是說綁定變數 我們看一下這個sql 1.select * from table where a ='AAA' 2.select * from table where a:= col1 col1為變數 這樣sql在oracle是把它看成完全不一樣的 因為 如果你的程式譬如說 不綁定變數的話 每一條sql語句都會被oracle看成不一樣的如以下 select * from tablea where a='AAA'; select * from tablea where a='BBB'; 如果你用綁定變數的話 ORACLE就會看誠一樣的喔 既可增加性能又省MEMORY 大家可以試看看 哈哈 SELECT * FROM TABLE WHERE A:=SN SN:='AAA' SN='BBB' |
daniel
一般會員 發表:12 回覆:20 積分:16 註冊:2002-06-03 發送簡訊給我 |
綁定變數的做法我同意 ,確實應用系統的執行效率關鍵在於後端資料庫處理,我的人員一年多前在大陸廠導入自行開發的應用系統,
前一陣子時常來電反應系統速度超慢,Client畫面常卡住,甚至得server重啟,這趟到大陸進行了解,把幾個關鍵的程式的SQL語句調校後, 速度快了幾十倍,明顯改善了許多.. oracle還有一個現象,但我不知原因,就是多個table join起來查詢時,from子句內的tables(主檔與交易檔)順序影響速度很大, 例 from 客戶主檔, 庫存主檔, 交易明細檔 where... 與 from 交易明細檔, 客戶主檔, 庫存主檔 where ... 資料量大時前者速度快很多. 關於share spool如果Sql語句能用綁定變數最好,但是我有一個大問題,在delphi 3-tier架構,我的client端的所有clientdataset 都是連到同一個AP server端的同一個datasetProvider(master-detail除外),動態產生updateSQL的SQLStrings.. client端都透過clientDataset.commandText下sql指令,即時同一個程式,不同的user一樣會產生不同的where子句.造成share spool的負担. 雖然delphi的的sql子句也有參數,但是我想也是將參數值轉成sql的常式再pass給server,無法綁定變數, 不知各位有没有什麼方法讓應用程式的也能以綁定變數的方式pass sql指令給server |
digitraveler
初階會員 發表:89 回覆:91 積分:46 註冊:2005-06-01 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |