oracle只有當where子句中所有條件都使用"=:"才認為是使用繫結變數麼?

secooler發表於2007-12-12
oracle只有當where子句中所有條件都使用"=:"才認為是使用繫結變數麼?

select col1,col2,col3,col4,col5
from tab1
where col1='1'
and col2 in ('000','001','003','004','005')
and col3 =:v1
/

在使用v$sqlarea中類似上面的語句出現了1萬多次,應該能確認這樣的語句是沒有很好使用繫結變數吧。
我的疑問:
1.如果條件一和條件二的內容就是這樣固定的,沒有變化,只是第三個條件使用了"=:"形式,是不是oracle認為這樣的SQL不能算是使用繫結變數,不會在shared pool中進行快取?
2.是不是在where子句中每個條件都要是"=:"形式才可以?感覺oracle有點傻的說。
3.好多SQL語句都是透過眾多服務拼湊出來的,可能不全是"=:"形式,那豈不是都修改?大家有遇到這樣類似的問題麼。
4.大家在處理這些沒有很好使用繫結變數問題的時候都有哪些可行的方案呢。
5.例如就是是上面的結構,怎麼寫才能讓oracle認為這個要被反覆的使用,在shared pool中多停留呢。
6.對於or和in的條件子句應該如何調整呢。

關於繫結變數的理解還有待提高,還請朋友們多多幫助。


===============================================================

在各位老大的提示下,我終於明白我所提的問題描述和理解上有問題。

我使用的查詢語句是:

select substb(sql_text,1,120),count(1)
from v$sqlarea
group by substb(sql_text,1,120)
having count(1)>400
order by count(1) desc
/

然後使用的v$sqltext_with_newlines查詢到其中一個hash對應的SQL。
實際上對應的SQL有很多,我所寫的結構只是其中的一個,在我全部列選所有SQL語句後,其後面的結構是不一樣的,都是太長的SQL語句擾亂了我的思維(其實是水平有待提高)。在我把 substb(sql_text,1,120) 放大到 substb(sql_text,1,450) 後發現了一個問題,在450之後有好多like ***%'(***代表不同的值)結構的條件,所以SQL的樣子不相同,當然hash_value都不一樣了

類似結構是:
select col1,col2,col3,col4,col5
from tab1
where col1='1'
and col2 in ('000','001','003','004','005')
and col3 =:v1
and col4 like '***%'    ------------沒有取出全部的SQL內容
/

問題提的不正確,請大家原諒,
目前發現了這些SQL語句的問題,應該將那些like後面的條件讓應用人員進行調整。

但是還有一個問題:
如果結構就是
select col1,col2,col3,col4,col5
from tab1
where
col1='1'
and col2 in ('000','001','003','004','005')
and col3 =:v1
/
其中的條件
col1='1'
and col2 in ('000','001','003','004','005')
是固定不變的,沒有寫成"=:"的形式,在v$sqlarea中是不是應該只是出現一次,在這種情況下,這樣的語句會被重用麼?
換一種說法:是不是在v$sqlarea上取到的次數為1的那些SQL均會被ORACLE重用?
(個人認為是可以的)

有專門介紹ORACLE處理繫結變數機制方面的資料麼。這方面還真需要好好學習學習。

[ 本帖最後由 secooler 於 2007-12-13 17:44 編輯 ]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-555639/,如需轉載,請註明出處,否則將追究法律責任。

相關文章