線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4819
推到 Plurk!
推到 Facebook!

檢查 SQL 中不合理的語句

 
digitraveler
初階會員


發表:89
回覆:91
積分:46
註冊:2005-06-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-06-01 23:23:39 IP:122.123.xxx.xxx 訂閱
大家參考參考
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-06-02 13:35:50 IP:221.224.xxx.xxx 訂閱
感謝 Digitraveler
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-06-02 22:33:42 IP:220.137.xxx.xxx 未訂閱
好文,研讀ing~~~~ 

謝謝分享!
chaoyen
一般會員


發表:1
回覆:3
積分:0
註冊:2007-06-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-06-07 13:41:40 IP:59.124.xxx.xxx 訂閱
其實會造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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-06-07 22:08:30 IP:221.224.xxx.xxx 訂閱
綁定變數的做法我同意 ,確實應用系統的執行效率關鍵在於後端資料庫處理,我的人員一年多前在大陸廠導入自行開發的應用系統,
前一陣子時常來電反應系統速度超慢,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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-06-22 20:47:55 IP:220.228.xxx.xxx 訂閱
有沒有想過用 store procedure ??
把共同的 ruting 的放在 server 執行

系統時間:2024-04-27 10:13:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!