ibatis 繫結變數 sql硬軟解析
阿新 • • 發佈:2019-02-14
關於避免sql的硬解析:
where id in
<iterate property="allmxid" open="(" close=")" conjunction=",">
#allmxid[]#
</iterate>
3.儲存過程中,我們平時那種寫法算繫結變數,不用特意寫成execute immediate的動態sql形式(參考地址http://www.itpub.net/thread-994690-1-1.html)。
4.要查sql是否是硬解析,可以通過sql查詢,寫的語句裡面是否變數都是用 :1 :2 :3等等代替的,正確的sql應該所有的變數都用:1這種來代替,要不然就是硬解析sql需要改:
select * from V$SQLAREA --where sql_text like'..'
5.要想知道上面查詢出的語句中,佔位符 :1 :2 :3的具體值(需要從上面語句記錄sql_id),可以通過下面sql來查詢,但是此值是根據sql的執行時刻改變的:
select * from V$SQL_BIND_CAPTURE where sql_id='7sb5h8cqn826p'
例如,通過 4 中 查詢出來的sql可以看到下面兩個紅框中, where id in 裡面 兩個不一樣,這是2個sql,需要解析2次,實際正確的應該是這樣的(只用解析一次,其他的來的同類sql只是把佔位符替換):
圖中,打勾的2個sql,會因為 where id in 中 id的個數不同,in中內容生成不同個數的佔位符,但是相對於圖中上面兩個打叉的sql(每一個sql,就是一個sql,無法和其它同類sql共用)來說,已經是很少的硬解析了。
1.ibatis中,所有的 ##都是繫結變數,所有的$$都不算繫結變數,所以儘量避免使用$$。
但是對於In,$$中傳入的值,不被看成一個整體,此在In條件中可以順利使用只是不是繫結變數如:1 :2 :3 :4這種語句;
如果in的值是##傳入的,則in查不到任何資料因為##裡面的東西被看成一個整體。
where id in
<iterate property="allmxid" open="(" close=")" conjunction=",">
#allmxid[]#
</iterate>
3.儲存過程中,我們平時那種寫法算繫結變數,不用特意寫成execute immediate的動態sql形式(參考地址http://www.itpub.net/thread-994690-1-1.html)。
4.要查sql是否是硬解析,可以通過sql查詢,寫的語句裡面是否變數都是用 :1 :2 :3等等代替的,正確的sql應該所有的變數都用:1這種來代替,要不然就是硬解析sql需要改:
select * from V$SQLAREA --where sql_text like'..'
5.要想知道上面查詢出的語句中,佔位符 :1 :2 :3的具體值(需要從上面語句記錄sql_id),可以通過下面sql來查詢,但是此值是根據sql的執行時刻改變的:
select * from V$SQL_BIND_CAPTURE where sql_id='7sb5h8cqn826p'
例如,通過 4 中 查詢出來的sql可以看到下面兩個紅框中, where id in 裡面 兩個不一樣,這是2個sql,需要解析2次,實際正確的應該是這樣的(只用解析一次,其他的來的同類sql只是把佔位符替換):
圖中,打勾的2個sql,會因為 where id in 中 id的個數不同,in中內容生成不同個數的佔位符,但是相對於圖中上面兩個打叉的sql(每一個sql,就是一個sql,無法和其它同類sql共用)來說,已經是很少的硬解析了。